@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
@@ -2,13 +2,13 @@ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, Component, inject, TemplateRef, Directive, Injector, ContentChild, ViewChild, forwardRef, Input, HostListener, HostBinding, Self, Optional, NgModule } from '@angular/core';
3
3
  import * as i3 from '@clr/angular/forms/common';
4
4
  import { NgControlService, ClrAbstractContainer, ControlIdService, ControlClassService, WrappedFormControl, ClrCommonFormsModule } from '@clr/angular/forms/common';
5
- import * as i2$1 from '@clr/angular/utils';
5
+ import * as i2 from '@clr/angular/utils';
6
6
  import { ClrCommonStringsService } from '@clr/angular/utils';
7
- import * as i1 from '@angular/common';
7
+ import * as i1 from '@clr/angular/icon';
8
+ import { ClarityIcons, folderOpenIcon, successStandardIcon, errorStandardIcon, ClrIcon } from '@clr/angular/icon';
9
+ import * as i1$1 from '@angular/common';
8
10
  import { CommonModule } from '@angular/common';
9
- import * as i2 from '@clr/angular/icon';
10
- import { ClarityIcons, folderOpenIcon, ClrIcon } from '@clr/angular/icon';
11
- import * as i1$1 from '@angular/forms';
11
+ import * as i1$2 from '@angular/forms';
12
12
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
13
13
 
14
14
  /*
@@ -42,15 +42,23 @@ function clearFiles(fileInputElement) {
42
42
  const CLR_FILE_MESSAGES_TEMPLATE_CONTEXT = new InjectionToken('ClrFileMessagesTemplateContext');
43
43
  class ClrFileInfo {
44
44
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInfo, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45
- 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 }); }
45
+ 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: `
46
+ <span class="clr-subtext">
47
+ <ng-content></ng-content>
48
+ </span>
49
+ `, isInline: true }); }
46
50
  }
47
51
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInfo, decorators: [{
48
52
  type: Component,
49
53
  args: [{
50
54
  selector: 'clr-file-info',
51
- template: `<ng-content></ng-content>`,
55
+ template: `
56
+ <span class="clr-subtext">
57
+ <ng-content></ng-content>
58
+ </span>
59
+ `,
52
60
  host: {
53
- '[class.clr-subtext]': 'true',
61
+ '[class.clr-subtext-wrapper]': 'true',
54
62
  },
55
63
  standalone: false,
56
64
  }]
@@ -60,21 +68,31 @@ class ClrFileSuccess {
60
68
  this.context = inject(CLR_FILE_MESSAGES_TEMPLATE_CONTEXT);
61
69
  }
62
70
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileSuccess, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
63
- 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) {
64
- <ng-content></ng-content>
65
- }`, isInline: true }); }
71
+ 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", "class.success": "true" } }, ngImport: i0, template: `
72
+ @if (context.success) {
73
+ <cds-icon class="clr-validate-icon" shape="success-standard" status="success" aria-hidden="true"></cds-icon>
74
+ <span class="clr-subtext">
75
+ <ng-content></ng-content>
76
+ </span>
77
+ }
78
+ `, isInline: true, dependencies: [{ kind: "component", type: i1.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
66
79
  }
67
80
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileSuccess, decorators: [{
68
81
  type: Component,
69
82
  args: [{
70
83
  selector: 'clr-file-success',
71
84
  // We check for success here so that consumers don't have to.
72
- template: `@if (context.success) {
73
- <ng-content></ng-content>
74
- }`,
85
+ template: `
86
+ @if (context.success) {
87
+ <cds-icon class="clr-validate-icon" shape="success-standard" status="success" aria-hidden="true"></cds-icon>
88
+ <span class="clr-subtext">
89
+ <ng-content></ng-content>
90
+ </span>
91
+ }
92
+ `,
75
93
  host: {
76
- '[style.display]': 'context.success ? "inline-block" : "none"',
77
- '[class.clr-subtext]': 'true',
94
+ '[style.display]': 'context.success ? "flex" : "none"',
95
+ '[class.clr-subtext-wrapper]': 'true',
78
96
  '[class.success]': 'true',
79
97
  },
80
98
  standalone: false,
@@ -82,16 +100,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
82
100
  }] });
83
101
  class ClrFileError {
84
102
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
85
- 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 }); }
103
+ 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", "class.error": "true" } }, ngImport: i0, template: `
104
+ <cds-icon class="clr-validate-icon" shape="error-standard" status="danger" aria-hidden="true"></cds-icon>
105
+ <span class="clr-subtext">
106
+ <ng-content></ng-content>
107
+ </span>
108
+ `, isInline: true, dependencies: [{ kind: "component", type: i1.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
86
109
  }
87
110
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileError, decorators: [{
88
111
  type: Component,
89
112
  args: [{
90
113
  selector: 'clr-file-error',
91
- // The host should have an `@if` or `@if` that checks for the relevant error.
92
- template: `<ng-content></ng-content>`,
114
+ // The host should have an `*ngIf` or `@if` that checks for the relevant error.
115
+ template: `
116
+ <cds-icon class="clr-validate-icon" shape="error-standard" status="danger" aria-hidden="true"></cds-icon>
117
+ <span class="clr-subtext">
118
+ <ng-content></ng-content>
119
+ </span>
120
+ `,
93
121
  host: {
94
- '[class.clr-subtext]': 'true',
122
+ '[class.clr-subtext-wrapper]': 'true',
95
123
  '[class.error]': 'true',
96
124
  },
97
125
  standalone: false,
@@ -130,6 +158,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
130
158
  */
131
159
  class ClrFileList {
132
160
  constructor() {
161
+ this.injectorCache = new Map();
162
+ this.contextCache = new Map();
133
163
  this.injector = inject(Injector);
134
164
  this.commonStrings = inject(ClrCommonStringsService);
135
165
  this.ngControlService = inject(NgControlService, { optional: true });
@@ -168,7 +198,17 @@ class ClrFileList {
168
198
  maxFileSize: fileInputErrors.maxFileSize?.find(error => error.name === file.name),
169
199
  };
170
200
  const success = Object.values(errors).every(error => !error);
171
- return { $implicit: file, success, errors };
201
+ const cached = this.contextCache.get(file);
202
+ if (cached && cached.success === success && this.errorsEqual(cached.errors, errors)) {
203
+ return cached;
204
+ }
205
+ // new context is made and old reference replaced
206
+ const context = { $implicit: file, success, errors };
207
+ this.contextCache.set(file, context);
208
+ // new injector is made and old reference replaced
209
+ const injector = this.createFileMessagesTemplateInjector(context);
210
+ this.injectorCache.set(file, injector);
211
+ return context;
172
212
  }
173
213
  createFileMessagesTemplateInjector(fileMessagesTemplateContext) {
174
214
  return Injector.create({
@@ -176,6 +216,9 @@ class ClrFileList {
176
216
  providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }],
177
217
  });
178
218
  }
