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

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 (89) hide show
  1. package/fesm2022/clr-angular-accordion.mjs +1 -1
  2. package/fesm2022/clr-angular-accordion.mjs.map +1 -1
  3. package/fesm2022/clr-angular-button.mjs +6 -6
  4. package/fesm2022/clr-angular-button.mjs.map +1 -1
  5. package/fesm2022/clr-angular-data-datagrid.mjs +19 -33
  6. package/fesm2022/clr-angular-data-datagrid.mjs.map +1 -1
  7. package/fesm2022/clr-angular-data-tree-view.mjs +2 -2
  8. package/fesm2022/clr-angular-data-tree-view.mjs.map +1 -1
  9. package/fesm2022/clr-angular-data.mjs +11 -9116
  10. package/fesm2022/clr-angular-data.mjs.map +1 -1
  11. package/fesm2022/clr-angular-emphasis-alert.mjs +2 -2
  12. package/fesm2022/clr-angular-emphasis-alert.mjs.map +1 -1
  13. package/fesm2022/clr-angular-emphasis.mjs +12 -778
  14. package/fesm2022/clr-angular-emphasis.mjs.map +1 -1
  15. package/fesm2022/clr-angular-forms-checkbox.mjs +13 -44
  16. package/fesm2022/clr-angular-forms-checkbox.mjs.map +1 -1
  17. package/fesm2022/clr-angular-forms-combobox.mjs +97 -64
  18. package/fesm2022/clr-angular-forms-combobox.mjs.map +1 -1
  19. package/fesm2022/clr-angular-forms-common.mjs +62 -57
  20. package/fesm2022/clr-angular-forms-common.mjs.map +1 -1
  21. package/fesm2022/clr-angular-forms-datalist.mjs +2 -14
  22. package/fesm2022/clr-angular-forms-datalist.mjs.map +1 -1
  23. package/fesm2022/clr-angular-forms-datepicker.mjs +20 -28
  24. package/fesm2022/clr-angular-forms-datepicker.mjs.map +1 -1
  25. package/fesm2022/clr-angular-forms-file-input.mjs +72 -53
  26. package/fesm2022/clr-angular-forms-file-input.mjs.map +1 -1
  27. package/fesm2022/clr-angular-forms-input.mjs +4 -18
  28. package/fesm2022/clr-angular-forms-input.mjs.map +1 -1
  29. package/fesm2022/clr-angular-forms-number-input.mjs +2 -14
  30. package/fesm2022/clr-angular-forms-number-input.mjs.map +1 -1
  31. package/fesm2022/clr-angular-forms-password.mjs +2 -14
  32. package/fesm2022/clr-angular-forms-password.mjs.map +1 -1
  33. package/fesm2022/clr-angular-forms-radio.mjs +13 -44
  34. package/fesm2022/clr-angular-forms-radio.mjs.map +1 -1
  35. package/fesm2022/clr-angular-forms-range.mjs +3 -16
  36. package/fesm2022/clr-angular-forms-range.mjs.map +1 -1
  37. package/fesm2022/clr-angular-forms-select.mjs +3 -16
  38. package/fesm2022/clr-angular-forms-select.mjs.map +1 -1
  39. package/fesm2022/clr-angular-forms-textarea.mjs +4 -17
  40. package/fesm2022/clr-angular-forms-textarea.mjs.map +1 -1
  41. package/fesm2022/clr-angular-forms.mjs +68 -8560
  42. package/fesm2022/clr-angular-forms.mjs.map +1 -1
  43. package/fesm2022/clr-angular-layout-tabs.mjs +1 -1
  44. package/fesm2022/clr-angular-layout-tabs.mjs.map +1 -1
  45. package/fesm2022/clr-angular-layout.mjs +15 -2057
  46. package/fesm2022/clr-angular-layout.mjs.map +1 -1
  47. package/fesm2022/clr-angular-modal.mjs +2 -2
  48. package/fesm2022/clr-angular-modal.mjs.map +1 -1
  49. package/fesm2022/clr-angular-popover-common.mjs +151 -85
  50. package/fesm2022/clr-angular-popover-common.mjs.map +1 -1
  51. package/fesm2022/clr-angular-popover-dropdown.mjs +7 -4
  52. package/fesm2022/clr-angular-popover-dropdown.mjs.map +1 -1
  53. package/fesm2022/clr-angular-popover-signpost.mjs +30 -15
  54. package/fesm2022/clr-angular-popover-signpost.mjs.map +1 -1
  55. package/fesm2022/clr-angular-popover-tooltip.mjs +7 -7
  56. package/fesm2022/clr-angular-popover-tooltip.mjs.map +1 -1
  57. package/fesm2022/clr-angular-popover.mjs +12 -2242
  58. package/fesm2022/clr-angular-popover.mjs.map +1 -1
  59. package/fesm2022/clr-angular-stepper.mjs +5 -5
  60. package/fesm2022/clr-angular-stepper.mjs.map +1 -1
  61. package/fesm2022/clr-angular-utils.mjs +15 -485
  62. package/fesm2022/clr-angular-utils.mjs.map +1 -1
  63. package/fesm2022/clr-angular-wizard.mjs +19 -11
  64. package/fesm2022/clr-angular-wizard.mjs.map +1 -1
  65. package/fesm2022/clr-angular.mjs +94 -38740
  66. package/fesm2022/clr-angular.mjs.map +1 -1
  67. package/package.json +2 -2
  68. package/popover/common/README.md +14 -12
  69. package/types/clr-angular-accordion.d.ts +1 -1
  70. package/types/clr-angular-button.d.ts +1 -1
  71. package/types/clr-angular-data-datagrid.d.ts +23 -33
  72. package/types/clr-angular-data.d.ts +4 -2136
  73. package/types/clr-angular-emphasis.d.ts +4 -220
  74. package/types/clr-angular-forms-combobox.d.ts +12 -5
  75. package/types/clr-angular-forms-common.d.ts +9 -9
  76. package/types/clr-angular-forms-datepicker.d.ts +8 -1
  77. package/types/clr-angular-forms-file-input.d.ts +5 -2
  78. package/types/clr-angular-forms.d.ts +26 -2062
  79. package/types/clr-angular-layout-tabs.d.ts +1 -1
  80. package/types/clr-angular-layout.d.ts +6 -463
  81. package/types/clr-angular-popover-common.d.ts +38 -13
  82. package/types/clr-angular-popover-dropdown.d.ts +2 -1
  83. package/types/clr-angular-popover-signpost.d.ts +15 -7
  84. package/types/clr-angular-popover-tooltip.d.ts +1 -1
  85. package/types/clr-angular-popover.d.ts +7 -559
  86. package/types/clr-angular-stepper.d.ts +1 -1
  87. package/types/clr-angular-utils.d.ts +8 -175
  88. package/types/clr-angular-wizard.d.ts +7 -4
  89. package/types/clr-angular.d.ts +22 -10238
