@clr/angular 18.0.0-beta.1 → 18.0.0-beta.2

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 (76) hide show
  1. package/fesm2022/clr-angular-button.mjs +2 -2
  2. package/fesm2022/clr-angular-button.mjs.map +1 -1
  3. package/fesm2022/clr-angular-data-datagrid.mjs +12 -26
  4. package/fesm2022/clr-angular-data-datagrid.mjs.map +1 -1
  5. package/fesm2022/clr-angular-data-tree-view.mjs +2 -2
  6. package/fesm2022/clr-angular-data-tree-view.mjs.map +1 -1
  7. package/fesm2022/clr-angular-data.mjs +13 -27
  8. package/fesm2022/clr-angular-data.mjs.map +1 -1
  9. package/fesm2022/clr-angular-emphasis-alert.mjs +2 -2
  10. package/fesm2022/clr-angular-emphasis-alert.mjs.map +1 -1
  11. package/fesm2022/clr-angular-emphasis.mjs +2 -2
  12. package/fesm2022/clr-angular-emphasis.mjs.map +1 -1
  13. package/fesm2022/clr-angular-forms-checkbox.mjs +13 -44
  14. package/fesm2022/clr-angular-forms-checkbox.mjs.map +1 -1
  15. package/fesm2022/clr-angular-forms-combobox.mjs +94 -61
  16. package/fesm2022/clr-angular-forms-combobox.mjs.map +1 -1
  17. package/fesm2022/clr-angular-forms-common.mjs +61 -58
  18. package/fesm2022/clr-angular-forms-common.mjs.map +1 -1
  19. package/fesm2022/clr-angular-forms-datalist.mjs +2 -14
  20. package/fesm2022/clr-angular-forms-datalist.mjs.map +1 -1
  21. package/fesm2022/clr-angular-forms-datepicker.mjs +16 -24
  22. package/fesm2022/clr-angular-forms-datepicker.mjs.map +1 -1
  23. package/fesm2022/clr-angular-forms-file-input.mjs +72 -55
  24. package/fesm2022/clr-angular-forms-file-input.mjs.map +1 -1
  25. package/fesm2022/clr-angular-forms-input.mjs +4 -18
  26. package/fesm2022/clr-angular-forms-input.mjs.map +1 -1
  27. package/fesm2022/clr-angular-forms-number-input.mjs +2 -14
  28. package/fesm2022/clr-angular-forms-number-input.mjs.map +1 -1
  29. package/fesm2022/clr-angular-forms-password.mjs +2 -14
  30. package/fesm2022/clr-angular-forms-password.mjs.map +1 -1
  31. package/fesm2022/clr-angular-forms-radio.mjs +13 -44
  32. package/fesm2022/clr-angular-forms-radio.mjs.map +1 -1
  33. package/fesm2022/clr-angular-forms-range.mjs +3 -16
  34. package/fesm2022/clr-angular-forms-range.mjs.map +1 -1
  35. package/fesm2022/clr-angular-forms-select.mjs +3 -16
  36. package/fesm2022/clr-angular-forms-select.mjs.map +1 -1
  37. package/fesm2022/clr-angular-forms-textarea.mjs +4 -17
  38. package/fesm2022/clr-angular-forms-textarea.mjs.map +1 -1
  39. package/fesm2022/clr-angular-forms.mjs +258 -358
  40. package/fesm2022/clr-angular-forms.mjs.map +1 -1
  41. package/fesm2022/clr-angular-modal.mjs +2 -2
  42. package/fesm2022/clr-angular-modal.mjs.map +1 -1
  43. package/fesm2022/clr-angular-popover-common.mjs +151 -85
  44. package/fesm2022/clr-angular-popover-common.mjs.map +1 -1
  45. package/fesm2022/clr-angular-popover-dropdown.mjs +7 -4
  46. package/fesm2022/clr-angular-popover-dropdown.mjs.map +1 -1
  47. package/fesm2022/clr-angular-popover-signpost.mjs +27 -12
  48. package/fesm2022/clr-angular-popover-signpost.mjs.map +1 -1
  49. package/fesm2022/clr-angular-popover-tooltip.mjs +4 -4
  50. package/fesm2022/clr-angular-popover-tooltip.mjs.map +1 -1
  51. package/fesm2022/clr-angular-popover.mjs +186 -102
  52. package/fesm2022/clr-angular-popover.mjs.map +1 -1
  53. package/fesm2022/clr-angular-stepper.mjs +4 -4
  54. package/fesm2022/clr-angular-stepper.mjs.map +1 -1
  55. package/fesm2022/clr-angular-utils.mjs +12 -47
  56. package/fesm2022/clr-angular-utils.mjs.map +1 -1
  57. package/fesm2022/clr-angular-wizard.mjs +19 -11
  58. package/fesm2022/clr-angular-wizard.mjs.map +1 -1
  59. package/fesm2022/clr-angular.mjs +491 -548
  60. package/fesm2022/clr-angular.mjs.map +1 -1
  61. package/package.json +2 -2
  62. package/popover/common/README.md +14 -12
  63. package/types/clr-angular-data-datagrid.d.ts +0 -10
  64. package/types/clr-angular-data.d.ts +0 -10
  65. package/types/clr-angular-forms-combobox.d.ts +11 -4
  66. package/types/clr-angular-forms-common.d.ts +9 -9
  67. package/types/clr-angular-forms-datepicker.d.ts +7 -0
  68. package/types/clr-angular-forms-file-input.d.ts +5 -2
  69. package/types/clr-angular-forms.d.ts +31 -15
  70. package/types/clr-angular-popover-common.d.ts +38 -13
  71. package/types/clr-angular-popover-dropdown.d.ts +2 -1
  72. package/types/clr-angular-popover-signpost.d.ts +14 -6
  73. package/types/clr-angular-popover.d.ts +52 -18
  74. package/types/clr-angular-utils.d.ts +4 -14
  75. package/types/clr-angular-wizard.d.ts +7 -4
  76. package/types/clr-angular.d.ts +91 -59
@@ -2,13 +2,13 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, Optional, Directive, Component, ElementRef, HostListener, ContentChild, Input, HostBinding, KeyValueDiffers, Self, ContentChildren, NgModule, InjectionToken, forwardRef, Inject, Attribute, ViewChild, PLATFORM_ID, DOCUMENT, EventEmitter, Output, LOCALE_ID, inject, TemplateRef, Injector } from '@angular/core';
3
3
  import * as i2 from 'rxjs';
4
4
  import { BehaviorSubject, Subject, tap, merge, of, ReplaySubject } from 'rxjs';
5
+ import * as i3 from '@clr/angular/icon';
6
+ import { ClarityIcons, successStandardIcon, errorStandardIcon, ClrIcon, angleIcon, windowCloseIcon, eventIcon, calendarIcon, folderOpenIcon, minusIcon, plusIcon, eyeHideIcon, eyeIcon } from '@clr/angular/icon';
5
7
  import { ClrSignpost } from '@clr/angular/popover/signpost';
6
8
  import * as i1 from '@angular/common';
7
9
  import { CommonModule, isPlatformBrowser, NgForOf, getLocaleDayNames, FormStyle, TranslationWidth, getLocaleMonthNames, getLocaleFirstDayOfWeek, getLocaleDateFormat, FormatWidth } from '@angular/common';
8
- import * as i3 from '@clr/angular/icon';
9
- import { ClarityIcons, exclamationCircleIcon, checkCircleIcon, ClrIcon, angleIcon, windowCloseIcon, eventIcon, calendarIcon, folderOpenIcon, minusIcon, plusIcon, eyeHideIcon, eyeIcon } from '@clr/angular/icon';
10
10
  import * as i2$1 from '@clr/angular/utils';
11
- import { HostWrapper, ClrHostWrappingModule, ArrowKeyDirection, normalizeKey, Keys, customFocusableItemProvider, uniqueIdFactory, ClrLoadingState, IF_ACTIVE_ID, LoadingListener, IF_ACTIVE_ID_PROVIDER, FOCUS_SERVICE_PROVIDER, ClrConditionalModule, ClrKeyFocusModule, DATEPICKER_ENABLE_BREAKPOINT, isBooleanAttributeSet, CdkTrapFocusModule, ClrCommonStringsService } from '@clr/angular/utils';
11
+ import { HostWrapper, ClrHostWrappingModule, ArrowKeyDirection, Keys, customFocusableItemProvider, uniqueIdFactory, ClrLoadingState, IF_ACTIVE_ID, LoadingListener, IF_ACTIVE_ID_PROVIDER, FOCUS_SERVICE_PROVIDER, ClrConditionalModule, ClrKeyFocusModule, DATEPICKER_ENABLE_BREAKPOINT, isBooleanAttributeSet, CdkTrapFocusModule, ClrCommonStringsService } from '@clr/angular/utils';
12
12
  import * as i1$1 from '@angular/forms';
13
13
  import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, SelectMultipleControlValueAccessor } from '@angular/forms';