219
+ errorsEqual(a, b) {
220
+ return a.accept === b.accept && a.minFileSize === b.minFileSize && a.maxFileSize === b.maxFileSize;
221
+ }
179
222
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
180
223
  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: `
181
224
  @for (file of files; track file) {
@@ -199,24 +242,18 @@ class ClrFileList {
199
242
  <cds-icon shape="times"></cds-icon>
200
243
  </button>
201
244
  </span>
202
- <cds-icon
203
- class="clr-validate-icon"
204
- [shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
205
- [status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
206
- aria-hidden="true"
207
- ></cds-icon>
208
245
  </div>
209
246
  @if (fileMessagesTemplate) {
210
247
  <ng-container
211
248
  [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
212
249
  [ngTemplateOutletContext]="fileMessagesTemplateContext"
213
- [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
250
+ [ngTemplateOutletInjector]="injectorCache.get(file)"
214
251
  ></ng-container>
215
252
  }
216
253
  </div>
217
254
  }
218
255
  }
219
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
256
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
220
257
  }
221
258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileList, decorators: [{
222
259
  type: Component,
@@ -244,18 +281,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
244
281
  <cds-icon shape="times"></cds-icon>
245
282
  </button>
246
283
  </span>
247
- <cds-icon
248
- class="clr-validate-icon"
249
- [shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
250
- [status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
251
- aria-hidden="true"
252
- ></cds-icon>
253
284
  </div>
254
285
  @if (fileMessagesTemplate) {
255
286
  <ng-container
256
287
  [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
257
288
  [ngTemplateOutletContext]="fileMessagesTemplateContext"
258
- [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
289
+ [ngTemplateOutletInjector]="injectorCache.get(file)"
259
290
  ></ng-container>
260
291
  }
261
292
  </div>
@@ -379,12 +410,6 @@ class ClrFileInputContainer extends ClrAbstractContainer {
379
410
  <cds-icon shape="times" status="neutral"></cds-icon>
380
411
  </button>
381
412
  }
382
- @if (showInvalid) {
383
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
384
- }
385
- @if (showValid) {
386
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
387
- }
388
413
  </div>
389
414
  @if (showHelper) {
390
415
  <ng-content select="clr-control-helper"></ng-content>
@@ -402,7 +427,7 @@ class ClrFileInputContainer extends ClrAbstractContainer {
402
427
  <ng-content select="clr-file-list"></ng-content>
403
428
  </ng-container>
404
429
  </div>
405
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i3.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
430
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i1.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i3.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
406
431
  }
407
432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInputContainer, decorators: [{
408
433
  type: Component,
@@ -453,12 +478,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
453
478
  <cds-icon shape="times" status="neutral"></cds-icon>
454
479
  </button>
455
480
  }
456
- @if (showInvalid) {
457
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
458
- }
459
- @if (showValid) {
460
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
461
- }
462
481
  </div>
463
482
  @if (showHelper) {
464
483
  <ng-content select="clr-control-helper"></ng-content>
@@ -554,7 +573,7 @@ class ClrFileInput extends WrappedFormControl {
554
573
  clearFilesButtonLabel,
555
574
  };
556
575
  }
557
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInput, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i1$1.NgControl, optional: true, self: true }, { token: i2$1.ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Directive }); }
576
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInput, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i1$2.NgControl, optional: true, self: true }, { token: i2.ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Directive }); }
558
577
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.3", type: ClrFileInput, isStandalone: false, selector: "input[type=\"file\"][clrFileInput]", host: { attributes: { "tabindex": "-1", "aria-hidden": "true" }, listeners: { "change": "handleChange()" }, properties: { "class.clr-file-input": "true", "disabled": "this.disabled" } }, usesInheritance: true, ngImport: i0 }); }
559
578
  }
560
579
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInput, decorators: [{
@@ -568,11 +587,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
568
587
  },
569
588
  standalone: false,
570
589
  }]
571
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i1$1.NgControl, decorators: [{
590
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i1$2.NgControl, decorators: [{
572
591
  type: Self
573
592
  }, {
574
593
  type: Optional
575
- }] }, { type: i2$1.ClrCommonStringsService }], propDecorators: { disabled: [{
594
+ }] }, { type: i2.ClrCommonStringsService }], propDecorators: { disabled: [{
576
595
  type: HostBinding,
577
596
  args: ['disabled']
578
597
  }], handleChange: [{
@@ -742,7 +761,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
742
761
  */
743
762
  class ClrFileInputModule {
744
763
  constructor() {
745
- ClarityIcons.addIcons(folderOpenIcon);
764
+ ClarityIcons.addIcons(folderOpenIcon, successStandardIcon, errorStandardIcon);
746
765
  }
747
766
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
748
767
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrFileInputModule, declarations: [ClrFileInput,
@@ -1 +1 @@
1
- {"version":3,"file":"clr-angular-forms-file-input.mjs","sources":["../../../projects/angular/forms/file-input/file-input.helpers.ts","../../../projects/angular/forms/file-input/file-messages.ts","../../../projects/angular/forms/file-input/file-messages-template.ts","../../../projects/angular/forms/file-input/file-list.ts","../../../projects/angular/forms/file-input/file-input-container.ts","../../../projects/angular/forms/file-input/file-input.ts","../../../projects/angular/forms/file-input/file-input-validator.ts","../../../projects/angular/forms/file-input/file-input-validator-errors.ts","../../../projects/angular/forms/file-input/file-input-value-accessor.ts","../../../projects/angular/forms/file-input/file-input.module.ts","../../../projects/angular/forms/file-input/index.ts","../../../projects/angular/forms/file-input/clr-angular-forms-file-input.ts"],"sourcesContent":["/*\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\nexport function buildFileList(files: File[]) {\n const dataTransfer = new DataTransfer();\n\n for (const file of files) {\n dataTransfer.items.add(file);\n }\n\n return dataTransfer.files;\n}\n\nexport function selectFiles(fileInputElement: HTMLInputElement, files: File[] | FileList) {\n fileInputElement.files = files instanceof FileList ? files : buildFileList(files);\n fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));\n}\n\nexport function clearFiles(fileInputElement: HTMLInputElement) {\n fileInputElement.value = '';\n fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));\n}\n","/*\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\nimport { Component, inject, InjectionToken } from '@angular/core';\n\nimport { ClrFileMessagesTemplateContext } from './file-messages-template';\n\nexport const CLR_FILE_MESSAGES_TEMPLATE_CONTEXT = new InjectionToken<ClrFileMessagesTemplateContext>(\n 'ClrFileMessagesTemplateContext'\n);\n\n@Component({\n selector: 'clr-file-info',\n template: `<ng-content></ng-content>`,\n host: {\n '[class.clr-subtext]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileInfo {}\n\n@Component({\n selector: 'clr-file-success',\n // We check for success here so that consumers don't have to.\n template: `@if (context.success) {\n <ng-content></ng-content>\n }`,\n host: {\n '[style.display]': 'context.success ? \"inline-block\" : \"none\"',\n '[class.clr-subtext]': 'true',\n '[class.success]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileSuccess {\n protected readonly context: ClrFileMessagesTemplateContext = inject(CLR_FILE_MESSAGES_TEMPLATE_CONTEXT);\n}\n\n@Component({\n selector: 'clr-file-error',\n // The host should have an `@if` or `@if` that checks for the relevant error.\n template: `<ng-content></ng-content>`,\n host: {\n '[class.clr-subtext]': 'true',\n '[class.error]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileError {}\n","/*\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\nimport { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { ClrFileAcceptError, ClrFileMaxFileSizeError, ClrFileMinFileSizeError } from './file-input-validator-errors';\n\nexport interface ClrSingleFileValidationErrors {\n accept?: ClrFileAcceptError;\n minFileSize?: ClrFileMinFileSizeError;\n maxFileSize?: ClrFileMaxFileSizeError;\n}\n\nexport interface ClrFileMessagesTemplateContext {\n $implicit: File;\n success: boolean;\n errors: ClrSingleFileValidationErrors;\n}\n\n@Directive({\n selector: 'ng-template[clr-file-messages]',\n standalone: false,\n})\nexport class ClrFileMessagesTemplate {\n readonly templateRef: TemplateRef<ClrFileMessagesTemplateContext> = inject(TemplateRef);\n\n static ngTemplateContextGuard(\n directive: ClrFileMessagesTemplate,\n context: unknown\n ): context is ClrFileMessagesTemplateContext {\n return true;\n }\n}\n","/*\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\nimport { Component, ContentChild, inject, Injector } from '@angular/core';\nimport { NgControlService } from '@clr/angular/forms/common';\nimport { ClrCommonStringsService } from '@clr/angular/utils';\n\nimport { ClrFileInputContainer } from './file-input-container';\nimport { ClrFileListValidationErrors } from './file-input-validator-errors';\nimport { selectFiles } from './file-input.helpers';\nimport { CLR_FILE_MESSAGES_TEMPLATE_CONTEXT } from './file-messages';\nimport {\n ClrFileMessagesTemplate,\n ClrFileMessagesTemplateContext,\n ClrSingleFileValidationErrors,\n} from './file-messages-template';\n\n@Component({\n selector: 'clr-file-list',\n template: `\n @for (file of files; track file) {\n @if (createFileMessagesTemplateContext(file); as fileMessagesTemplateContext) {\n <div\n role=\"listitem\"\n class=\"clr-file-list-item\"\n [ngClass]=\"{\n 'clr-error': !fileMessagesTemplateContext.success,\n 'clr-success': fileMessagesTemplateContext.success,\n }\"\n >\n <div class=\"clr-file-label-and-status-icon\">\n <span class=\"label clr-file-label\">\n {{ file.name }}\n <button\n class=\"btn btn-sm btn-link-neutral btn-icon clr-file-clear-button\"\n [attr.aria-label]=\"getClearFileLabel(file.name)\"\n (click)=\"clearFile(file)\"\n >\n <cds-icon shape=\"times\"></cds-icon>\n </button>\n </span>\n <cds-icon\n class=\"clr-validate-icon\"\n [shape]=\"fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'\"\n [status]=\"fileMessagesTemplateContext.success ? 'success' : 'danger'\"\n aria-hidden=\"true\"\n ></cds-icon>\n </div>\n @if (fileMessagesTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"fileMessagesTemplate.templateRef\"\n [ngTemplateOutletContext]=\"fileMessagesTemplateContext\"\n [ngTemplateOutletInjector]=\"createFileMessagesTemplateInjector(fileMessagesTemplateContext)\"\n ></ng-container>\n }\n </div>\n }\n }\n `,\n host: {\n '[attr.role]': '\"list\"',\n '[class.clr-file-list]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileList {\n @ContentChild(ClrFileMessagesTemplate) protected readonly fileMessagesTemplate: ClrFileMessagesTemplate;\n\n private readonly injector = inject(Injector);\n private readonly commonStrings = inject(ClrCommonStringsService);\n private readonly ngControlService = inject(NgControlService, { optional: true });\n private readonly fileInputContainer = inject(ClrFileInputContainer, { optional: true });\n\n constructor() {\n if (!this.ngControlService || !this.fileInputContainer) {\n throw new Error('The clr-file-list component can only be used within a clr-file-input-container.');\n }\n }\n\n protected get files() {\n if (!this.fileInputContainer.fileInput) {\n return [];\n }\n\n const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;\n\n return Array.from(fileInputElement.files).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n protected getClearFileLabel(filename: string) {\n return this.commonStrings.parse(this.commonStrings.keys.clearFile, {\n FILE: filename,\n });\n }\n\n protected clearFile(fileToRemove: File) {\n if (!this.fileInputContainer.fileInput) {\n return;\n }\n\n const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;\n const files = Array.from(fileInputElement.files);\n const newFiles = files.filter(file => file !== fileToRemove);\n\n selectFiles(fileInputElement, newFiles);\n this.fileInputContainer.focusBrowseButton();\n }\n\n protected createFileMessagesTemplateContext(file: File): ClrFileMessagesTemplateContext {\n const fileInputErrors: ClrFileListValidationErrors = this.ngControlService.controls[0].errors || {};\n\n const errors: ClrSingleFileValidationErrors = {\n accept: fileInputErrors.accept?.find(error => error.name === file.name),\n minFileSize: fileInputErrors.minFileSize?.find(error => error.name === file.name),\n maxFileSize: fileInputErrors.maxFileSize?.find(error => error.name === file.name),\n };\n\n const success = Object.values(errors).every(error => !error);\n\n return { $implicit: file, success, errors };\n }\n\n protected createFileMessagesTemplateInjector(fileMessagesTemplateContext: ClrFileMessagesTemplateContext) {\n return Injector.create({\n parent: this.injector,\n providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }],\n });\n }\n}\n","/*\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\nimport { Component, ContentChild, ElementRef, forwardRef, inject, Input, ViewChild } from '@angular/core';\nimport {\n ClrAbstractContainer,\n ControlClassService,\n ControlIdService,\n NgControlService,\n} from '@clr/angular/forms/common';\nimport { ClrCommonStringsService } from '@clr/angular/utils';\n\nimport { ClrFileInput } from './file-input';\nimport { selectFiles } from './file-input.helpers';\nimport { ClrFileList } from './file-list';\nimport { ClrFileError, ClrFileSuccess } from './file-messages';\n\n@Component({\n selector: 'clr-file-input-container',\n template: `\n <ng-content select=\"label\"></ng-content>\n @if (!label && addGrid()) {\n <label></label>\n }\n <div class=\"clr-control-container\" [ngClass]=\"controlClass()\">\n <div class=\"clr-file-input-wrapper\">\n <ng-content select=\"[clrFileInput]\"></ng-content>\n\n <!-- file input to handle adding new files to selection when file list is present (prevent replacing selected files on the main file input) -->\n @if (fileList) {\n <input\n #fileListFileInput\n type=\"file\"\n class=\"clr-file-input\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [disabled]=\"disabled\"\n (change)=\"addFilesToSelection(fileListFileInput.files)\"\n />\n }\n\n <button\n #browseButton\n type=\"button\"\n class=\"btn btn-sm clr-file-input-browse-button\"\n [attr.aria-describedby]=\"browseButtonDescribedBy\"\n [disabled]=\"disabled\"\n (click)=\"browse()\"\n >\n <cds-icon shape=\"folder-open\"></cds-icon>\n <span class=\"clr-file-input-browse-button-text\">{{ browseButtonText }}</span>\n </button>\n @if (!fileList && fileInput?.selection?.fileCount) {\n <button\n type=\"button\"\n class=\"btn btn-sm clr-file-input-clear-button\"\n [attr.aria-label]=\"fileInput?.selection?.clearFilesButtonLabel\"\n (click)=\"clearSelectedFiles()\"\n >\n <cds-icon shape=\"times\" status=\"neutral\"></cds-icon>\n </button>\n }\n @if (showInvalid) {\n <cds-icon class=\"clr-validate-icon\" shape=\"exclamation-circle\" status=\"danger\" aria-hidden=\"true\"></cds-icon>\n }\n @if (showValid) {\n <cds-icon class=\"clr-validate-icon\" shape=\"check-circle\" status=\"success\" aria-hidden=\"true\"></cds-icon>\n }\n </div>\n @if (showHelper) {\n <ng-content select=\"clr-control-helper\"></ng-content>\n }\n @if (showInvalid) {\n <ng-content select=\"clr-control-error\"></ng-content>\n }\n @if (showValid) {\n <ng-content select=\"clr-control-success\"></ng-content>\n }\n\n <!-- If this is present, this file input becomes an \"advanced\" file input. -->\n <ng-container>\n <div class=\"clr-file-list-break\"></div>\n <ng-content select=\"clr-file-list\"></ng-content>\n </ng-container>\n </div>\n `,\n host: {\n '[class.clr-form-control]': 'true',\n '[class.clr-form-control-disabled]': 'disabled',\n '[class.clr-row]': 'addGrid()',\n },\n providers: [NgControlService, ControlIdService, ControlClassService],\n standalone: false,\n})\nexport class ClrFileInputContainer extends ClrAbstractContainer {\n @Input('clrButtonLabel') customButtonLabel: string;\n\n @ContentChild(forwardRef(() => ClrFileInput)) readonly fileInput: ClrFileInput;\n @ContentChild(forwardRef(() => ClrFileList)) protected readonly fileList: ClrFileList;\n\n @ViewChild('browseButton') private browseButtonElementRef: ElementRef<HTMLButtonElement>;\n @ViewChild('fileListFileInput') private fileListFileInputElementRef: ElementRef<HTMLInputElement>;\n\n // These are for the \"message present\" override properties\n @ContentChild(ClrFileSuccess) private readonly fileSuccessComponent: ClrFileSuccess;\n @ContentChild(ClrFileError) private readonly fileErrorComponent: ClrFileError;\n\n private readonly commonStrings = inject(ClrCommonStringsService);\n\n protected get accept() {\n return this.fileInput.elementRef.nativeElement.accept;\n }\n\n protected get multiple() {\n return this.fileInput.elementRef.nativeElement.multiple;\n }\n\n protected get disabled() {\n return this.fileInput.elementRef.nativeElement.disabled || (this.control && this.control.disabled);\n }\n\n protected get browseButtonText() {\n const selectionButtonLabel = this.fileList ? undefined : this.fileInput?.selection?.buttonLabel;\n\n return selectionButtonLabel || this.customButtonLabel || this.commonStrings.keys.browse;\n }\n\n protected get browseButtonDescribedBy() {\n return `${this.label?.forAttr} ${this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby')}`;\n }\n\n protected override get successMessagePresent() {\n return super.successMessagePresent || !!this.fileSuccessComponent;\n }\n\n protected override get errorMessagePresent() {\n return super.errorMessagePresent || !!this.fileErrorComponent;\n }\n\n focusBrowseButton() {\n this.browseButtonElementRef.nativeElement.focus();\n }\n\n protected browse() {\n const fileInputElementRef =\n this.fileList && this.multiple ? this.fileListFileInputElementRef : this.fileInput.elementRef;\n\n fileInputElementRef.nativeElement.click();\n }\n\n protected clearSelectedFiles() {\n this.fileInput.elementRef.nativeElement.value = '';\n this.fileInput.elementRef.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));\n\n this.focusBrowseButton();\n }\n\n protected addFilesToSelection(newFiles: FileList) {\n if (!newFiles.length) {\n return;\n }\n\n // start with new files\n const mergedFiles = [...newFiles];\n\n // add existing files if a new file doesn't have the same name\n for (const existingFile of this.fileInput.elementRef.nativeElement.files) {\n if (!mergedFiles.some(file => file.name === existingFile.name)) {\n mergedFiles.push(existingFile);\n }\n }\n\n // update file selection\n selectFiles(this.fileInput.elementRef.nativeElement, mergedFiles);\n }\n}\n","/*\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\nimport {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n Injector,\n Optional,\n Renderer2,\n Self,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { WrappedFormControl } from '@clr/angular/forms/common';\nimport { ClrCommonStringsService } from '@clr/angular/utils';\n\nimport { ClrFileInputContainer } from './file-input-container';\n\nexport interface ClrFileInputSelection {\n fileCount: number;\n buttonLabel: string;\n clearFilesButtonLabel: string;\n}\n\n@Directive({\n selector: 'input[type=\"file\"][clrFileInput]',\n host: {\n tabindex: '-1', // Remove the hidden file `input` element from the tab order because the browse `button` replaces it.\n 'aria-hidden': 'true', // Remove the hidden file `input` element from the accessibility tree because the browse `button` replaces it.\n '[class.clr-file-input]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileInput extends WrappedFormControl<ClrFileInputContainer> {\n selection: ClrFileInputSelection = undefined;\n\n constructor(\n injector: Injector,\n renderer: Renderer2,\n viewContainerRef: ViewContainerRef,\n readonly elementRef: ElementRef<HTMLInputElement>,\n @Self() @Optional() private readonly control: NgControl,\n private readonly commonStrings: ClrCommonStringsService\n ) {\n super(viewContainerRef, ClrFileInputContainer, injector, control, renderer, elementRef);\n }\n\n @HostBinding('disabled')\n protected get disabled() {\n return this.elementRef.nativeElement.disabled || (this.control && this.control.disabled);\n }\n\n @HostListener('change')\n private handleChange() {\n this.updateSelection();\n }\n\n private updateSelection() {\n const files = this.elementRef.nativeElement.files;\n let selectionButtonLabel: string;\n let clearFilesButtonLabel: string;\n\n if (files?.length === 1) {\n const filename = files[0].name;\n\n selectionButtonLabel = filename;\n\n clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFile, {\n FILE: filename,\n });\n } else if (files?.length > 1) {\n const fileCount = files.length.toString();\n\n selectionButtonLabel = this.commonStrings.parse(this.commonStrings.keys.fileCount, {\n COUNT: fileCount,\n });\n\n clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFiles, {\n COUNT: fileCount,\n });\n }\n\n this.selection = {\n fileCount: files.length,\n buttonLabel: selectionButtonLabel,\n clearFilesButtonLabel,\n };\n }\n}\n","/*\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\nimport { Directive, ElementRef, Input } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\n\nimport { ClrFileListValidationErrors } from './file-input-validator-errors';\n\n@Directive({\n selector: 'input[type=\"file\"][clrFileInput]',\n providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }],\n standalone: false,\n})\nexport class ClrFileInputValidator implements Validator {\n @Input('clrMinFileSize') minFileSize: number;\n @Input('clrMaxFileSize') maxFileSize: number;\n\n constructor(private readonly elementRef: ElementRef<HTMLInputElement>) {}\n\n validate(control: AbstractControl<FileList>): ValidationErrors {\n const files = control.value;\n const fileInputElement = this.elementRef.nativeElement;\n\n const errors: ClrFileListValidationErrors = {};\n\n // required validation (native attribute)\n if (fileInputElement.required && files?.length === 0) {\n errors.required = true;\n }\n\n const accept = fileInputElement.accept ? fileInputElement.accept.split(',').map(type => type.trim()) : null;\n\n if (files?.length > 0 && (accept || this.minFileSize || this.maxFileSize)) {\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n\n // accept validation (native attribute)\n if (accept && accept.length) {\n if (!this.validateAccept(file, accept)) {\n errors.accept = errors.accept || [];\n errors.accept.push({\n name: file.name,\n accept,\n type: file.type || '',\n extension: this.getSuffixByDepth(file.name, 2), // last up to 2 parts for reporting\n });\n }\n }\n\n // min file validation (custom input)\n if (this.minFileSize && file.size < this.minFileSize) {\n errors.minFileSize = errors.minFileSize || [];\n errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });\n }\n\n // max file validation (custom input)\n if (this.maxFileSize && file.size > this.maxFileSize) {\n errors.maxFileSize = errors.maxFileSize || [];\n errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });\n }\n }\n }\n\n return Object.keys(errors).length ? errors : null;\n }\n\n private getSuffixByDepth(filename: string, depth: number): string {\n const match = filename.toLowerCase().match(new RegExp(`(\\\\.[^.]+){1,${depth}}$`, 'i'));\n return match ? match[0] : '';\n }\n\n private validateAccept(file: File, acceptList: string[]): boolean {\n const name = file.name.toLowerCase();\n const type = (file.type || '').toLowerCase();\n\n for (const entryRaw of acceptList) {\n const entry = entryRaw.trim().toLowerCase();\n if (!entry) {\n continue;\n }\n\n // Extension check\n if (entry.startsWith('.')) {\n const depth = (entry.match(/\\./g) || []).length;\n if (this.getSuffixByDepth(name, depth) === entry) {\n return true;\n }\n continue;\n }\n\n // MIME check\n if (entry.endsWith('/*')) {\n const prefix = entry.slice(0, entry.length - 1); // keep trailing slash\n if (type.startsWith(prefix)) {\n return true;\n }\n } else if (entry.includes('/') && type === entry) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/*\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\nexport interface ClrFileListValidationErrors {\n required?: boolean;\n accept?: ClrFileAcceptError[];\n minFileSize?: ClrFileMinFileSizeError[];\n maxFileSize?: ClrFileMaxFileSizeError[];\n}\n\nexport interface ClrFileAcceptError {\n /**\n * The name of the selected file.\n */\n name: string;\n\n /**\n * The file types that are accepted by the file input.\n */\n accept: string[];\n\n /**\n * The actual MIME type of the selected file.\n */\n type: string;\n\n /**\n * The actual extension of the selected file.\n */\n extension: string;\n}\n\nexport interface ClrFileMinFileSizeError {\n /**\n * The name of the selected file.\n */\n name: string;\n\n /**\n * The minimum file size that is accepted by the file input.\n */\n minFileSize: number;\n\n /**\n * The actual size of the selected file.\n */\n actualFileSize: number;\n}\n\nexport interface ClrFileMaxFileSizeError {\n /**\n * The name of the selected file.\n */\n name: string;\n\n /**\n * The maximum file size that is accepted by the file input.\n */\n maxFileSize: number;\n\n /**\n * The actual size of the selected file.\n */\n actualFileSize: number;\n}\n","/*\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\nimport { Directive, ElementRef, HostListener } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { clearFiles, selectFiles } from './file-input.helpers';\n\n@Directive({\n selector: 'input[type=\"file\"][clrFileInput]',\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: ClrFileInputValueAccessor, multi: true }],\n standalone: false,\n})\nexport class ClrFileInputValueAccessor implements ControlValueAccessor {\n constructor(private readonly elementRef: ElementRef<HTMLInputElement>) {}\n\n writeValue(value: FileList) {\n if (value !== undefined && value !== null && !(value instanceof FileList)) {\n throw new Error('The value of a file input control must be a FileList.');\n }\n\n if (value) {\n selectFiles(this.elementRef.nativeElement, value);\n } else if (this.elementRef.nativeElement.files.length) {\n clearFiles(this.elementRef.nativeElement);\n }\n }\n\n registerOnChange(fn: (value: FileList) => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n @HostListener('change')\n private handleChange() {\n this.onTouched();\n this.onChange(this.elementRef.nativeElement.files);\n }\n\n private onChange = (_value: FileList) => {};\n\n private onTouched = () => {};\n}\n","/*\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\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ClrCommonFormsModule } from '@clr/angular/forms/common';\nimport { ClarityIcons, ClrIcon, folderOpenIcon } from '@clr/angular/icon';\n\nimport { ClrFileInput } from './file-input';\nimport { ClrFileInputContainer } from './file-input-container';\nimport { ClrFileInputValidator } from './file-input-validator';\nimport { ClrFileInputValueAccessor } from './file-input-value-accessor';\nimport { ClrFileList } from './file-list';\nimport { ClrFileError, ClrFileInfo, ClrFileSuccess } from './file-messages';\nimport { ClrFileMessagesTemplate } from './file-messages-template';\n\n@NgModule({\n imports: [CommonModule, ClrIcon, ClrCommonFormsModule],\n declarations: [\n ClrFileInput,\n ClrFileInputContainer,\n ClrFileInputValidator,\n ClrFileInputValueAccessor,\n ClrFileList,\n ClrFileMessagesTemplate,\n ClrFileInfo,\n ClrFileSuccess,\n ClrFileError,\n ],\n exports: [\n ClrCommonFormsModule,\n ClrFileInput,\n ClrFileInputContainer,\n ClrFileInputValidator,\n ClrFileInputValueAccessor,\n ClrFileList,\n ClrFileMessagesTemplate,\n ClrFileInfo,\n ClrFileSuccess,\n ClrFileError,\n ],\n})\nexport class ClrFileInputModule {\n constructor() {\n ClarityIcons.addIcons(folderOpenIcon);\n }\n}\n","/*\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\nexport * from './file-input';\nexport * from './file-input-validator';\nexport * from './file-input-validator-errors';\nexport * from './file-input-value-accessor';\nexport * from './file-input-container';\nexport * from './file-list';\nexport * from './file-messages-template';\nexport * from './file-messages';\nexport * from './file-input.module';\nexport * from './file-input.helpers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"clr-angular-forms-file-input.mjs","sources":["../../../projects/angular/forms/file-input/file-input.helpers.ts","../../../projects/angular/forms/file-input/file-messages.ts","../../../projects/angular/forms/file-input/file-messages-template.ts","../../../projects/angular/forms/file-input/file-list.ts","../../../projects/angular/forms/file-input/file-input-container.ts","../../../projects/angular/forms/file-input/file-input.ts","../../../projects/angular/forms/file-input/file-input-validator.ts","../../../projects/angular/forms/file-input/file-input-validator-errors.ts","../../../projects/angular/forms/file-input/file-input-value-accessor.ts","../../../projects/angular/forms/file-input/file-input.module.ts","../../../projects/angular/forms/file-input/index.ts","../../../projects/angular/forms/file-input/clr-angular-forms-file-input.ts"],"sourcesContent":["/*\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\nexport function buildFileList(files: File[]) {\n const dataTransfer = new DataTransfer();\n\n for (const file of files) {\n dataTransfer.items.add(file);\n }\n\n return dataTransfer.files;\n}\n\nexport function selectFiles(fileInputElement: HTMLInputElement, files: File[] | FileList) {\n fileInputElement.files = files instanceof FileList ? files : buildFileList(files);\n fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));\n}\n\nexport function clearFiles(fileInputElement: HTMLInputElement) {\n fileInputElement.value = '';\n fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));\n}\n","/*\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\nimport { Component, inject, InjectionToken } from '@angular/core';\n\nimport { ClrFileMessagesTemplateContext } from './file-messages-template';\n\nexport const CLR_FILE_MESSAGES_TEMPLATE_CONTEXT = new InjectionToken<ClrFileMessagesTemplateContext>(\n 'ClrFileMessagesTemplateContext'\n);\n\n@Component({\n selector: 'clr-file-info',\n template: `\n <span class=\"clr-subtext\">\n <ng-content></ng-content>\n </span>\n `,\n host: {\n '[class.clr-subtext-wrapper]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileInfo {}\n\n@Component({\n selector: 'clr-file-success',\n // We check for success here so that consumers don't have to.\n template: `\n @if (context.success) {\n <cds-icon class=\"clr-validate-icon\" shape=\"success-standard\" status=\"success\" aria-hidden=\"true\"></cds-icon>\n <span class=\"clr-subtext\">\n <ng-content></ng-content>\n </span>\n }\n `,\n host: {\n '[style.display]': 'context.success ? \"flex\" : \"none\"',\n '[class.clr-subtext-wrapper]': 'true',\n '[class.success]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileSuccess {\n protected readonly context: ClrFileMessagesTemplateContext = inject(CLR_FILE_MESSAGES_TEMPLATE_CONTEXT);\n}\n\n@Component({\n selector: 'clr-file-error',\n // The host should have an `*ngIf` or `@if` that checks for the relevant error.\n template: `\n <cds-icon class=\"clr-validate-icon\" shape=\"error-standard\" status=\"danger\" aria-hidden=\"true\"></cds-icon>\n <span class=\"clr-subtext\">\n <ng-content></ng-content>\n </span>\n `,\n host: {\n '[class.clr-subtext-wrapper]': 'true',\n '[class.error]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileError {}\n","/*\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\nimport { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { ClrFileAcceptError, ClrFileMaxFileSizeError, ClrFileMinFileSizeError } from './file-input-validator-errors';\n\nexport interface ClrSingleFileValidationErrors {\n accept?: ClrFileAcceptError;\n minFileSize?: ClrFileMinFileSizeError;\n maxFileSize?: ClrFileMaxFileSizeError;\n}\n\nexport interface ClrFileMessagesTemplateContext {\n $implicit: File;\n success: boolean;\n errors: ClrSingleFileValidationErrors;\n}\n\n@Directive({\n selector: 'ng-template[clr-file-messages]',\n standalone: false,\n})\nexport class ClrFileMessagesTemplate {\n readonly templateRef: TemplateRef<ClrFileMessagesTemplateContext> = inject(TemplateRef);\n\n static ngTemplateContextGuard(\n directive: ClrFileMessagesTemplate,\n context: unknown\n ): context is ClrFileMessagesTemplateContext {\n return true;\n }\n}\n","/*\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\nimport { Component, ContentChild, inject, Injector } from '@angular/core';\nimport { NgControlService } from '@clr/angular/forms/common';\nimport { ClrCommonStringsService } from '@clr/angular/utils';\n\nimport { ClrFileInputContainer } from './file-input-container';\nimport { ClrFileListValidationErrors } from './file-input-validator-errors';\nimport { selectFiles } from './file-input.helpers';\nimport { CLR_FILE_MESSAGES_TEMPLATE_CONTEXT } from './file-messages';\nimport {\n ClrFileMessagesTemplate,\n ClrFileMessagesTemplateContext,\n ClrSingleFileValidationErrors,\n} from './file-messages-template';\n\n@Component({\n selector: 'clr-file-list',\n template: `\n @for (file of files; track file) {\n @if (createFileMessagesTemplateContext(file); as fileMessagesTemplateContext) {\n <div\n role=\"listitem\"\n class=\"clr-file-list-item\"\n [ngClass]=\"{\n 'clr-error': !fileMessagesTemplateContext.success,\n 'clr-success': fileMessagesTemplateContext.success,\n }\"\n >\n <div class=\"clr-file-label-and-status-icon\">\n <span class=\"label clr-file-label\">\n {{ file.name }}\n <button\n class=\"btn btn-sm btn-link-neutral btn-icon clr-file-clear-button\"\n [attr.aria-label]=\"getClearFileLabel(file.name)\"\n (click)=\"clearFile(file)\"\n >\n <cds-icon shape=\"times\"></cds-icon>\n </button>\n </span>\n </div>\n @if (fileMessagesTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"fileMessagesTemplate.templateRef\"\n [ngTemplateOutletContext]=\"fileMessagesTemplateContext\"\n [ngTemplateOutletInjector]=\"injectorCache.get(file)\"\n ></ng-container>\n }\n </div>\n }\n }\n `,\n host: {\n '[attr.role]': '\"list\"',\n '[class.clr-file-list]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileList {\n @ContentChild(ClrFileMessagesTemplate) protected readonly fileMessagesTemplate: ClrFileMessagesTemplate;\n\n protected injectorCache = new Map<File, Injector>();\n private contextCache = new Map<File, ClrFileMessagesTemplateContext>();\n\n private readonly injector = inject(Injector);\n private readonly commonStrings = inject(ClrCommonStringsService);\n private readonly ngControlService = inject(NgControlService, { optional: true });\n private readonly fileInputContainer = inject(ClrFileInputContainer, { optional: true });\n\n constructor() {\n if (!this.ngControlService || !this.fileInputContainer) {\n throw new Error('The clr-file-list component can only be used within a clr-file-input-container.');\n }\n }\n\n protected get files() {\n if (!this.fileInputContainer.fileInput) {\n return [];\n }\n\n const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;\n\n return Array.from(fileInputElement.files).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n protected getClearFileLabel(filename: string) {\n return this.commonStrings.parse(this.commonStrings.keys.clearFile, {\n FILE: filename,\n });\n }\n\n protected clearFile(fileToRemove: File) {\n if (!this.fileInputContainer.fileInput) {\n return;\n }\n\n const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;\n const files = Array.from(fileInputElement.files);\n const newFiles = files.filter(file => file !== fileToRemove);\n\n selectFiles(fileInputElement, newFiles);\n this.fileInputContainer.focusBrowseButton();\n }\n\n protected createFileMessagesTemplateContext(file: File): ClrFileMessagesTemplateContext {\n const fileInputErrors: ClrFileListValidationErrors = this.ngControlService.controls[0].errors || {};\n\n const errors: ClrSingleFileValidationErrors = {\n accept: fileInputErrors.accept?.find(error => error.name === file.name),\n minFileSize: fileInputErrors.minFileSize?.find(error => error.name === file.name),\n maxFileSize: fileInputErrors.maxFileSize?.find(error => error.name === file.name),\n };\n\n const success = Object.values(errors).every(error => !error);\n\n const cached = this.contextCache.get(file);\n if (cached && cached.success === success && this.errorsEqual(cached.errors, errors)) {\n return cached;\n }\n\n // new context is made and old reference replaced\n const context: ClrFileMessagesTemplateContext = { $implicit: file, success, errors };\n this.contextCache.set(file, context);\n\n // new injector is made and old reference replaced\n const injector = this.createFileMessagesTemplateInjector(context);\n this.injectorCache.set(file, injector);\n\n return context;\n }\n\n private createFileMessagesTemplateInjector(fileMessagesTemplateContext: ClrFileMessagesTemplateContext) {\n return Injector.create({\n parent: this.injector,\n providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }],\n });\n }\n\n private errorsEqual(a: ClrSingleFileValidationErrors, b: ClrSingleFileValidationErrors): boolean {\n return a.accept === b.accept && a.minFileSize === b.minFileSize && a.maxFileSize === b.maxFileSize;\n }\n}\n","/*\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\nimport { Component, ContentChild, ElementRef, forwardRef, inject, Input, ViewChild } from '@angular/core';\nimport {\n ClrAbstractContainer,\n ControlClassService,\n ControlIdService,\n NgControlService,\n} from '@clr/angular/forms/common';\nimport { ClrCommonStringsService } from '@clr/angular/utils';\n\nimport { ClrFileInput } from './file-input';\nimport { selectFiles } from './file-input.helpers';\nimport { ClrFileList } from './file-list';\nimport { ClrFileError, ClrFileSuccess } from './file-messages';\n\n@Component({\n selector: 'clr-file-input-container',\n template: `\n <ng-content select=\"label\"></ng-content>\n @if (!label && addGrid()) {\n <label></label>\n }\n <div class=\"clr-control-container\" [ngClass]=\"controlClass()\">\n <div class=\"clr-file-input-wrapper\">\n <ng-content select=\"[clrFileInput]\"></ng-content>\n\n <!-- file input to handle adding new files to selection when file list is present (prevent replacing selected files on the main file input) -->\n @if (fileList) {\n <input\n #fileListFileInput\n type=\"file\"\n class=\"clr-file-input\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [disabled]=\"disabled\"\n (change)=\"addFilesToSelection(fileListFileInput.files)\"\n />\n }\n\n <button\n #browseButton\n type=\"button\"\n class=\"btn btn-sm clr-file-input-browse-button\"\n [attr.aria-describedby]=\"browseButtonDescribedBy\"\n [disabled]=\"disabled\"\n (click)=\"browse()\"\n >\n <cds-icon shape=\"folder-open\"></cds-icon>\n <span class=\"clr-file-input-browse-button-text\">{{ browseButtonText }}</span>\n </button>\n @if (!fileList && fileInput?.selection?.fileCount) {\n <button\n type=\"button\"\n class=\"btn btn-sm clr-file-input-clear-button\"\n [attr.aria-label]=\"fileInput?.selection?.clearFilesButtonLabel\"\n (click)=\"clearSelectedFiles()\"\n >\n <cds-icon shape=\"times\" status=\"neutral\"></cds-icon>\n </button>\n }\n </div>\n @if (showHelper) {\n <ng-content select=\"clr-control-helper\"></ng-content>\n }\n @if (showInvalid) {\n <ng-content select=\"clr-control-error\"></ng-content>\n }\n @if (showValid) {\n <ng-content select=\"clr-control-success\"></ng-content>\n }\n\n <!-- If this is present, this file input becomes an \"advanced\" file input. -->\n <ng-container>\n <div class=\"clr-file-list-break\"></div>\n <ng-content select=\"clr-file-list\"></ng-content>\n </ng-container>\n </div>\n `,\n host: {\n '[class.clr-form-control]': 'true',\n '[class.clr-form-control-disabled]': 'disabled',\n '[class.clr-row]': 'addGrid()',\n },\n providers: [NgControlService, ControlIdService, ControlClassService],\n standalone: false,\n})\nexport class ClrFileInputContainer extends ClrAbstractContainer {\n @Input('clrButtonLabel') customButtonLabel: string;\n\n @ContentChild(forwardRef(() => ClrFileInput)) readonly fileInput: ClrFileInput;\n @ContentChild(forwardRef(() => ClrFileList)) protected readonly fileList: ClrFileList;\n\n @ViewChild('browseButton') private browseButtonElementRef: ElementRef<HTMLButtonElement>;\n @ViewChild('fileListFileInput') private fileListFileInputElementRef: ElementRef<HTMLInputElement>;\n\n // These are for the \"message present\" override properties\n @ContentChild(ClrFileSuccess) private readonly fileSuccessComponent: ClrFileSuccess;\n @ContentChild(ClrFileError) private readonly fileErrorComponent: ClrFileError;\n\n private readonly commonStrings = inject(ClrCommonStringsService);\n\n protected get accept() {\n return this.fileInput.elementRef.nativeElement.accept;\n }\n\n protected get multiple() {\n return this.fileInput.elementRef.nativeElement.multiple;\n }\n\n protected get disabled() {\n return this.fileInput.elementRef.nativeElement.disabled || (this.control && this.control.disabled);\n }\n\n protected get browseButtonText() {\n const selectionButtonLabel = this.fileList ? undefined : this.fileInput?.selection?.buttonLabel;\n\n return selectionButtonLabel || this.customButtonLabel || this.commonStrings.keys.browse;\n }\n\n protected get browseButtonDescribedBy() {\n return `${this.label?.forAttr} ${this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby')}`;\n }\n\n protected override get successMessagePresent() {\n return super.successMessagePresent || !!this.fileSuccessComponent;\n }\n\n protected override get errorMessagePresent() {\n return super.errorMessagePresent || !!this.fileErrorComponent;\n }\n\n focusBrowseButton() {\n this.browseButtonElementRef.nativeElement.focus();\n }\n\n protected browse() {\n const fileInputElementRef =\n this.fileList && this.multiple ? this.fileListFileInputElementRef : this.fileInput.elementRef;\n\n fileInputElementRef.nativeElement.click();\n }\n\n protected clearSelectedFiles() {\n this.fileInput.elementRef.nativeElement.value = '';\n this.fileInput.elementRef.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));\n\n this.focusBrowseButton();\n }\n\n protected addFilesToSelection(newFiles: FileList) {\n if (!newFiles.length) {\n return;\n }\n\n // start with new files\n const mergedFiles = [...newFiles];\n\n // add existing files if a new file doesn't have the same name\n for (const existingFile of this.fileInput.elementRef.nativeElement.files) {\n if (!mergedFiles.some(file => file.name === existingFile.name)) {\n mergedFiles.push(existingFile);\n }\n }\n\n // update file selection\n selectFiles(this.fileInput.elementRef.nativeElement, mergedFiles);\n }\n}\n","/*\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\nimport {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n Injector,\n Optional,\n Renderer2,\n Self,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { WrappedFormControl } from '@clr/angular/forms/common';\nimport { ClrCommonStringsService } from '@clr/angular/utils';\n\nimport { ClrFileInputContainer } from './file-input-container';\n\nexport interface ClrFileInputSelection {\n fileCount: number;\n buttonLabel: string;\n clearFilesButtonLabel: string;\n}\n\n@Directive({\n selector: 'input[type=\"file\"][clrFileInput]',\n host: {\n tabindex: '-1', // Remove the hidden file `input` element from the tab order because the browse `button` replaces it.\n 'aria-hidden': 'true', // Remove the hidden file `input` element from the accessibility tree because the browse `button` replaces it.\n '[class.clr-file-input]': 'true',\n },\n standalone: false,\n})\nexport class ClrFileInput extends WrappedFormControl<ClrFileInputContainer> {\n selection: ClrFileInputSelection = undefined;\n\n constructor(\n injector: Injector,\n renderer: Renderer2,\n viewContainerRef: ViewContainerRef,\n readonly elementRef: ElementRef<HTMLInputElement>,\n @Self() @Optional() private readonly control: NgControl,\n private readonly commonStrings: ClrCommonStringsService\n ) {\n super(viewContainerRef, ClrFileInputContainer, injector, control, renderer, elementRef);\n }\n\n @HostBinding('disabled')\n protected get disabled() {\n return this.elementRef.nativeElement.disabled || (this.control && this.control.disabled);\n }\n\n @HostListener('change')\n private handleChange() {\n this.updateSelection();\n }\n\n private updateSelection() {\n const files = this.elementRef.nativeElement.files;\n let selectionButtonLabel: string;\n let clearFilesButtonLabel: string;\n\n if (files?.length === 1) {\n const filename = files[0].name;\n\n selectionButtonLabel = filename;\n\n clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFile, {\n FILE: filename,\n });\n } else if (files?.length > 1) {\n const fileCount = files.length.toString();\n\n selectionButtonLabel = this.commonStrings.parse(this.commonStrings.keys.fileCount, {\n COUNT: fileCount,\n });\n\n clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFiles, {\n COUNT: fileCount,\n });\n }\n\n this.selection = {\n fileCount: files.length,\n buttonLabel: selectionButtonLabel,\n clearFilesButtonLabel,\n };\n }\n}\n","/*\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\nimport { Directive, ElementRef, Input } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\n\nimport { ClrFileListValidationErrors } from './file-input-validator-errors';\n\n@Directive({\n selector: 'input[type=\"file\"][clrFileInput]',\n providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }],\n standalone: false,\n})\nexport class ClrFileInputValidator implements Validator {\n @Input('clrMinFileSize') minFileSize: number;\n @Input('clrMaxFileSize') maxFileSize: number;\n\n constructor(private readonly elementRef: ElementRef<HTMLInputElement>) {}\n\n validate(control: AbstractControl<FileList>): ValidationErrors {\n const files = control.value;\n const fileInputElement = this.elementRef.nativeElement;\n\n const errors: ClrFileListValidationErrors = {};\n\n // required validation (native attribute)\n if (fileInputElement.required && files?.length === 0) {\n errors.required = true;\n }\n\n const accept = fileInputElement.accept ? fileInputElement.accept.split(',').map(type => type.trim()) : null;\n\n if (files?.length > 0 && (accept || this.minFileSize || this.maxFileSize)) {\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n\n // accept validation (native attribute)\n if (accept && accept.length) {\n if (!this.validateAccept(file, accept)) {\n errors.accept = errors.accept || [];\n errors.accept.push({\n name: file.name,\n accept,\n type: file.type || '',\n extension: this.getSuffixByDepth(file.name, 2), // last up to 2 parts for reporting\n });\n }\n }\n\n // min file validation (custom input)\n if (this.minFileSize && file.size < this.minFileSize) {\n errors.minFileSize = errors.minFileSize || [];\n errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });\n }\n\n // max file validation (custom input)\n if (this.maxFileSize && file.size > this.maxFileSize) {\n errors.maxFileSize = errors.maxFileSize || [];\n errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });\n }\n }\n }\n\n return Object.keys(errors).length ? errors : null;\n }\n\n private getSuffixByDepth(filename: string, depth: number): string {\n const match = filename.toLowerCase().match(new RegExp(`(\\\\.[^.]+){1,${depth}}$`, 'i'));\n return match ? match[0] : '';\n }\n\n private validateAccept(file: File, acceptList: string[]): boolean {\n const name = file.name.toLowerCase();\n const type = (file.type || '').toLowerCase();\n\n for (const entryRaw of acceptList) {\n const entry = entryRaw.trim().toLowerCase();\n if (!entry) {\n continue;\n }\n\n // Extension check\n if (entry.startsWith('.')) {\n const depth = (entry.match(/\\./g) || []).length;\n if (this.getSuffixByDepth(name, depth) === entry) {\n return true;\n }\n continue;\n }\n\n // MIME check\n if (entry.endsWith('/*')) {\n const prefix = entry.slice(0, entry.length - 1); // keep trailing slash\n if (type.startsWith(prefix)) {\n return true;\n }\n } else if (entry.includes('/') && type === entry) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/*\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\nexport interface ClrFileListValidationErrors {\n required?: boolean;\n accept?: ClrFileAcceptError[];\n minFileSize?: ClrFileMinFileSizeError[];\n maxFileSize?: ClrFileMaxFileSizeError[];\n}\n\nexport interface ClrFileAcceptError {\n /**\n * The name of the selected file.\n */\n name: string;\n\n /**\n * The file types that are accepted by the file input.\n */\n accept: string[];\n\n /**\n * The actual MIME type of the selected file.\n */\n type: string;\n\n /**\n * The actual extension of the selected file.\n */\n extension: string;\n}\n\nexport interface ClrFileMinFileSizeError {\n /**\n * The name of the selected file.\n */\n name: string;\n\n /**\n * The minimum file size that is accepted by the file input.\n */\n minFileSize: number;\n\n /**\n * The actual size of the selected file.\n */\n actualFileSize: number;\n}\n\nexport interface ClrFileMaxFileSizeError {\n /**\n * The name of the selected file.\n */\n name: string;\n\n /**\n * The maximum file size that is accepted by the file input.\n */\n maxFileSize: number;\n\n /**\n * The actual size of the selected file.\n */\n actualFileSize: number;\n}\n","/*\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\nimport { Directive, ElementRef, HostListener } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { clearFiles, selectFiles } from './file-input.helpers';\n\n@Directive({\n selector: 'input[type=\"file\"][clrFileInput]',\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: ClrFileInputValueAccessor, multi: true }],\n standalone: false,\n})\nexport class ClrFileInputValueAccessor implements ControlValueAccessor {\n constructor(private readonly elementRef: ElementRef<HTMLInputElement>) {}\n\n writeValue(value: FileList) {\n if (value !== undefined && value !== null && !(value instanceof FileList)) {\n throw new Error('The value of a file input control must be a FileList.');\n }\n\n if (value) {\n selectFiles(this.elementRef.nativeElement, value);\n } else if (this.elementRef.nativeElement.files.length) {\n clearFiles(this.elementRef.nativeElement);\n }\n }\n\n registerOnChange(fn: (value: FileList) => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n @HostListener('change')\n private handleChange() {\n this.onTouched();\n this.onChange(this.elementRef.nativeElement.files);\n }\n\n private onChange = (_value: FileList) => {};\n\n private onTouched = () => {};\n}\n","/*\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\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ClrCommonFormsModule } from '@clr/angular/forms/common';\nimport { ClarityIcons, ClrIcon, errorStandardIcon, folderOpenIcon, successStandardIcon } from '@clr/angular/icon';\n\nimport { ClrFileInput } from './file-input';\nimport { ClrFileInputContainer } from './file-input-container';\nimport { ClrFileInputValidator } from './file-input-validator';\nimport { ClrFileInputValueAccessor } from './file-input-value-accessor';\nimport { ClrFileList } from './file-list';\nimport { ClrFileError, ClrFileInfo, ClrFileSuccess } from './file-messages';\nimport { ClrFileMessagesTemplate } from './file-messages-template';\n\n@NgModule({\n imports: [CommonModule, ClrIcon, ClrCommonFormsModule],\n declarations: [\n ClrFileInput,\n ClrFileInputContainer,\n ClrFileInputValidator,\n ClrFileInputValueAccessor,\n ClrFileList,\n ClrFileMessagesTemplate,\n ClrFileInfo,\n ClrFileSuccess,\n ClrFileError,\n ],\n exports: [\n ClrCommonFormsModule,\n ClrFileInput,\n ClrFileInputContainer,\n ClrFileInputValidator,\n ClrFileInputValueAccessor,\n ClrFileList,\n ClrFileMessagesTemplate,\n ClrFileInfo,\n ClrFileSuccess,\n ClrFileError,\n ],\n})\nexport class ClrFileInputModule {\n constructor() {\n ClarityIcons.addIcons(folderOpenIcon, successStandardIcon, errorStandardIcon);\n }\n}\n","/*\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\nexport * from './file-input';\nexport * from './file-input-validator';\nexport * from './file-input-validator-errors';\nexport * from './file-input-value-accessor';\nexport * from './file-input-container';\nexport * from './file-list';\nexport * from './file-messages-template';\nexport * from './file-messages';\nexport * from './file-input.module';\nexport * from './file-input.helpers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
@@ -1,13 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, Self, Optional, Directive, NgModule } from '@angular/core';
3
- import * as i3 from '@clr/angular/forms/common';
3
+ import * as i2 from '@clr/angular/forms/common';
4
4
  import { ClrAbstractContainer, NgControlService, ControlIdService, ControlClassService, WrappedFormControl, ClrCommonFormsModule } from '@clr/angular/forms/common';
5
5
  import * as i1 from '@angular/common';
6
6
  import { CommonModule } from '@angular/common';
7
- import * as i2 from '@clr/angular/icon';
8
- import { ClarityIcons, exclamationCircleIcon, checkCircleIcon, ClrIcon } from '@clr/angular/icon';
9
7
  import * as i1$1 from '@angular/forms';
10
8
  import { FormsModule } from '@angular/forms';
9
+ import { ClarityIcons, successStandardIcon, errorStandardIcon, ClrIcon } from '@clr/angular/icon';
11
10
 
12
11
  /*
13
12
  * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
@@ -29,12 +28,6 @@ class ClrInputContainer extends ClrAbstractContainer {
29
28
  <ng-content select="[clrInput]"></ng-content>
30
29
  <ng-content select="[clrInputSuffix]"></ng-content>
31
30
  </div>
32
- @if (showInvalid) {
33
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
34
- }
35
- @if (showValid) {
36
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
37
- }
38
31
  </div>
39
32
  @if (showHelper) {
40
33
  <ng-content select="clr-control-helper"></ng-content>
@@ -46,7 +39,7 @@ class ClrInputContainer extends ClrAbstractContainer {
46
39
  <ng-content select="clr-control-success"></ng-content>
47
40
  }
48
41
  </div>
49
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i3.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
42
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.ClrControlLabel, selector: "label", inputs: ["id", "for"] }] }); }
50
43
  }
51
44
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrInputContainer, decorators: [{
52
45
  type: Component,
@@ -64,12 +57,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
64
57
  <ng-content select="[clrInput]"></ng-content>
65
58
  <ng-content select="[clrInputSuffix]"></ng-content>
66
59
  </div>
67
- @if (showInvalid) {
68
- <cds-icon class="clr-validate-icon" shape="exclamation-circle" status="danger" aria-hidden="true"></cds-icon>
69
- }
70
- @if (showValid) {
71
- <cds-icon class="clr-validate-icon" shape="check-circle" status="success" aria-hidden="true"></cds-icon>
72
- }
73
60
  </div>
74
61
  @if (showHelper) {
75
62
  <ng-content select="clr-control-helper"></ng-content>
@@ -136,8 +123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
136
123
  */
137
124
  class ClrInputModule {
138
125
  constructor() {
139
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon // caret
140
- );
126
+ ClarityIcons.addIcons(successStandardIcon, errorStandardIcon);
141
127
  }
142
128
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
143
129
  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], exports: [ClrCommonFormsModule, ClrInput, ClrInputContainer] }); }