@@ -6,14 +6,14 @@ import * as i1$1 from '@angular/forms';
6
6
  import { FormsModule } from '@angular/forms';
7
7
  import * as i1 from '@clr/angular/forms/common';
8
8
  import { ClrAbstractContainer, NgControlService, ControlIdService, ControlClassService, WrappedFormControl, ClrCommonFormsModule } from '@clr/angular/forms/common';
9
- import * as i4 from '@clr/angular/icon';
10
- import { ClarityIcons, exclamationCircleIcon, checkCircleIcon, angleIcon, windowCloseIcon, ClrIcon } from '@clr/angular/icon';
11
- import * as i4$1 from '@clr/angular/popover/common';
12
- import { POPOVER_HOST_ANCHOR, ClrPopoverPosition, ClrPopoverType, ClrPopoverHostDirective, ÇlrClrPopoverModuleNext as _lrClrPopoverModuleNext } from '@clr/angular/popover/common';
9
+ import * as i8 from '@clr/angular/icon';
10
+ import { ClarityIcons, successStandardIcon, errorStandardIcon, angleIcon, windowCloseIcon, ClrIcon } from '@clr/angular/icon';
11
+ import * as i4 from '@clr/angular/popover/common';
12
+ import { POPOVER_HOST_ORIGIN, ClrPopoverPosition, ClrPopoverType, ClrPopoverHostDirective, ClrPopoverModuleNext } from '@clr/angular/popover/common';
13
13
  import * as i5 from '@clr/angular/progress/spinner';
14
14
  import { ClrSpinnerModule } from '@clr/angular/progress/spinner';
15
15
  import * as i3$1 from '@clr/angular/utils';