14
14
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -16,7 +16,7 @@ import { switchMap, startWith, take, first, filter } from 'rxjs/operators';
16
16
  import * as i1$2 from '@clr/angular/forms/common';
17
17
  import { ClrControlLabel as ClrControlLabel$1, ControlIdService as ControlIdService$1, WrappedFormControl as WrappedFormControl$1, ClrAbstractContainer as ClrAbstractContainer$1, NgControlService as NgControlService$1, ControlClassService as ControlClassService$1, ContainerIdService as ContainerIdService$1, ClrCommonFormsModule as ClrCommonFormsModule$1, FormsFocusService as FormsFocusService$1 } from '@clr/angular/forms/common';
18
18
  import * as i1$3 from '@clr/angular/popover/common';
19
- import { POPOVER_HOST_ANCHOR, ClrPopoverPosition, ClrPopoverType, ClrPopoverHostDirective, ÇlrClrPopoverModuleNext as _lrClrPopoverModuleNext, DROPDOWN_POSITIONS } from '@clr/angular/popover/common';
19
+ import { POPOVER_HOST_ORIGIN, ClrPopoverPosition, ClrPopoverType, ClrPopoverHostDirective, ÇlrClrPopoverModuleNext as _lrClrPopoverModuleNext, DROPDOWN_POSITIONS } from '@clr/angular/popover/common';
20
20
  import * as i5 from '@clr/angular/progress/spinner';
21
21
  import { ClrSpinnerModule } from '@clr/angular/progress/spinner';
22
22
  import { ClrInputModule as ClrInputModule$1 } from '@clr/angular/forms/input';
@@ -160,16 +160,25 @@ class ClrControlError extends ClrAbstractControl {
160
160
  this.controlIdSuffix = CONTROL_SUFFIX.ERROR;
161
161
  }
162
162
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlError, deps: [{ token: ControlIdService, optional: true }, { token: ContainerIdService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
163
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrControlError, isStandalone: false, selector: "clr-control-error", host: { properties: { "class.clr-subtext": "true", "class.error": "true", "attr.id": "id" } }, usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true }); }
163
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrControlError, isStandalone: false, selector: "clr-control-error", host: { properties: { "class.clr-subtext-wrapper": "true", "attr.id": "id" } }, usesInheritance: true, ngImport: i0, template: `
164
+ <cds-icon class="clr-validate-icon" shape="error-standard" status="danger" aria-hidden="true"></cds-icon>
165
+ <span class="clr-subtext error">
166
+ <ng-content></ng-content>
167
+ </span>
168
+ `, isInline: true, dependencies: [{ kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
164
169
  }
165
170
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlError, decorators: [{
166
171
  type: Component,
167
172
  args: [{
168
173
  selector: 'clr-control-error',
169
- template: `<ng-content></ng-content>`,
174
+ template: `
175
+ <cds-icon class="clr-validate-icon" shape="error-standard" status="danger" aria-hidden="true"></cds-icon>
176
+ <span class="clr-subtext error">
177
+ <ng-content></ng-content>
178
+ </span>
179
+ `,
170
180
  host: {
171
- '[class.clr-subtext]': 'true',
172
- '[class.error]': 'true',
181
+ '[class.clr-subtext-wrapper]': 'true',
173
182
  '[attr.id]': 'id',
174
183
  },
175
184
  standalone: false,
@@ -213,6 +222,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
213
222
  type: Optional
214
223
  }] }] });
215
224
 
225
+ /*
226
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
227
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
228
+ * This software is released under MIT license.
229
+ * The full license information can be found in LICENSE in the root directory of this project.
230
+ */
231
+ class ClrControlSuccess extends ClrAbstractControl {
232
+ constructor(controlIdService, containerIdService) {
233
+ super(controlIdService, containerIdService);
234
+ this.controlIdService = controlIdService;
235
+ this.containerIdService = containerIdService;
236
+ this.controlIdSuffix = CONTROL_SUFFIX.SUCCESS;
237
+ }
238
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlSuccess, deps: [{ token: ControlIdService, optional: true }, { token: ContainerIdService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
239
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrControlSuccess, isStandalone: false, selector: "clr-control-success", host: { properties: { "class.clr-subtext-wrapper": "true", "attr.id": "id" } }, usesInheritance: true, ngImport: i0, template: `
240
+ <cds-icon class="clr-validate-icon" shape="success-standard" status="success" aria-hidden="true"></cds-icon>
241
+ <span class="clr-subtext success">
242
+ <ng-content></ng-content>
243
+ </span>
244
+ `, isInline: true, dependencies: [{ kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
245
+ }
246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlSuccess, decorators: [{
247
+ type: Component,
248
+ args: [{
249
+ selector: 'clr-control-success',
250
+ template: `
251
+ <cds-icon class="clr-validate-icon" shape="success-standard" status="success" aria-hidden="true"></cds-icon>
252
+ <span class="clr-subtext success">
253
+ <ng-content></ng-content>
254
+ </span>
255
+ `,
256
+ host: {
257
+ '[class.clr-subtext-wrapper]': 'true',
258
+ '[attr.id]': 'id',
259
+ },
260
+ standalone: false,
261
+ }]
262
+ }], ctorParameters: () => [{ type: ControlIdService, decorators: [{
263
+ type: Optional
264
+ }] }, { type: ContainerIdService, decorators: [{
265
+ type: Optional
266
+ }] }] });
267
+
216
268
  /*
217
269
  * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
218
270
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -242,10 +294,7 @@ class LayoutService {
242
294
  this.minLabelSize = 1;
243
295
  this.maxLabelSize = 12;
244
296
  this.layout = ClrFormLayout.HORIZONTAL;
245
- // This is basically a replacement for Object.values(), which IE11 and Node <9 don't support :(
246
- // String enums cannot be reverse-mapped, meaning ClrFormLayout['COMPACT'] does not return 'compact' so
247
- // this exists to deal with this little caveat to get the list of the values as an array.
248
- this.layoutValues = Object.keys(ClrFormLayout).map(key => ClrFormLayout[key]);
297
+ this.layoutValues = Object.values(ClrFormLayout);
249
298
  this._labelSize = 2;
250
299
  }
251
300
  get labelSize() {
@@ -413,40 +462,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
413
462
  args: ['click', ['$event']]
414
463
  }] } });
415
464
 
416
- /*
417
- * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
418
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
419
- * This software is released under MIT license.
420
- * The full license information can be found in LICENSE in the root directory of this project.
421
- */
422
- class ClrControlSuccess extends ClrAbstractControl {
423
- constructor(controlIdService, containerIdService) {
424
- super(controlIdService, containerIdService);
425
- this.controlIdService = controlIdService;
426
- this.containerIdService = containerIdService;
427
- this.controlIdSuffix = CONTROL_SUFFIX.SUCCESS;
428
- }
429
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlSuccess, deps: [{ token: ControlIdService, optional: true }, { token: ContainerIdService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
430
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrControlSuccess, isStandalone: false, selector: "clr-control-success", host: { properties: { "class.clr-subtext": "true", "class.success": "true", "attr.id": "id" } }, usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true }); }
431
- }
432
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlSuccess, decorators: [{
433
- type: Component,
434
- args: [{
435
- selector: 'clr-control-success',
436
- template: `<ng-content></ng-content>`,
437
- host: {
438
- '[class.clr-subtext]': 'true',
439
- '[class.success]': 'true',
440
- '[attr.id]': 'id',
441
- },
442
- standalone: false,
443
- }]
444
- }], ctorParameters: () => [{ type: ControlIdService, decorators: [{
445
- type: Optional
446
- }] }, { type: ContainerIdService, decorators: [{
447
- type: Optional
448
- }] }] });
449
-
450
465
  /*
451
466
  * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
452
467
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -643,12 +658,6 @@ class ClrControlContainer extends ClrAbstractContainer {
643
658
  <div class="clr-control-container" [ngClass]="controlClass()">
644
659
  <div class="clr-input-wrapper">
645
660
  <ng-content></ng-content>
646
- @if (showInvalid) {
647
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
648
- }
649
- @if (showValid) {
650
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
651
- }
652
661
  </div>
653
662
  @if (showHelper) {
654
663
  <ng-content select="clr-control-helper"></ng-content>
@@ -660,7 +669,7 @@ class ClrControlContainer extends ClrAbstractContainer {
660
669
  <ng-content select="clr-control-success"></ng-content>
661
670
  }
662
671
  </div>
663
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
672
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
664
673
  }
665
674
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrControlContainer, decorators: [{
666
675
  type: Component,
@@ -674,12 +683,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
674
683
  <div class="clr-control-container" [ngClass]="controlClass()">
675
684
  <div class="clr-input-wrapper">
676
685
  <ng-content></ng-content>
677
- @if (showInvalid) {
678
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
679
- }
680
- @if (showValid) {
681
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
682
- }
683
686
  </div>
684
687
  @if (showHelper) {
685
688
  <ng-content select="clr-control-helper"></ng-content>
@@ -1163,7 +1166,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1163
1166
  */
1164
1167
  class ClrCommonFormsModule {
1165
1168
  constructor() {
1166
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
1169
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
1167
1170
  }
1168
1171
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrCommonFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1169
1172
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrCommonFormsModule, declarations: [ClrControlLabel,
@@ -1421,29 +1424,14 @@ class ClrCheckboxContainer extends ClrAbstractContainer$1 {
1421
1424
  <ng-content select="clr-control-helper"></ng-content>
1422
1425
  </div>
1423
1426
  }
1424
- @if (showInvalid || showValid) {
1425
- <div class="clr-subtext-wrapper">
1426
- @if (showInvalid) {
1427
- <cds-icon
1428
- class="clr-validate-icon"
1429
- shape="exclamation-circle"
1430
- status="danger"
1431
- aria-hidden="true"
1432
- ></cds-icon>
1433
- }
1434
- @if (showValid) {
1435
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
1436
- }
1437
- @if (showInvalid) {
1438
- <ng-content select="clr-control-error"></ng-content>
1439
- }
1440
- @if (showValid) {
1441
- <ng-content select="clr-control-success"></ng-content>
1442
- }
1443
- </div>
1427
+ @if (showInvalid) {
1428
+ <ng-content select="clr-control-error"></ng-content>
1429
+ }
1430
+ @if (showValid) {
1431
+ <ng-content select="clr-control-success"></ng-content>
1444
1432
  }
1445
1433
  </div>
1446
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
1434
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
1447
1435
  }
1448
1436
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrCheckboxContainer, decorators: [{
1449
1437
  type: Component,
@@ -1461,26 +1449,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1461
1449
  <ng-content select="clr-control-helper"></ng-content>
1462
1450
  </div>
1463
1451
  }
1464
- @if (showInvalid || showValid) {
1465
- <div class="clr-subtext-wrapper">
1466
- @if (showInvalid) {
1467
- <cds-icon
1468
- class="clr-validate-icon"
1469
- shape="exclamation-circle"
1470
- status="danger"
1471
- aria-hidden="true"
1472
- ></cds-icon>
1473
- }
1474
- @if (showValid) {
1475
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
1476
- }
1477
- @if (showInvalid) {
1478
- <ng-content select="clr-control-error"></ng-content>
1479
- }
1480
- @if (showValid) {
1481
- <ng-content select="clr-control-success"></ng-content>
1482
- }
1483
- </div>
1452
+ @if (showInvalid) {
1453
+ <ng-content select="clr-control-error"></ng-content>
1454
+ }
1455
+ @if (showValid) {
1456
+ <ng-content select="clr-control-success"></ng-content>
1484
1457
  }
1485
1458
  </div>
1486
1459
  `,
@@ -1510,7 +1483,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1510
1483
  */
1511
1484
  class ClrCheckboxModule {
1512
1485
  constructor() {
1513
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
1486
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
1514
1487
  }
1515
1488
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrCheckboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1516
1489
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrCheckboxModule, declarations: [ClrCheckbox, ClrCheckboxContainer, ClrCheckboxWrapper], imports: [CommonModule, ClrIcon, ClrCommonFormsModule$1, ClrHostWrappingModule], exports: [ClrCommonFormsModule$1, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxWrapper] }); }
@@ -1578,12 +1551,6 @@ class ClrComboboxContainer extends ClrAbstractContainer$1 {
1578
1551
  }
1579
1552
  <div class="clr-control-container" [ngClass]="controlClass()" #controlContainer>
1580
1553
  <ng-content select="clr-combobox"></ng-content>
1581
- @if (showInvalid) {
1582
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
1583
- }
1584
- @if (showValid) {
1585
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
1586
- }
1587
1554
  @if (showHelper) {
1588
1555
  <ng-content select="clr-control-helper"></ng-content>
1589
1556
  }
@@ -1594,7 +1561,7 @@ class ClrComboboxContainer extends ClrAbstractContainer$1 {
1594
1561
  <ng-content select="clr-control-success"></ng-content>
1595
1562
  }
1596
1563
  </div>
1597
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
1564
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
1598
1565
  }
1599
1566
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrComboboxContainer, decorators: [{
1600
1567
  type: Component,
@@ -1607,12 +1574,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1607
1574
  }
1608
1575
  <div class="clr-control-container" [ngClass]="controlClass()" #controlContainer>
1609
1576
  <ng-content select="clr-combobox"></ng-content>
1610
- @if (showInvalid) {
1611
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
1612
- }
1613
- @if (showValid) {
1614
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
1615
- }
1616
1577
  @if (showHelper) {
1617
1578
  <ng-content select="clr-control-helper"></ng-content>
1618
1579
  }
@@ -1646,20 +1607,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1646
1607
  * This software is released under MIT license.
1647
1608
  * The full license information can be found in LICENSE in the root directory of this project.
1648
1609
  */
1649
- class MultiSelectComboboxModel {
1610
+ class ComboboxModel {
1611
+ constructor() {
1612
+ this.identityFn = (item) => item;
1613
+ }
1614
+ }
1615
+
1616
+ /*
1617
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
1618
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
1619
+ * This software is released under MIT license.
1620
+ * The full license information can be found in LICENSE in the root directory of this project.
1621
+ */
1622
+ class MultiSelectComboboxModel extends ComboboxModel {
1650
1623
  containsItem(item) {
1651
- if (this.model) {
1652
- if (this.displayField && typeof item === 'object') {
1653
- const includes = this.model.some(modelItem => {
1654
- return modelItem[this.displayField] === item[this.displayField];
1655
- });
1656
- return includes;
1657
- }
1658
- else {
1659
- return this.model.includes(item);
1660
- }
1624
+ if (!this.model) {
1625
+ return false;
1661
1626
  }
1662
- return false;
1627
+ return this.model.some(m => this.identityFn(m) === this.identityFn(item));
1663
1628
  }
1664
1629
  select(item) {
1665
1630
  this.addItem(item);
@@ -1722,7 +1687,7 @@ class MultiSelectComboboxModel {
1722
1687
  if (this.model === null || this.model === undefined) {
1723
1688
  return;
1724
1689
  }
1725
- const index = this.model.indexOf(item);
1690
+ const index = this.model.findIndex(m => this.identityFn(m) === this.identityFn(item));
1726
1691
  if (index > -1) {
1727
1692
  this.model.splice(index, 1);
1728
1693
  }
@@ -1739,9 +1704,9 @@ class MultiSelectComboboxModel {
1739
1704
  * This software is released under MIT license.
1740
1705
  * The full license information can be found in LICENSE in the root directory of this project.
1741
1706
  */
1742
- class SingleSelectComboboxModel {
1707
+ class SingleSelectComboboxModel extends ComboboxModel {
1743
1708
  containsItem(item) {
1744
- return this.model === item;
1709
+ return this.model !== null && this.identityFn(this.model) === this.identityFn(item);
1745
1710
  }
1746
1711
  select(item) {
1747
1712
  this.model = item;
@@ -1835,6 +1800,7 @@ class OptionSelectionService {
1835
1800
  this._currentInput = '';
1836
1801
  this._inputChanged = new BehaviorSubject('');
1837
1802
  this._selectionChanged = new ReplaySubject(1);
1803
+ this._identityFn = (item) => item;
1838
1804
  this.inputChanged = this._inputChanged.asObservable();
1839
1805
  }
1840
1806
  get displayField() {
@@ -1865,6 +1831,15 @@ class OptionSelectionService {
1865
1831
  get multiselectable() {
1866
1832
  return this.selectionModel instanceof MultiSelectComboboxModel;
1867
1833
  }
1834
+ get identityFn() {
1835
+ return this._identityFn;
1836
+ }
1837
+ set identityFn(value) {
1838
+ this._identityFn = value || ((item) => item);
1839
+ if (this.selectionModel) {
1840
+ this.selectionModel.identityFn = this._identityFn;
1841
+ }
1842
+ }
1868
1843
  select(item) {
1869
1844
  if (item === null || item === undefined || this.selectionModel.containsItem(item)) {
1870
1845
  return;
@@ -1891,13 +1866,12 @@ class OptionSelectionService {
1891
1866
  this.selectionModel.unselect(item);
1892
1867
  this._selectionChanged.next(this.selectionModel);
1893
1868
  }
1894
- // TODO: Add support for trackBy and compareFn
1895
1869
  setSelectionValue(value) {
1896
- // NOTE: Currently we assume that no 2 options will have the same value
1897
- // but Eudes and I discussed that this is a possibility but we will handle
1898
- // this later
1899
- // if selection is undefined, or its value hasn't changed, or changing from null <-> undefined, that's not really changing so we return
1900
- if (!this.selectionModel || this.selectionModel.model === value || (!this.selectionModel.model && !value)) {
1870
+ if (!this.selectionModel) {
1871
+ return;
1872
+ }
1873
+ const current = this.selectionModel.model;
1874
+ if (this.valuesEqualByIdentity(current, value)) {
1901
1875
  return;
1902
1876
  }
1903
1877
  this.selectionModel.model = value;
@@ -1911,6 +1885,39 @@ class OptionSelectionService {
1911
1885
  }
1912
1886
  return value;
1913
1887
  }
1888
+ valuesEqualByIdentity(current, value) {
1889
+ if (current === value) {
1890
+ return true;
1891
+ }
1892
+ // Check if both are null or undefined or empty string.
1893
+ if ((current === null || current === undefined || current === '') &&
1894
+ (value === null || value === undefined || value === '')) {
1895
+ return true;
1896
+ }
1897
+ // Check if one is null or undefined or empty string and the other is not.
1898
+ if (current === null ||
1899
+ current === undefined ||
1900
+ current === '' ||
1901
+ value === null ||
1902
+ value === undefined ||
1903
+ value === '') {
1904
+ return false;
1905
+ }
1906
+ if (this.multiselectable) {
1907
+ const cur = current;
1908
+ const val = value;
1909
+ if (cur.length !== val.length) {
1910
+ return false;
1911
+ }
1912
+ // We only consider values equal if they are ordered the same way.
1913
+ const curIds = cur.map(this._identityFn);
1914
+ const valIds = val.map(this._identityFn);
1915
+ return curIds.every((id, i) => id === valIds[i]);
1916
+ }
1917
+ else {
1918
+ return this._identityFn(current) === this._identityFn(value);
1919
+ }
1920
+ }
1914
1921
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: OptionSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1915
1922
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: OptionSelectionService }); }
1916
1923
  }
@@ -2035,7 +2042,7 @@ class ComboboxFocusHandler {
2035
2042
  // this service is only interested in keys that may move the focus
2036
2043
  handleTextInput(event) {
2037
2044
  let preventDefault = false;
2038
- const key = normalizeKey(event.key);
2045
+ const key = event.key;
2039
2046
  if (event) {
2040
2047
  switch (key) {
2041
2048
  case Keys.Enter:
@@ -2092,18 +2099,12 @@ class ComboboxFocusHandler {
2092
2099
  this.renderer.listen(el, 'blur', event => {
2093
2100
  if (this.focusOutOfComponent(event)) {
2094
2101
  this.popoverService.open = false;
2095
- // Workaround for popover close-on-outside-click timing issues in Edge browser
2096
- if (this.componentCdRef) {
2097
- this.componentCdRef.detectChanges();
2098
- }
2099
2102
  }
2100
2103
  });
2101
2104
  }
2102
2105
  }
2103
2106
  focusOutOfComponent(event) {
2104
- // event.relatedTarget is null in IE11. In that case we use document.activeElement
2105
- // which points to the element that becomes active as the blur event occurs on the input.
2106
- const target = (event.relatedTarget || document.activeElement);
2107
+ const target = event.relatedTarget;
2107
2108
  return !(this.textInput.contains(target) || this.trigger.contains(target) || this.listbox.contains(target));
2108
2109
  }
2109
2110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ComboboxFocusHandler, deps: [{ token: i0.RendererFactory2 }, { token: i1$3.ClrPopoverService }, { token: OptionSelectionService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -2295,7 +2296,7 @@ class ClrOptions {
2295
2296
  loadingStateChange(state) {
2296
2297
  this.loading = state === ClrLoadingState.LOADING;
2297
2298
  }
2298
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrOptions, deps: [{ token: OptionSelectionService }, { token: IF_ACTIVE_ID }, { token: i0.ElementRef }, { token: i2$1.ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: i1$3.ClrPopoverService }, { token: POPOVER_HOST_ANCHOR, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
2299
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrOptions, deps: [{ token: OptionSelectionService }, { token: IF_ACTIVE_ID }, { token: i0.ElementRef }, { token: i2$1.ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: i1$3.ClrPopoverService }, { token: POPOVER_HOST_ORIGIN, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
2299
2300
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrOptions, isStandalone: false, selector: "clr-options", inputs: { optionsId: ["id", "optionsId"] }, host: { properties: { "class.clr-combobox-options": "true", "class.clr-combobox-options-hidden": "emptyOptions && editable", "attr.role": "\"listbox\"", "id": "optionsId" } }, providers: [{ provide: LoadingListener, useExisting: ClrOptions }], queries: [{ propertyName: "items", predicate: ClrOption, descendants: true }], ngImport: i0, template: `
2300
2301
  @if (optionSelectionService.loading) {
2301
2302
  <div class="clr-combobox-options-loading">
@@ -2365,7 +2366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2365
2366
  type: Optional
2366
2367
  }, {
2367
2368
  type: Inject,
2368
- args: [POPOVER_HOST_ANCHOR]
2369
+ args: [POPOVER_HOST_ORIGIN]
2369
2370
  }] }, { type: undefined, decorators: [{
2370
2371
  type: Inject,
2371
2372
  args: [DOCUMENT]
@@ -2412,8 +2413,7 @@ class ClrCombobox extends WrappedFormControl$1 {
2412
2413
  control.valueAccessor = this;
2413
2414
  }
2414
2415
  // default to SingleSelectComboboxModel, in case the optional input [ClrMulti] isn't used
2415
- optionSelectionService.selectionModel = new SingleSelectComboboxModel();
2416
- this.updateControlValue();
2416
+ this.multiSelect = false;
2417
2417
  }
2418
2418
  get editable() {
2419
2419
  return this.optionSelectionService.editable;
@@ -2421,6 +2421,9 @@ class ClrCombobox extends WrappedFormControl$1 {
2421
2421
  set editable(value) {
2422
2422
  this.optionSelectionService.editable = value;
2423
2423
  }
2424
+ set identityFn(value) {
2425
+ this.optionSelectionService.identityFn = value;
2426
+ }
2424
2427
  get multiSelect() {
2425
2428
  return this.optionSelectionService.multiselectable;
2426
2429
  }
@@ -2433,6 +2436,7 @@ class ClrCombobox extends WrappedFormControl$1 {
2433
2436
  // since the initial call to writeValue (caused by [ngModel] input) should happen after this
2434
2437
  this.optionSelectionService.selectionModel = new SingleSelectComboboxModel();
2435
2438
  }
2439
+ this.optionSelectionService.selectionModel.identityFn = this.optionSelectionService.identityFn;
2436
2440
  this.updateControlValue();
2437
2441
  }
2438
2442
  // Override the id of WrappedFormControl, as we want to move it to the embedded input.
@@ -2492,7 +2496,6 @@ class ClrCombobox extends WrappedFormControl$1 {
2492
2496
  }
2493
2497
  }
2494
2498
  ngAfterViewInit() {
2495
- this.focusHandler.componentCdRef = this.cdr;
2496
2499
  this.focusHandler.textInput = this.textbox.nativeElement;
2497
2500
  this.focusHandler.trigger = this.trigger.nativeElement;
2498
2501
  // The text input is the actual element we are wrapping
@@ -2656,13 +2659,13 @@ class ClrCombobox extends WrappedFormControl$1 {
2656
2659
  return [this.optionSelectionService.selectionModel.model];
2657
2660
  }
2658
2661
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrCombobox, deps: [{ token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i1$1.NgControl, optional: true, self: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: OptionSelectionService }, { token: i2$1.ClrCommonStringsService }, { token: i1$3.ClrPopoverService }, { token: ComboboxContainerService, optional: true }, { token: PLATFORM_ID }, { token: ComboboxFocusHandler }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2659
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrCombobox, isStandalone: false, selector: "clr-combobox", inputs: { placeholder: "placeholder", editable: ["clrEditable", "editable"], multiSelect: ["clrMulti", "multiSelect"] }, outputs: { clrInputChange: "clrInputChange", clrOpenChange: "clrOpenChange", clrSelectionChange: "clrSelectionChange" }, host: { listeners: { "keydown": "onKeyUp($event)" }, properties: { "class.aria-required": "true", "class.clr-combobox": "true", "class.clr-combobox-disabled": "control?.disabled" } }, providers: [
2662
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrCombobox, isStandalone: false, selector: "clr-combobox", inputs: { placeholder: "placeholder", editable: ["clrEditable", "editable"], identityFn: ["clrComboboxIdentityFn", "identityFn"], multiSelect: ["clrMulti", "multiSelect"] }, outputs: { clrInputChange: "clrInputChange", clrOpenChange: "clrOpenChange", clrSelectionChange: "clrSelectionChange" }, host: { listeners: { "keydown": "onKeyUp($event)" }, properties: { "class.aria-required": "true", "class.clr-combobox": "true", "class.clr-combobox-disabled": "control?.disabled" } }, providers: [
2660
2663
  OptionSelectionService,
2661
2664
  { provide: LoadingListener, useExisting: ClrCombobox },
2662
2665
  IF_ACTIVE_ID_PROVIDER,
2663
2666
  FOCUS_SERVICE_PROVIDER,
2664
2667
  COMBOBOX_FOCUS_HANDLER_PROVIDER,
2665
- ], 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: i1$3.ClrPopoverHostDirective }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2026 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\nwidth of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"onWrapperClick($event)\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"(control?.control.touched && control?.invalid)\"\n [class.disabled]=\"control?.disabled\"\n>\n @if (multiSelect && optionSelectionService.selectionModel.model && multiSelectModel.length > 0) {\n <span\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 @for (item of multiSelectModel; track item; let i = $index) {\n <span class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n @if (optionSelected) {\n <ng-container\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n }\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 }\n </span>\n }\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($event)\"\n (focus)=\"onFocus()\"\n (change)=\"onChange()\"\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 #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.\nAdditionally 'outsideClickToClose' has complex handling that's necessary\nto be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState; at popoverPosition; type: popoverType;\">\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: i2$1.ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: i2$1.ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: i1$3.ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: i1$3.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] }); }
2668
+ ], 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: i1$3.ClrPopoverHostDirective }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2026 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\nwidth of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverOrigin\n (click)=\"onWrapperClick($event)\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"(control?.control.touched && control?.invalid)\"\n [class.disabled]=\"control?.disabled\"\n>\n @if (multiSelect && optionSelectionService.selectionModel.model && multiSelectModel.length > 0) {\n <span\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 @for (item of multiSelectModel; track item; let i = $index) {\n <span class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n @if (optionSelected) {\n <ng-container\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n }\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 }\n </span>\n }\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($event)\"\n (focus)=\"onFocus()\"\n (change)=\"onChange()\"\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 #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.\n'outsideClickToClose' has complex handling that's necessary\nto be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState; at popoverPosition; type: popoverType;\">\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: i2$1.ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: i2$1.ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: i1$3.ClrPopoverOrigin, selector: "[clrPopoverOrigin]" }, { kind: "directive", type: i1$3.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose", "clrPopoverContentOrigin"] }] }); }
2666
2669
  }