16
- import { ArrowKeyDirection, normalizeKey, Keys, customFocusableItemProvider, uniqueIdFactory, ClrLoadingState, IF_ACTIVE_ID, LoadingListener, IF_ACTIVE_ID_PROVIDER, FOCUS_SERVICE_PROVIDER, ClrConditionalModule, ClrKeyFocusModule } from '@clr/angular/utils';
16
+ import { ArrowKeyDirection, Keys, customFocusableItemProvider, uniqueIdFactory, ClrLoadingState, IF_ACTIVE_ID, LoadingListener, IF_ACTIVE_ID_PROVIDER, FOCUS_SERVICE_PROVIDER, ClrConditionalModule, ClrKeyFocusModule } from '@clr/angular/utils';
17
17
  import { take } from 'rxjs/operators';
18
18
  import { BehaviorSubject, ReplaySubject } from 'rxjs';
19
19
 
@@ -63,12 +63,6 @@ class ClrComboboxContainer extends ClrAbstractContainer {
63
63
  }
64
64
  <div class="clr-control-container" [ngClass]="controlClass()" #controlContainer>
65
65
  <ng-content select="clr-combobox"></ng-content>
66
- @if (showInvalid) {
67
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
68
- }
69
- @if (showValid) {
70
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
71
- }
72
66
  @if (showHelper) {
73
67
  <ng-content select="clr-control-helper"></ng-content>
74
68
  }
@@ -79,7 +73,7 @@ class ClrComboboxContainer extends ClrAbstractContainer {
79
73
  <ng-content select="clr-control-success"></ng-content>
80
74
  }
81
75
  </div>
82
- `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i4.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i1.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
76
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
83
77
  }
84
78
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrComboboxContainer, decorators: [{
85
79
  type: Component,
@@ -92,12 +86,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
92
86
  }
93
87
  <div class="clr-control-container" [ngClass]="controlClass()" #controlContainer>
94
88
  <ng-content select="clr-combobox"></ng-content>
95
- @if (showInvalid) {
96
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
97
- }
98
- @if (showValid) {
99
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
100
- }
101
89
  @if (showHelper) {
102
90
  <ng-content select="clr-control-helper"></ng-content>
103
91
  }
@@ -131,20 +119,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
131
119
  * This software is released under MIT license.
132
120
  * The full license information can be found in LICENSE in the root directory of this project.
133
121
  */
134
- class MultiSelectComboboxModel {
122
+ class ComboboxModel {
123
+ constructor() {
124
+ this.identityFn = (item) => item;
125
+ }
126
+ }
127
+
128
+ /*
129
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
130
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
131
+ * This software is released under MIT license.
132
+ * The full license information can be found in LICENSE in the root directory of this project.
133
+ */
134
+ class MultiSelectComboboxModel extends ComboboxModel {
135
135
  containsItem(item) {
136
- if (this.model) {
137
- if (this.displayField && typeof item === 'object') {
138
- const includes = this.model.some(modelItem => {
139
- return modelItem[this.displayField] === item[this.displayField];
140
- });
141
- return includes;
142
- }
143
- else {
144
- return this.model.includes(item);
145
- }
136
+ if (!this.model) {
137
+ return false;
146
138
  }
147
- return false;
139
+ return this.model.some(m => this.identityFn(m) === this.identityFn(item));
148
140
  }
149
141
  select(item) {
150
142
  this.addItem(item);
@@ -207,7 +199,7 @@ class MultiSelectComboboxModel {
207
199
  if (this.model === null || this.model === undefined) {
208
200
  return;
209
201
  }
210
- const index = this.model.indexOf(item);
202
+ const index = this.model.findIndex(m => this.identityFn(m) === this.identityFn(item));
211
203
  if (index > -1) {
212
204
  this.model.splice(index, 1);
213
205
  }
@@ -224,9 +216,9 @@ class MultiSelectComboboxModel {
224
216
  * This software is released under MIT license.
225
217
  * The full license information can be found in LICENSE in the root directory of this project.
226
218
  */
227
- class SingleSelectComboboxModel {
219
+ class SingleSelectComboboxModel extends ComboboxModel {
228
220
  containsItem(item) {
229
- return this.model === item;
221
+ return this.model !== null && this.identityFn(this.model) === this.identityFn(item);
230
222
  }
231
223
  select(item) {
232
224
  this.model = item;
@@ -320,6 +312,7 @@ class OptionSelectionService {
320
312
  this._currentInput = '';
321
313
  this._inputChanged = new BehaviorSubject('');
322
314
  this._selectionChanged = new ReplaySubject(1);
315
+ this._identityFn = (item) => item;
323
316
  this.inputChanged = this._inputChanged.asObservable();
324
317
  }
325
318
  get displayField() {
@@ -350,6 +343,15 @@ class OptionSelectionService {
350
343
  get multiselectable() {
351
344
  return this.selectionModel instanceof MultiSelectComboboxModel;
352
345
  }
346
+ get identityFn() {
347
+ return this._identityFn;
348
+ }
349
+ set identityFn(value) {
350
+ this._identityFn = value || ((item) => item);
351
+ if (this.selectionModel) {
352
+ this.selectionModel.identityFn = this._identityFn;
353
+ }
354
+ }
353
355
  select(item) {
354
356
  if (item === null || item === undefined || this.selectionModel.containsItem(item)) {
355
357
  return;
@@ -376,13 +378,12 @@ class OptionSelectionService {
376
378
  this.selectionModel.unselect(item);
377
379
  this._selectionChanged.next(this.selectionModel);
378
380
  }
379
- // TODO: Add support for trackBy and compareFn
380
381
  setSelectionValue(value) {
381
- // NOTE: Currently we assume that no 2 options will have the same value
382
- // but Eudes and I discussed that this is a possibility but we will handle
383
- // this later
384
- // if selection is undefined, or its value hasn't changed, or changing from null <-> undefined, that's not really changing so we return
385
- if (!this.selectionModel || this.selectionModel.model === value || (!this.selectionModel.model && !value)) {
382
+ if (!this.selectionModel) {
383
+ return;
384
+ }
385
+ const current = this.selectionModel.model;
386
+ if (this.valuesEqualByIdentity(current, value)) {
386
387
  return;
387
388
  }
388
389
  this.selectionModel.model = value;
@@ -396,6 +397,39 @@ class OptionSelectionService {
396
397
  }
397
398
  return value;
398
399
  }
400
+ valuesEqualByIdentity(current, value) {
401
+ if (current === value) {
402
+ return true;
403
+ }
404
+ // Check if both are null or undefined or empty string.
405
+ if ((current === null || current === undefined || current === '') &&
406
+ (value === null || value === undefined || value === '')) {
407
+ return true;
408
+ }
409
+ // Check if one is null or undefined or empty string and the other is not.
410
+ if (current === null ||
411
+ current === undefined ||
412
+ current === '' ||
413
+ value === null ||
414
+ value === undefined ||
415
+ value === '') {
416
+ return false;
417
+ }
418
+ if (this.multiselectable) {
419
+ const cur = current;
420
+ const val = value;
421
+ if (cur.length !== val.length) {
422
+ return false;
423
+ }
424
+ // We only consider values equal if they are ordered the same way.
425
+ const curIds = cur.map(this._identityFn);
426
+ const valIds = val.map(this._identityFn);
427
+ return curIds.every((id, i) => id === valIds[i]);
428
+ }
429
+ else {
430
+ return this._identityFn(current) === this._identityFn(value);
431
+ }
432
+ }
399
433
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: OptionSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
400
434
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: OptionSelectionService }); }
401
435
  }
@@ -520,7 +554,7 @@ class ComboboxFocusHandler {
520
554
  // this service is only interested in keys that may move the focus
521
555
  handleTextInput(event) {
522
556
  let preventDefault = false;
523
- const key = normalizeKey(event.key);
557
+ const key = event.key;
524
558
  if (event) {
525
559
  switch (key) {
526
560
  case Keys.Enter:
@@ -577,26 +611,20 @@ class ComboboxFocusHandler {
577
611
  this.renderer.listen(el, 'blur', event => {
578
612
  if (this.focusOutOfComponent(event)) {
579
613
  this.popoverService.open = false;
580
- // Workaround for popover close-on-outside-click timing issues in Edge browser
581
- if (this.componentCdRef) {
582
- this.componentCdRef.detectChanges();
583
- }
584
614
  }
585
615
  });
586
616
  }
587
617
  }
588
618
  focusOutOfComponent(event) {
589
- // event.relatedTarget is null in IE11. In that case we use document.activeElement
590
- // which points to the element that becomes active as the blur event occurs on the input.
591
- const target = (event.relatedTarget || document.activeElement);
619
+ const target = event.relatedTarget;
592
620
  return !(this.textInput.contains(target) || this.trigger.contains(target) || this.listbox.contains(target));
593
621
  }
594
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ComboboxFocusHandler, deps: [{ token: i0.RendererFactory2 }, { token: i4$1.ClrPopoverService }, { token: OptionSelectionService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
622
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ComboboxFocusHandler, deps: [{ token: i0.RendererFactory2 }, { token: i4.ClrPopoverService }, { token: OptionSelectionService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
595
623
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ComboboxFocusHandler }); }
596
624
  }
597
625
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ComboboxFocusHandler, decorators: [{
598
626
  type: Injectable
599
- }], ctorParameters: () => [{ type: i0.RendererFactory2 }, { type: i4$1.ClrPopoverService }, { type: OptionSelectionService }, { type: undefined, decorators: [{
627
+ }], ctorParameters: () => [{ type: i0.RendererFactory2 }, { type: i4.ClrPopoverService }, { type: OptionSelectionService }, { type: undefined, decorators: [{
600
628
  type: Inject,
601
629
  args: [PLATFORM_ID]
602
630
  }] }] });
@@ -780,7 +808,7 @@ class ClrOptions {
780
808
  loadingStateChange(state) {
781
809
  this.loading = state === ClrLoadingState.LOADING;
782
810
  }
783
- 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: i3$1.ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: i4$1.ClrPopoverService }, { token: POPOVER_HOST_ANCHOR, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
811
+ 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: i3$1.ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: i4.ClrPopoverService }, { token: POPOVER_HOST_ORIGIN, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
784
812
  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: `