2667
2670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrCombobox, decorators: [{
2668
2671
  type: Component,
@@ -2676,7 +2679,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2676
2679
  '[class.aria-required]': 'true',
2677
2680
  '[class.clr-combobox]': 'true',
2678
2681
  '[class.clr-combobox-disabled]': 'control?.disabled',
2679
- }, standalone: false, template: "<!--\n ~ Copyright (c) 2016-2026 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\nwidth of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"onWrapperClick($event)\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"(control?.control.touched && control?.invalid)\"\n [class.disabled]=\"control?.disabled\"\n>\n @if (multiSelect && optionSelectionService.selectionModel.model && multiSelectModel.length > 0) {\n <span\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 @for (item of multiSelectModel; track item; let i = $index) {\n <span class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n @if (optionSelected) {\n <ng-container\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n }\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 }\n </span>\n }\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($event)\"\n (focus)=\"onFocus()\"\n (change)=\"onChange()\"\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 #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.\nAdditionally 'outsideClickToClose' has complex handling that's necessary\nto be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState; at popoverPosition; type: popoverType;\">\n <ng-content></ng-content>\n</div>\n" }]
2682
+ }, standalone: false, template: "<!--\n ~ Copyright (c) 2016-2026 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\nwidth of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverOrigin\n (click)=\"onWrapperClick($event)\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"(control?.control.touched && control?.invalid)\"\n [class.disabled]=\"control?.disabled\"\n>\n @if (multiSelect && optionSelectionService.selectionModel.model && multiSelectModel.length > 0) {\n <span\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 @for (item of multiSelectModel; track item; let i = $index) {\n <span class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n @if (optionSelected) {\n <ng-container\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n }\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 }\n </span>\n }\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($event)\"\n (focus)=\"onFocus()\"\n (change)=\"onChange()\"\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 #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.\n'outsideClickToClose' has complex handling that's necessary\nto be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState; at popoverPosition; type: popoverType;\">\n <ng-content></ng-content>\n</div>\n" }]
2680
2683
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1$1.NgControl, decorators: [{
2681
2684
  type: Self
2682
2685
  }, {
@@ -2713,6 +2716,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2713
2716
  }], editable: [{
2714
2717
  type: Input,
2715
2718
  args: ['clrEditable']
2719
+ }], identityFn: [{
2720
+ type: Input,
2721
+ args: ['clrComboboxIdentityFn']
2716
2722
  }], multiSelect: [{
2717
2723
  type: Input,
2718
2724
  args: ['clrMulti']
@@ -2874,7 +2880,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2874
2880
  */
2875
2881
  class ClrComboboxModule {
2876
2882
  constructor() {
2877
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon, angleIcon, windowCloseIcon);
2883
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon, angleIcon, windowCloseIcon);
2878
2884
  }
2879
2885
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrComboboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2880
2886
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrComboboxModule, declarations: [ClrCombobox,
@@ -3060,12 +3066,6 @@ class ClrDatalistContainer extends ClrAbstractContainer$1 {
3060
3066
  <ng-content select="datalist"></ng-content>
3061
3067
  <cds-icon shape="angle" class="clr-datalist-caret" direction="down" (click)="showPicker(datalist)"></cds-icon>
3062
3068
  </div>
3063
- @if (showInvalid) {
3064
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
3065
- }
3066
- @if (showValid) {
3067
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
3068
- }
3069
3069
  </div>
3070
3070
  @if (showHelper) {
3071
3071
  <ng-content select="clr-control-helper"></ng-content>
@@ -3095,12 +3095,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
3095
3095
  <ng-content select="datalist"></ng-content>
3096
3096
  <cds-icon shape="angle" class="clr-datalist-caret" direction="down" (click)="showPicker(datalist)"></cds-icon>
3097
3097
  </div>
3098
- @if (showInvalid) {
3099
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
3100
- }
3101
- @if (showValid) {
3102
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
3103
- }
3104
3098
  </div>
3105
3099
  @if (showHelper) {
3106
3100
  <ng-content select="clr-control-helper"></ng-content>
@@ -3187,7 +3181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
3187
3181
  */
3188
3182
  class ClrDatalistModule {
3189
3183
  constructor() {
3190
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
3184
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
3191
3185
  }
3192
3186
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrDatalistModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3193
3187
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrDatalistModule, declarations: [ClrDatalist, ClrDatalistInput, ClrDatalistContainer], imports: [CommonModule, ClrInputModule$1, ClrIcon], exports: [ClrDatalist, ClrDatalistInput, ClrDatalistContainer] }); }
@@ -3510,10 +3504,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
3510
3504
  */
3511
3505
  class DateIOService {
3512
3506
  constructor(localeHelperService) {
3507
+ /**
3508
+ * This is the default range. It approximates the beginning of time to the end of time.
3509
+ * The disabled dates are the dates that are not allowed to be selected.
3510
+ * The min date is the earliest date that can be selected.
3511
+ * The max date is the latest date that can be selected.
3512
+ * Unless a minDate or maxDate is set with the native HTML5 api the range is all dates
3513
+ */
3513
3514
  this.disabledDates = {
3514
- // This is the default range. It approximates the beginning of time to the end of time.
3515
- // Unless a minDate or maxDate is set with the native HTML5 api the range is all dates
3516
- // TODO: turn this into an Array of min/max ranges that allow configuration of multiple ranges.
3517
3515
  minDate: new DayModel(0, 0, 1),
3518
3516
  maxDate: new DayModel(9999, 11, 31),
3519
3517
  };
@@ -4168,7 +4166,7 @@ class ClrMonthpicker {
4168
4166
  // the logic is fairly simple and it didn't make sense for me
4169
4167
  // to create extra observables just to move this logic to the service.
4170
4168
  if (event) {
4171
- const key = normalizeKey(event.key);
4169
+ const key = event.key;
4172
4170
  if (key === Keys.ArrowUp && this._focusedMonthIndex > 1) {
4173
4171
  event.preventDefault();
4174
4172
  this._focusedMonthIndex -= 2;
@@ -4515,7 +4513,7 @@ class ClrYearpicker {
4515
4513
  // the logic is fairly simple and it didn't make sense for me
4516
4514
  // to create extra observables just to move this logic to the service.
4517
4515
  if (event) {
4518
- const key = normalizeKey(event.key);
4516
+ const key = event.key;
4519
4517
  if (key === Keys.ArrowUp) {
4520
4518
  event.preventDefault();
4521
4519
  this.incrementFocusYearBy(-2);
@@ -5162,7 +5160,7 @@ class ClrCalendar {
5162
5160
  */
5163
5161
  onKeyDown(event) {
5164
5162
  if (event && this.focusedDay) {
5165
- switch (normalizeKey(event.key)) {
5163
+ switch (event.key) {
5166
5164
  case Keys.ArrowUp:
5167
5165
  event.preventDefault();
5168
5166
  this._dateNavigationService.incrementFocusDay(-1 * NO_OF_DAYS_IN_A_WEEK);
@@ -5632,7 +5630,7 @@ class ClrDateContainer extends ClrAbstractContainer$1 {
5632
5630
  <label></label>
5633
5631
  }
5634
5632
  <div class="clr-control-container" [ngClass]="controlClass()">
5635
- <div class="clr-input-wrapper" clrPopoverAnchor>
5633
+ <div class="clr-input-wrapper" clrPopoverOrigin>
5636
5634
  <div class="clr-input-group" [class.clr-focus]="focus">
5637
5635
  <!-- render range inputs only if using clr-date-range-container -->
5638
5636
  @if (isRangePicker) {
@@ -5664,12 +5662,6 @@ class ClrDateContainer extends ClrAbstractContainer$1 {
5664
5662
  cdkTrapFocus
5665
5663
  ></clr-datepicker-view-manager>
5666
5664
  </div>
5667
- @if (showInvalid) {
5668
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
5669
- }
5670
- @if (showValid) {
5671
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
5672
- }
5673
5665
  </div>
5674
5666
  @if (showHelper) {
5675
5667
  <ng-content select="clr-control-helper"></ng-content>
@@ -5681,7 +5673,7 @@ class ClrDateContainer extends ClrAbstractContainer$1 {
5681
5673
  <ng-content select="clr-control-success"></ng-content>
5682
5674
  }
5683
5675
  </div>
5684
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: i1$3.ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: i1$3.ÇlrClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: i1$3.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }, { kind: "component", type: ClrDatepickerViewManager, selector: "clr-datepicker-view-manager" }] }); }
5676
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: i1$3.ClrPopoverOrigin, selector: "[clrPopoverOrigin]" }, { kind: "directive", type: i1$3.ÇlrClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: i1$3.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose", "clrPopoverContentOrigin"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }, { kind: "component", type: ClrDatepickerViewManager, selector: "clr-datepicker-view-manager" }] }); }
5685
5677
  }
5686
5678
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrDateContainer, decorators: [{
5687
5679
  type: Component,
@@ -5693,7 +5685,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
5693
5685
  <label></label>
5694
5686
  }
5695
5687
  <div class="clr-control-container" [ngClass]="controlClass()">
5696
- <div class="clr-input-wrapper" clrPopoverAnchor>
5688
+ <div class="clr-input-wrapper" clrPopoverOrigin>
5697
5689
  <div class="clr-input-group" [class.clr-focus]="focus">
5698
5690
  <!-- render range inputs only if using clr-date-range-container -->
5699
5691
  @if (isRangePicker) {
@@ -5725,12 +5717,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
5725
5717
  cdkTrapFocus
5726
5718
  ></clr-datepicker-view-manager>
5727
5719
  </div>
5728
- @if (showInvalid) {
5729
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
5730
- }
5731
- @if (showValid) {
5732
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
5733
- }
5734
5720
  </div>
5735
5721
  @if (showHelper) {
5736
5722
  <ng-content select="clr-control-helper"></ng-content>
@@ -6343,7 +6329,7 @@ const CLR_DATEPICKER_DIRECTIVES = [
6343
6329
  ];
6344
6330
  class ClrDatepickerModule {
6345
6331
  constructor() {
6346
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon, angleIcon, eventIcon, calendarIcon);
6332
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon, angleIcon, eventIcon, calendarIcon);
6347
6333
  }
6348
6334
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrDatepickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6349
6335
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrDatepickerModule, declarations: [ClrDateInput,
@@ -6445,15 +6431,23 @@ function clearFiles(fileInputElement) {
6445
6431
  const CLR_FILE_MESSAGES_TEMPLATE_CONTEXT = new InjectionToken('ClrFileMessagesTemplateContext');
6446
6432
  class ClrFileInfo {
6447
6433
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInfo, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6448
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrFileInfo, isStandalone: false, selector: "clr-file-info", host: { properties: { "class.clr-subtext": "true" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true }); }
6434
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrFileInfo, isStandalone: false, selector: "clr-file-info", host: { properties: { "class.clr-subtext-wrapper": "true" } }, ngImport: i0, template: `
6435
+ <span class="clr-subtext">
6436
+ <ng-content></ng-content>
6437
+ </span>
6438
+ `, isInline: true }); }
6449
6439
  }
6450
6440
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInfo, decorators: [{
6451
6441
  type: Component,
6452
6442
  args: [{
6453
6443
  selector: 'clr-file-info',
6454
- template: `<ng-content></ng-content>`,
6444
+ template: `
6445
+ <span class="clr-subtext">
6446
+ <ng-content></ng-content>
6447
+ </span>
6448
+ `,
6455
6449
  host: {
6456
- '[class.clr-subtext]': 'true',
6450
+ '[class.clr-subtext-wrapper]': 'true',
6457
6451
  },
6458
6452
  standalone: false,
6459
6453
  }]
@@ -6463,39 +6457,57 @@ class ClrFileSuccess {
6463
6457
  this.context = inject(CLR_FILE_MESSAGES_TEMPLATE_CONTEXT);
6464
6458
  }
6465
6459
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileSuccess, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6466
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrFileSuccess, isStandalone: false, selector: "clr-file-success", host: { properties: { "style.display": "context.success ? \"inline-block\" : \"none\"", "class.clr-subtext": "true", "class.success": "true" } }, ngImport: i0, template: `@if (context.success) {
6467
- <ng-content></ng-content>
6468
- }`, isInline: true }); }
6460
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrFileSuccess, isStandalone: false, selector: "clr-file-success", host: { properties: { "style.display": "context.success ? \"flex\" : \"none\"", "class.clr-subtext-wrapper": "true" } }, ngImport: i0, template: `
6461
+ @if (context.success) {
6462
+ <cds-icon class="clr-validate-icon" shape="success-standard" status="success" aria-hidden="true"></cds-icon>
6463
+ <span class="clr-subtext success">
6464
+ <ng-content></ng-content>
6465
+ </span>
6466
+ }
6467
+ `, isInline: true, dependencies: [{ kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
6469
6468
  }
6470
6469
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileSuccess, decorators: [{
6471
6470
  type: Component,
6472
6471
  args: [{
6473
6472
  selector: 'clr-file-success',
6474
6473
  // We check for success here so that consumers don't have to.
6475
- template: `@if (context.success) {
6476
- <ng-content></ng-content>
6477
- }`,
6474
+ template: `
6475
+ @if (context.success) {
6476
+ <cds-icon class="clr-validate-icon" shape="success-standard" status="success" aria-hidden="true"></cds-icon>
6477
+ <span class="clr-subtext success">
6478
+ <ng-content></ng-content>
6479
+ </span>
6480
+ }
6481
+ `,
6478
6482
  host: {
6479
- '[style.display]': 'context.success ? "inline-block" : "none"',
6480
- '[class.clr-subtext]': 'true',
6481
- '[class.success]': 'true',
6483
+ '[style.display]': 'context.success ? "flex" : "none"',
6484
+ '[class.clr-subtext-wrapper]': 'true',
6482
6485
  },
6483
6486
  standalone: false,
6484
6487
  }]
6485
6488
  }] });
6486
6489
  class ClrFileError {
6487
6490
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6488
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrFileError, isStandalone: false, selector: "clr-file-error", host: { properties: { "class.clr-subtext": "true", "class.error": "true" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true }); }
6491
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrFileError, isStandalone: false, selector: "clr-file-error", host: { properties: { "class.clr-subtext-wrapper": "true" } }, ngImport: i0, template: `
6492
+ <cds-icon class="clr-validate-icon" shape="error-standard" status="danger" aria-hidden="true"></cds-icon>
6493
+ <span class="clr-subtext error">
6494
+ <ng-content></ng-content>
6495
+ </span>
6496
+ `, isInline: true, dependencies: [{ kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
6489
6497
  }
6490
6498
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileError, decorators: [{
6491
6499
  type: Component,
6492
6500
  args: [{
6493
6501
  selector: 'clr-file-error',
6494
- // The host should have an `@if` or `@if` that checks for the relevant error.
6495
- template: `<ng-content></ng-content>`,
6502
+ // The host should have an `*ngIf` or `@if` that checks for the relevant error.
6503
+ template: `
6504
+ <cds-icon class="clr-validate-icon" shape="error-standard" status="danger" aria-hidden="true"></cds-icon>
6505
+ <span class="clr-subtext error">
6506
+ <ng-content></ng-content>
6507
+ </span>
6508
+ `,
6496
6509
  host: {
6497
- '[class.clr-subtext]': 'true',
6498
- '[class.error]': 'true',
6510
+ '[class.clr-subtext-wrapper]': 'true',
6499
6511
  },
6500
6512
  standalone: false,
6501
6513
  }]
@@ -6533,6 +6545,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
6533
6545
  */
6534
6546
  class ClrFileList {
6535
6547
  constructor() {
6548
+ this.injectorCache = new Map();
6549
+ this.contextCache = new Map();
6536
6550
  this.injector = inject(Injector);
6537
6551
  this.commonStrings = inject(ClrCommonStringsService);
6538
6552
  this.ngControlService = inject(NgControlService$1, { optional: true });
@@ -6571,7 +6585,17 @@ class ClrFileList {
6571
6585
  maxFileSize: fileInputErrors.maxFileSize?.find(error => error.name === file.name),
6572
6586
  };
6573
6587
  const success = Object.values(errors).every(error => !error);
6574
- return { $implicit: file, success, errors };
6588
+ const cached = this.contextCache.get(file);
6589
+ if (cached && cached.success === success && this.errorsEqual(cached.errors, errors)) {
6590
+ return cached;
6591
+ }
6592
+ // new context is made and old reference replaced
6593
+ const context = { $implicit: file, success, errors };
6594
+ this.contextCache.set(file, context);
6595
+ // new injector is made and old reference replaced
6596
+ const injector = this.createFileMessagesTemplateInjector(context);
6597
+ this.injectorCache.set(file, injector);
6598
+ return context;
6575
6599
  }
6576
6600
  createFileMessagesTemplateInjector(fileMessagesTemplateContext) {
6577
6601
  return Injector.create({
@@ -6579,6 +6603,9 @@ class ClrFileList {
6579
6603
  providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }],
6580
6604
  });
6581
6605
  }
6606
+ errorsEqual(a, b) {
6607
+ return a.accept === b.accept && a.minFileSize === b.minFileSize && a.maxFileSize === b.maxFileSize;
6608
+ }
6582
6609
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6583
6610
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrFileList, isStandalone: false, selector: "clr-file-list", host: { properties: { "attr.role": "\"list\"", "class.clr-file-list": "true" } }, queries: [{ propertyName: "fileMessagesTemplate", first: true, predicate: ClrFileMessagesTemplate, descendants: true }], ngImport: i0, template: `
6584
6611
  @for (file of files; track file) {
@@ -6602,18 +6629,12 @@ class ClrFileList {
6602
6629
  <cds-icon shape="times"></cds-icon>
6603
6630
  </button>
6604
6631
  </span>
6605
- <cds-icon
6606
- class="clr-validate-icon"
6607
- [shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
6608
- [status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
6609
- aria-hidden="true"
6610
- ></cds-icon>
6611
6632
  </div>
6612
6633
  @if (fileMessagesTemplate) {
6613
6634
  <ng-container
6614
6635
  [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
6615
6636
  [ngTemplateOutletContext]="fileMessagesTemplateContext"
6616
- [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
6637
+ [ngTemplateOutletInjector]="injectorCache.get(file)"
6617
6638
  ></ng-container>
6618
6639
  }
6619
6640
  </div>
@@ -6647,18 +6668,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
6647
6668
  <cds-icon shape="times"></cds-icon>
6648
6669
  </button>
6649
6670
  </span>
6650
- <cds-icon
6651
- class="clr-validate-icon"
6652
- [shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
6653
- [status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
6654
- aria-hidden="true"
6655
- ></cds-icon>
6656
6671
  </div>
6657
6672
  @if (fileMessagesTemplate) {
6658
6673
  <ng-container
6659
6674
  [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
6660
6675
  [ngTemplateOutletContext]="fileMessagesTemplateContext"
6661
- [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
6676
+ [ngTemplateOutletInjector]="injectorCache.get(file)"
6662
6677
  ></ng-container>
6663
6678
  }
6664
6679
  </div>
@@ -6782,12 +6797,6 @@ class ClrFileInputContainer extends ClrAbstractContainer$1 {
6782
6797
  <cds-icon shape="times" status="neutral"></cds-icon>
6783
6798
  </button>
6784
6799
  }
6785
- @if (showInvalid) {
6786
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
6787
- }
6788
- @if (showValid) {
6789
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
6790
- }
6791
6800
  </div>
6792
6801
  @if (showHelper) {
6793
6802
  <ng-content select="clr-control-helper"></ng-content>
@@ -6856,12 +6865,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
6856
6865
  <cds-icon shape="times" status="neutral"></cds-icon>
6857
6866
  </button>
6858
6867
  }
6859
- @if (showInvalid) {
6860
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
6861
- }
6862
- @if (showValid) {
6863
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
6864
- }
6865
6868
  </div>
6866
6869
  @if (showHelper) {
6867
6870
  <ng-content select="clr-control-helper"></ng-content>
@@ -7145,7 +7148,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7145
7148
  */
7146
7149
  class ClrFileInputModule {
7147
7150
  constructor() {
7148
- ClarityIcons.addIcons(folderOpenIcon);
7151
+ ClarityIcons.addIcons(folderOpenIcon, successStandardIcon, errorStandardIcon);
7149
7152
  }
7150
7153
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7151
7154
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInputModule, declarations: [ClrFileInput,
@@ -7225,12 +7228,6 @@ class ClrInputContainer extends ClrAbstractContainer$1 {
7225
7228
  <ng-content select="[clrInput]"></ng-content>
7226
7229
  <ng-content select="[clrInputSuffix]"></ng-content>
7227
7230
  </div>
7228
- @if (showInvalid) {
7229
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
7230
- }
7231
- @if (showValid) {
7232
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7233
- }
7234
7231
  </div>
7235
7232
  @if (showHelper) {
7236
7233
  <ng-content select="clr-control-helper"></ng-content>
@@ -7242,7 +7239,7 @@ class ClrInputContainer extends ClrAbstractContainer$1 {
7242
7239
  <ng-content select="clr-control-success"></ng-content>
7243
7240
  }
7244
7241
  </div>
7245
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
7242
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
7246
7243
  }
7247
7244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrInputContainer, decorators: [{
7248
7245
  type: Component,
@@ -7260,12 +7257,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7260
7257
  <ng-content select="[clrInput]"></ng-content>
7261
7258
  <ng-content select="[clrInputSuffix]"></ng-content>
7262
7259
  </div>
7263
- @if (showInvalid) {
7264
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
7265
- }
7266
- @if (showValid) {
7267
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7268
- }
7269
7260
  </div>
7270
7261
  @if (showHelper) {
7271
7262
  <ng-content select="clr-control-helper"></ng-content>
@@ -7332,8 +7323,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7332
7323
  */
7333
7324
  class ClrInputModule {
7334
7325
  constructor() {
7335
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon // caret
7336
- );
7326
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
7337
7327
  }
7338
7328
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7339
7329
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrInputModule, declarations: [ClrInput, ClrInputContainer], imports: [CommonModule, FormsModule, ClrIcon, ClrCommonFormsModule$1], exports: [ClrCommonFormsModule$1, ClrInput, ClrInputContainer] }); }
@@ -7400,12 +7390,6 @@ class ClrNumberInputContainer extends ClrAbstractContainer$1 {
7400
7390
  </button>
7401
7391
  </div>
7402
7392
  </div>
7403
- @if (showInvalid) {
7404
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
7405
- }
7406
- @if (showValid) {
7407
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7408
- }
7409
7393
  </div>
7410
7394
  @if (showHelper) {
7411
7395
  <ng-content select="clr-control-helper"></ng-content>
@@ -7452,12 +7436,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7452
7436
  </button>
7453
7437
  </div>
7454
7438
  </div>
7455
- @if (showInvalid) {
7456
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
7457
- }
7458
- @if (showValid) {
7459
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7460
- }
7461
7439
  </div>
7462
7440
  @if (showHelper) {
7463
7441
  <ng-content select="clr-control-helper"></ng-content>
@@ -7565,7 +7543,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7565
7543
  */
7566
7544
  class ClrNumberInputModule {
7567
7545
  constructor() {
7568
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon, minusIcon, plusIcon);
7546
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon, minusIcon, plusIcon);
7569
7547
  }
7570
7548
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrNumberInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7571
7549
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrNumberInputModule, declarations: [ClrNumberInput, ClrNumberInputContainer], imports: [CommonModule, FormsModule, ClrIcon, ClrCommonFormsModule$1], exports: [ClrCommonFormsModule$1, ClrNumberInput, ClrNumberInputContainer] }); }
@@ -7650,12 +7628,6 @@ class ClrPasswordContainer extends ClrAbstractContainer$1 {
7650
7628
  </button>
7651
7629
  }
7652
7630
  </div>
7653
- @if (showInvalid) {
7654
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
7655
- }
7656
- @if (showValid) {
7657
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7658
- }
7659
7631
  </div>
7660
7632
  @if (showHelper) {
7661
7633
  <ng-content select="clr-control-helper"></ng-content>
@@ -7691,12 +7663,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7691
7663
  </button>
7692
7664
  }
7693
7665
  </div>
7694
- @if (showInvalid) {
7695
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
7696
- }
7697
- @if (showValid) {
7698
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7699
- }
7700
7666
  </div>
7701
7667
  @if (showHelper) {
7702
7668
  <ng-content select="clr-control-helper"></ng-content>
@@ -7790,7 +7756,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7790
7756
  */
7791
7757
  class ClrPasswordModule {
7792
7758
  constructor() {
7793
- ClarityIcons.addIcons(eyeHideIcon, eyeIcon, exclamationCircleIcon, checkCircleIcon);
7759
+ ClarityIcons.addIcons(eyeHideIcon, eyeIcon, successStandardIcon, errorStandardIcon);
7794
7760
  }
7795
7761
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrPasswordModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7796
7762
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrPasswordModule, declarations: [ClrPassword, ClrPasswordContainer], imports: [CommonModule, FormsModule, ClrIcon, ClrCommonFormsModule$1], exports: [ClrCommonFormsModule$1, ClrPassword, ClrPasswordContainer] }); }
@@ -7942,29 +7908,14 @@ class ClrRadioContainer extends ClrAbstractContainer$1 {
7942
7908
  <ng-content select="clr-control-helper"></ng-content>
7943
7909
  </div>
7944
7910
  }
7945
- @if (showValid || showInvalid) {
7946
- <div class="clr-subtext-wrapper">
7947
- @if (showInvalid) {
7948
- <cds-icon
7949
- class="clr-validate-icon"
7950
- shape="exclamation-circle"
7951
- status="danger"
7952
- aria-hidden="true"
7953
- ></cds-icon>
7954
- }
7955
- @if (showValid) {
7956
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7957
- }
7958
- @if (showInvalid) {
7959
- <ng-content select="clr-control-error"></ng-content>
7960
- }
7961
- @if (showValid) {
7962
- <ng-content select="clr-control-success"></ng-content>
7963
- }
7964
- </div>
7911
+ @if (showInvalid) {
7912
+ <ng-content select="clr-control-error"></ng-content>
7913
+ }
7914
+ @if (showValid) {
7915
+ <ng-content select="clr-control-success"></ng-content>
7965
7916
  }
7966
7917
  </div>
7967
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
7918
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
7968
7919
  }
7969
7920
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrRadioContainer, decorators: [{
7970
7921
  type: Component,
@@ -7982,26 +7933,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
7982
7933
  <ng-content select="clr-control-helper"></ng-content>
7983
7934
  </div>
7984
7935
  }
7985
- @if (showValid || showInvalid) {
7986
- <div class="clr-subtext-wrapper">
7987
- @if (showInvalid) {
7988
- <cds-icon
7989
- class="clr-validate-icon"
7990
- shape="exclamation-circle"
7991
- status="danger"
7992
- aria-hidden="true"
7993
- ></cds-icon>
7994
- }
7995
- @if (showValid) {
7996
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
7997
- }
7998
- @if (showInvalid) {
7999
- <ng-content select="clr-control-error"></ng-content>
8000
- }
8001
- @if (showValid) {
8002
- <ng-content select="clr-control-success"></ng-content>
8003
- }
8004
- </div>
7936
+ @if (showInvalid) {
7937
+ <ng-content select="clr-control-error"></ng-content>
7938
+ }
7939
+ @if (showValid) {
7940
+ <ng-content select="clr-control-success"></ng-content>
8005
7941
  }
8006
7942
  </div>
8007
7943
  `,
@@ -8035,7 +7971,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8035
7971
  */
8036
7972
  class ClrRadioModule {
8037
7973
  constructor() {
8038
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
7974
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
8039
7975
  }
8040
7976
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrRadioModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8041
7977
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrRadioModule, declarations: [ClrRadio, ClrRadioContainer, ClrRadioWrapper], imports: [CommonModule, ClrCommonFormsModule$1, ClrHostWrappingModule, ClrIcon], exports: [ClrCommonFormsModule$1, ClrRadio, ClrRadioContainer, ClrRadioWrapper] }); }
@@ -8085,12 +8021,6 @@ class ClrSelectContainer extends ClrAbstractContainer$1 {
8085
8021
  <div class="clr-control-container" [ngClass]="controlClass()">
8086
8022
  <div [ngClass]="wrapperClass()">
8087
8023
  <ng-content select="[clrSelect]"></ng-content>
8088
- @if (showInvalid) {
8089
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
8090
- }
8091
- @if (showValid) {
8092
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
8093
- }
8094
8024
  </div>
8095
8025
  @if (showHelper) {
8096
8026
  <ng-content select="clr-control-helper"></ng-content>
@@ -8102,7 +8032,7 @@ class ClrSelectContainer extends ClrAbstractContainer$1 {
8102
8032
  <ng-content select="clr-control-success"></ng-content>
8103
8033
  }
8104
8034
  </div>
8105
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
8035
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
8106
8036
  }
8107
8037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrSelectContainer, decorators: [{
8108
8038
  type: Component,
@@ -8116,12 +8046,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8116
8046
  <div class="clr-control-container" [ngClass]="controlClass()">
8117
8047
  <div [ngClass]="wrapperClass()">
8118
8048
  <ng-content select="[clrSelect]"></ng-content>
8119
- @if (showInvalid) {
8120
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
8121
- }
8122
- @if (showValid) {
8123
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
8124
- }
8125
8049
  </div>
8126
8050
  @if (showHelper) {
8127
8051
  <ng-content select="clr-control-helper"></ng-content>
@@ -8184,7 +8108,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8184
8108
  */
8185
8109
  class ClrSelectModule {
8186
8110
  constructor() {
8187
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
8111
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
8188
8112
  }
8189
8113
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8190
8114
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrSelectModule, declarations: [ClrSelect, ClrSelectContainer], imports: [CommonModule, FormsModule, ClrIcon, ClrCommonFormsModule$1], exports: [ClrCommonFormsModule$1, ClrSelect, ClrSelectContainer] }); }
@@ -8222,12 +8146,6 @@ class ClrTextareaContainer extends ClrAbstractContainer$1 {
8222
8146
  <div class="clr-control-container" [ngClass]="controlClass()">
8223
8147
  <div class="clr-textarea-wrapper">
8224
8148
  <ng-content select="[clrTextarea]"></ng-content>
8225
- @if (showInvalid) {
8226
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
8227
- }
8228
- @if (showValid) {
8229
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
8230
- }
8231
8149
  </div>
8232
8150
  @if (showHelper) {
8233
8151
  <ng-content select="clr-control-helper"></ng-content>
@@ -8239,7 +8157,7 @@ class ClrTextareaContainer extends ClrAbstractContainer$1 {
8239
8157
  <ng-content select="clr-control-success"></ng-content>
8240
8158
  }
8241
8159
  </div>
8242
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
8160
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
8243
8161
  }
8244
8162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrTextareaContainer, decorators: [{
8245
8163
  type: Component,
@@ -8253,12 +8171,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8253
8171
  <div class="clr-control-container" [ngClass]="controlClass()">
8254
8172
  <div class="clr-textarea-wrapper">
8255
8173
  <ng-content select="[clrTextarea]"></ng-content>
8256
- @if (showInvalid) {
8257
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
8258
- }
8259
- @if (showValid) {
8260
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
8261
- }
8262
8174
  </div>
8263
8175
  @if (showHelper) {
8264
8176
  <ng-content select="clr-control-helper"></ng-content>
@@ -8316,7 +8228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8316
8228
  */
8317
8229
  class ClrTextareaModule {
8318
8230
  constructor() {
8319
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
8231
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
8320
8232
  }
8321
8233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrTextareaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8322
8234
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrTextareaModule, declarations: [ClrTextarea, ClrTextareaContainer], imports: [CommonModule, FormsModule, ClrIcon, ClrCommonFormsModule$1], exports: [ClrCommonFormsModule$1, ClrTextarea, ClrTextareaContainer] }); }
@@ -8397,12 +8309,6 @@ class ClrRangeContainer extends ClrAbstractContainer$1 {
8397
8309
  @if (hasProgress) {
8398
8310
  <span class="fill-input" [style.width]="getRangeProgressFillWidth()"></span>
8399
8311
  }
8400
- @if (showInvalid) {
8401
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
8402
- }
8403
- @if (showValid) {
8404
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
8405
- }
8406
8312
  </div>
8407
8313
  @if (showHelper) {
8408
8314
  <ng-content select="clr-control-helper"></ng-content>
@@ -8414,7 +8320,7 @@ class ClrRangeContainer extends ClrAbstractContainer$1 {
8414
8320
  <ng-content select="clr-control-success"></ng-content>
8415
8321
  }
8416
8322
  </div>
8417
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }, { kind: "component", type: i3.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
8323
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
8418
8324
  }
8419
8325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrRangeContainer, decorators: [{
8420
8326
  type: Component,
@@ -8431,12 +8337,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8431
8337
  @if (hasProgress) {
8432
8338
  <span class="fill-input" [style.width]="getRangeProgressFillWidth()"></span>
8433
8339
  }
8434
- @if (showInvalid) {
8435
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
8436
- }
8437
- @if (showValid) {
8438
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
8439
- }
8440
8340
  </div>
8441
8341
  @if (showHelper) {
8442
8342
  <ng-content select="clr-control-helper"></ng-content>
@@ -8498,7 +8398,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
8498
8398
  */
8499
8399
  class ClrRangeModule {
8500
8400
  constructor() {
8501
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
8401
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
8502
8402
  }
8503
8403
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrRangeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8504
8404
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrRangeModule, declarations: [ClrRange, ClrRangeContainer], imports: [CommonModule, ClrCommonFormsModule$1, ClrHostWrappingModule, ClrIcon], exports: [ClrCommonFormsModule$1, ClrRange, ClrRangeContainer] }); }