785
813
  @if (optionSelectionService.loading) {
786
814
  <div class="clr-combobox-options-loading">
@@ -846,11 +874,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
846
874
  }], ctorParameters: () => [{ type: OptionSelectionService }, { type: undefined, decorators: [{
847
875
  type: Inject,
848
876
  args: [IF_ACTIVE_ID]
849
- }] }, { type: i0.ElementRef }, { type: i3$1.ClrCommonStringsService }, { type: ComboboxFocusHandler }, { type: i4$1.ClrPopoverService }, { type: i0.ElementRef, decorators: [{
877
+ }] }, { type: i0.ElementRef }, { type: i3$1.ClrCommonStringsService }, { type: ComboboxFocusHandler }, { type: i4.ClrPopoverService }, { type: i0.ElementRef, decorators: [{
850
878
  type: Optional
851
879
  }, {
852
880
  type: Inject,
853
- args: [POPOVER_HOST_ANCHOR]
881
+ args: [POPOVER_HOST_ORIGIN]
854
882
  }] }, { type: undefined, decorators: [{
855
883
  type: Inject,
856
884
  args: [DOCUMENT]
@@ -897,8 +925,7 @@ class ClrCombobox extends WrappedFormControl {
897
925
  control.valueAccessor = this;
898
926
  }
899
927
  // default to SingleSelectComboboxModel, in case the optional input [ClrMulti] isn't used
900
- optionSelectionService.selectionModel = new SingleSelectComboboxModel();
901
- this.updateControlValue();
928
+ this.multiSelect = false;
902
929
  }
903
930
  get editable() {
904
931
  return this.optionSelectionService.editable;
@@ -906,6 +933,9 @@ class ClrCombobox extends WrappedFormControl {
906
933
  set editable(value) {
907
934
  this.optionSelectionService.editable = value;
908
935
  }
936
+ set identityFn(value) {
937
+ this.optionSelectionService.identityFn = value;
938
+ }
909
939
  get multiSelect() {
910
940
  return this.optionSelectionService.multiselectable;
911
941
  }
@@ -918,6 +948,7 @@ class ClrCombobox extends WrappedFormControl {
918
948
  // since the initial call to writeValue (caused by [ngModel] input) should happen after this
919
949
  this.optionSelectionService.selectionModel = new SingleSelectComboboxModel();
920
950
  }
951
+ this.optionSelectionService.selectionModel.identityFn = this.optionSelectionService.identityFn;
921
952
  this.updateControlValue();
922
953
  }
923
954
  // Override the id of WrappedFormControl, as we want to move it to the embedded input.
@@ -977,7 +1008,6 @@ class ClrCombobox extends WrappedFormControl {
977
1008
  }
978
1009
  }
979
1010
  ngAfterViewInit() {
980
- this.focusHandler.componentCdRef = this.cdr;
981
1011
  this.focusHandler.textInput = this.textbox.nativeElement;
982
1012
  this.focusHandler.trigger = this.trigger.nativeElement;
983
1013
  // The text input is the actual element we are wrapping
@@ -1140,14 +1170,14 @@ class ClrCombobox extends WrappedFormControl {
1140
1170
  }
1141
1171
  return [this.optionSelectionService.selectionModel.model];
1142
1172
  }
1143
- 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: i3$1.ClrCommonStringsService }, { token: i4$1.ClrPopoverService }, { token: ComboboxContainerService, optional: true }, { token: PLATFORM_ID }, { token: ComboboxFocusHandler }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1144
- 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: [
1173
+ 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: i3$1.ClrCommonStringsService }, { token: i4.ClrPopoverService }, { token: ComboboxContainerService, optional: true }, { token: PLATFORM_ID }, { token: ComboboxFocusHandler }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1174
+ 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: [
1145
1175
  OptionSelectionService,
1146
1176
  { provide: LoadingListener, useExisting: ClrCombobox },
1147
1177
  IF_ACTIVE_ID_PROVIDER,
1148
1178
  FOCUS_SERVICE_PROVIDER,
1149
1179
  COMBOBOX_FOCUS_HANDLER_PROVIDER,
1150
- ], 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: i4$1.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: i3.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: i4.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: i3$1.ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: i3$1.ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: i4$1.ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: i4$1.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] }); }
1180
+ ], 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: i4.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: i3.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: i8.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: i3$1.ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: i3$1.ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: i4.ClrPopoverOrigin, selector: "[clrPopoverOrigin]" }, { kind: "directive", type: i4.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose", "clrPopoverContentOrigin"] }] }); }
1151
1181
  }
1152
1182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrCombobox, decorators: [{
1153
1183
  type: Component,
@@ -1161,12 +1191,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1161
1191
  '[class.aria-required]': 'true',
1162
1192
  '[class.clr-combobox]': 'true',
1163
1193
  '[class.clr-combobox-disabled]': 'control?.disabled',
1164
- }, 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" }]
1194
+ }, 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" }]
1165
1195
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1$1.NgControl, decorators: [{
1166
1196
  type: Self
1167
1197
  }, {
1168
1198
  type: Optional
1169
- }] }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: OptionSelectionService }, { type: i3$1.ClrCommonStringsService }, { type: i4$1.ClrPopoverService }, { type: ComboboxContainerService, decorators: [{
1199
+ }] }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: OptionSelectionService }, { type: i3$1.ClrCommonStringsService }, { type: i4.ClrPopoverService }, { type: ComboboxContainerService, decorators: [{
1170
1200
  type: Optional
1171
1201
  }] }, { type: undefined, decorators: [{
1172
1202
  type: Inject,
@@ -1198,6 +1228,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1198
1228
  }], editable: [{
1199
1229
  type: Input,
1200
1230
  args: ['clrEditable']
1231
+ }], identityFn: [{
1232
+ type: Input,
1233
+ args: ['clrComboboxIdentityFn']
1201
1234
  }], multiSelect: [{
1202
1235
  type: Input,
1203
1236
  args: ['clrMulti']
@@ -1359,7 +1392,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1359
1392
  */
1360
1393
  class ClrComboboxModule {
1361
1394
  constructor() {
1362
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon, angleIcon, windowCloseIcon);
1395
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon, angleIcon, windowCloseIcon);
1363
1396
  }
1364
1397
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrComboboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1365
1398
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrComboboxModule, declarations: [ClrCombobox,
@@ -1374,7 +1407,7 @@ class ClrComboboxModule {
1374
1407
  ClrKeyFocusModule,
1375
1408
  ClrCommonFormsModule,
1376
1409
  ClrConditionalModule,
1377
- _lrClrPopoverModuleNext,
1410
+ ClrPopoverModuleNext,
1378
1411
  ClrSpinnerModule], exports: [ClrCommonFormsModule,
1379
1412
  ClrCombobox,
1380
1413
  ClrComboboxContainer,
@@ -1390,7 +1423,7 @@ class ClrComboboxModule {
1390
1423
  ClrKeyFocusModule,
1391
1424
  ClrCommonFormsModule,
1392
1425
  ClrConditionalModule,
1393
- _lrClrPopoverModuleNext,
1426
+ ClrPopoverModuleNext,
1394
1427
  ClrSpinnerModule, ClrCommonFormsModule,
1395
1428
  ClrConditionalModule] }); }
1396
1429
  }
@@ -1404,7 +1437,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1404
1437
  ClrKeyFocusModule,
1405
1438
  ClrCommonFormsModule,
1406
1439
  ClrConditionalModule,
1407
- _lrClrPopoverModuleNext,
1440
+ ClrPopoverModuleNext,
1408
1441
  ClrSpinnerModule,
1409
1442
  ],
1410
1443
  declarations: [