@ngb-bootstrap/core 0.0.0 → 0.1.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +18 -0
  3. package/README.md +26 -0
  4. package/fesm2022/ngb-bootstrap-core-alert.mjs +154 -0
  5. package/fesm2022/ngb-bootstrap-core-alert.mjs.map +1 -0
  6. package/fesm2022/ngb-bootstrap-core-badge.mjs +100 -0
  7. package/fesm2022/ngb-bootstrap-core-badge.mjs.map +1 -0
  8. package/fesm2022/ngb-bootstrap-core-breadcrumb.mjs +135 -0
  9. package/fesm2022/ngb-bootstrap-core-breadcrumb.mjs.map +1 -0
  10. package/fesm2022/ngb-bootstrap-core-button.mjs +513 -0
  11. package/fesm2022/ngb-bootstrap-core-button.mjs.map +1 -0
  12. package/fesm2022/ngb-bootstrap-core-card.mjs +540 -0
  13. package/fesm2022/ngb-bootstrap-core-card.mjs.map +1 -0
  14. package/fesm2022/ngb-bootstrap-core-cdk.mjs +282 -0
  15. package/fesm2022/ngb-bootstrap-core-cdk.mjs.map +1 -0
  16. package/fesm2022/ngb-bootstrap-core-checkbox.mjs +165 -0
  17. package/fesm2022/ngb-bootstrap-core-checkbox.mjs.map +1 -0
  18. package/fesm2022/ngb-bootstrap-core-chips.mjs +512 -0
  19. package/fesm2022/ngb-bootstrap-core-chips.mjs.map +1 -0
  20. package/fesm2022/ngb-bootstrap-core-floating-label.mjs +83 -0
  21. package/fesm2022/ngb-bootstrap-core-floating-label.mjs.map +1 -0
  22. package/fesm2022/ngb-bootstrap-core-footer.mjs +48 -0
  23. package/fesm2022/ngb-bootstrap-core-footer.mjs.map +1 -0
  24. package/fesm2022/ngb-bootstrap-core-icon.mjs +243 -0
  25. package/fesm2022/ngb-bootstrap-core-icon.mjs.map +1 -0
  26. package/fesm2022/ngb-bootstrap-core-input.mjs +540 -0
  27. package/fesm2022/ngb-bootstrap-core-input.mjs.map +1 -0
  28. package/fesm2022/ngb-bootstrap-core-layout.mjs +272 -0
  29. package/fesm2022/ngb-bootstrap-core-layout.mjs.map +1 -0
  30. package/fesm2022/ngb-bootstrap-core-navbar.mjs +150 -0
  31. package/fesm2022/ngb-bootstrap-core-navbar.mjs.map +1 -0
  32. package/fesm2022/ngb-bootstrap-core-radio.mjs +279 -0
  33. package/fesm2022/ngb-bootstrap-core-radio.mjs.map +1 -0
  34. package/fesm2022/ngb-bootstrap-core-sidebar.mjs +425 -0
  35. package/fesm2022/ngb-bootstrap-core-sidebar.mjs.map +1 -0
  36. package/fesm2022/ngb-bootstrap-core-spinner.mjs +126 -0
  37. package/fesm2022/ngb-bootstrap-core-spinner.mjs.map +1 -0
  38. package/fesm2022/ngb-bootstrap-core-switch.mjs +147 -0
  39. package/fesm2022/ngb-bootstrap-core-switch.mjs.map +1 -0
  40. package/fesm2022/ngb-bootstrap-core.mjs +69 -0
  41. package/fesm2022/ngb-bootstrap-core.mjs.map +1 -0
  42. package/ngb-bootstrap.css +827 -0
  43. package/package.json +118 -4
  44. package/styles/_breadcrumb.scss +9 -0
  45. package/styles/_button.scss +14 -0
  46. package/styles/_card.scss +86 -0
  47. package/styles/_chip.scss +10 -0
  48. package/styles/_choice.scss +14 -0
  49. package/styles/_contrast.scss +23 -0
  50. package/styles/_icon.scss +62 -0
  51. package/styles/_index.scss +33 -0
  52. package/styles/_input.scss +9 -0
  53. package/styles/_layout.scss +602 -0
  54. package/styles/_overlay.scss +14 -0
  55. package/styles/_tokens.scss +29 -0
  56. package/styles/_typography.scss +77 -0
  57. package/styles/ngb-bootstrap.scss +2 -0
  58. package/types/ngb-bootstrap-core-alert.d.ts +65 -0
  59. package/types/ngb-bootstrap-core-badge.d.ts +38 -0
  60. package/types/ngb-bootstrap-core-breadcrumb.d.ts +32 -0
  61. package/types/ngb-bootstrap-core-button.d.ts +177 -0
  62. package/types/ngb-bootstrap-core-card.d.ts +154 -0
  63. package/types/ngb-bootstrap-core-cdk.d.ts +165 -0
  64. package/types/ngb-bootstrap-core-checkbox.d.ts +53 -0
  65. package/types/ngb-bootstrap-core-chips.d.ts +170 -0
  66. package/types/ngb-bootstrap-core-floating-label.d.ts +22 -0
  67. package/types/ngb-bootstrap-core-footer.d.ts +16 -0
  68. package/types/ngb-bootstrap-core-icon.d.ts +99 -0
  69. package/types/ngb-bootstrap-core-input.d.ts +208 -0
  70. package/types/ngb-bootstrap-core-layout.d.ts +102 -0
  71. package/types/ngb-bootstrap-core-navbar.d.ts +33 -0
  72. package/types/ngb-bootstrap-core-radio.d.ts +96 -0
  73. package/types/ngb-bootstrap-core-sidebar.d.ts +62 -0
  74. package/types/ngb-bootstrap-core-spinner.d.ts +49 -0
  75. package/types/ngb-bootstrap-core-switch.d.ts +44 -0
  76. package/types/ngb-bootstrap-core.d.ts +82 -0
@@ -0,0 +1,540 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, InjectionToken, booleanAttribute, computed, contentChild, forwardRef, inject, input, output, signal } from "@angular/core";
3
+ import { ngbId } from "@ngb-bootstrap/core/cdk";
4
+ import { NgControl } from "@angular/forms";
5
+ import { NGB_I18N } from "@ngb-bootstrap/core";
6
+ import { NgbButtonX } from "@ngb-bootstrap/core/button";
7
+ const NGB_INPUT_FIELD = new InjectionToken("NGB_INPUT_FIELD");
8
+ var NgbInput = class NgbInput {
9
+ element = inject(ElementRef).nativeElement;
10
+ control = inject(NgControl, {
11
+ optional: true,
12
+ self: true
13
+ });
14
+ field = inject(NGB_INPUT_FIELD, { optional: true });
15
+ ownDescribedBy = this.element.getAttribute("aria-describedby");
16
+ watched = null;
17
+ subscription;
18
+ id = input(ngbId("ngb-input"), ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
19
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
20
+ plaintext = input(false, {
21
+ ...ngDevMode ? { debugName: "plaintext" } : /* istanbul ignore next */ {},
22
+ transform: booleanAttribute
23
+ });
24
+ invalid = input(void 0, ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
25
+ placeholder = input(...ngDevMode ? [void 0, { debugName: "placeholder" }] : /* istanbul ignore next */ []);
26
+ touchedInvalid = signal(false, ...ngDevMode ? [{ debugName: "touchedInvalid" }] : /* istanbul ignore next */ []);
27
+ valueState = signal(false, ...ngDevMode ? [{ debugName: "valueState" }] : /* istanbul ignore next */ []);
28
+ disabledState = signal(false, ...ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []);
29
+ readonlyState = signal(false, ...ngDevMode ? [{ debugName: "readonlyState" }] : /* istanbul ignore next */ []);
30
+ isInvalid = computed(() => this.invalid() ?? this.touchedInvalid(), ...ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []);
31
+ hasValue = this.valueState.asReadonly();
32
+ disabled = this.disabledState.asReadonly();
33
+ readonly = this.readonlyState.asReadonly();
34
+ placeholderText = computed(() => this.element.tagName === "SELECT" ? null : this.placeholder() ?? this.field?.placeholder ?? null, ...ngDevMode ? [{ debugName: "placeholderText" }] : /* istanbul ignore next */ []);
35
+ describedBy = computed(() => {
36
+ return [this.ownDescribedBy, this.field?.describedBy()].filter(Boolean).join(" ") || null;
37
+ }, ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
38
+ constructor() {
39
+ inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());
40
+ }
41
+ ngDoCheck() {
42
+ this.sync();
43
+ }
44
+ sync() {
45
+ const control = this.control?.control ?? null;
46
+ if (control !== this.watched) {
47
+ this.subscription?.unsubscribe();
48
+ this.watched = control;
49
+ this.subscription = control?.events.subscribe(() => this.sync());
50
+ }
51
+ const value = this.control ? this.control.value : this.element.value;
52
+ this.touchedInvalid.set(!!this.control?.invalid && !!this.control.touched);
53
+ this.valueState.set(value != null && value !== "");
54
+ this.disabledState.set(this.control ? !!this.control.disabled : this.element.disabled);
55
+ this.readonlyState.set("readOnly" in this.element && this.element.readOnly);
56
+ }
57
+ clear() {
58
+ this.element.value = "";
59
+ this.element.dispatchEvent(new Event("input", { bubbles: true }));
60
+ this.focus();
61
+ }
62
+ focus() {
63
+ this.element.focus();
64
+ }
65
+ static ɵfac = i0.ɵɵngDeclareFactory({
66
+ minVersion: "12.0.0",
67
+ version: "22.2.3",
68
+ ngImport: i0,
69
+ type: NgbInput,
70
+ deps: [],
71
+ target: i0.ɵɵFactoryTarget.Directive
72
+ });
73
+ static ɵdir = i0.ɵɵngDeclareDirective({
74
+ minVersion: "17.1.0",
75
+ version: "22.2.3",
76
+ type: NgbInput,
77
+ isStandalone: true,
78
+ selector: "input[ngbInput], textarea[ngbInput], select[ngbInput]",
79
+ inputs: {
80
+ id: {
81
+ classPropertyName: "id",
82
+ publicName: "id",
83
+ isSignal: true,
84
+ isRequired: false,
85
+ transformFunction: null
86
+ },
87
+ size: {
88
+ classPropertyName: "size",
89
+ publicName: "size",
90
+ isSignal: true,
91
+ isRequired: false,
92
+ transformFunction: null
93
+ },
94
+ plaintext: {
95
+ classPropertyName: "plaintext",
96
+ publicName: "plaintext",
97
+ isSignal: true,
98
+ isRequired: false,
99
+ transformFunction: null
100
+ },
101
+ invalid: {
102
+ classPropertyName: "invalid",
103
+ publicName: "invalid",
104
+ isSignal: true,
105
+ isRequired: false,
106
+ transformFunction: null
107
+ },
108
+ placeholder: {
109
+ classPropertyName: "placeholder",
110
+ publicName: "placeholder",
111
+ isSignal: true,
112
+ isRequired: false,
113
+ transformFunction: null
114
+ }
115
+ },
116
+ host: {
117
+ listeners: {
118
+ "input": "sync()",
119
+ "blur": "sync()"
120
+ },
121
+ properties: {
122
+ "class.form-control": "!plaintext()",
123
+ "class.form-control-plaintext": "plaintext()",
124
+ "class.form-control-sm": "size() === \"sm\"",
125
+ "class.form-control-lg": "size() === \"lg\"",
126
+ "class.is-invalid": "isInvalid()",
127
+ "attr.id": "id()",
128
+ "attr.placeholder": "placeholderText()",
129
+ "attr.aria-invalid": "isInvalid() ? \"true\" : null",
130
+ "attr.aria-describedby": "describedBy()"
131
+ }
132
+ },
133
+ exportAs: ["ngbInput"],
134
+ ngImport: i0
135
+ });
136
+ };
137
+ i0.ɵɵngDeclareClassMetadata({
138
+ minVersion: "12.0.0",
139
+ version: "22.2.3",
140
+ ngImport: i0,
141
+ type: NgbInput,
142
+ decorators: [{
143
+ type: Directive,
144
+ args: [{
145
+ selector: "input[ngbInput], textarea[ngbInput], select[ngbInput]",
146
+ exportAs: "ngbInput",
147
+ host: {
148
+ "[class.form-control]": "!plaintext()",
149
+ "[class.form-control-plaintext]": "plaintext()",
150
+ "[class.form-control-sm]": "size() === \"sm\"",
151
+ "[class.form-control-lg]": "size() === \"lg\"",
152
+ "[class.is-invalid]": "isInvalid()",
153
+ "[attr.id]": "id()",
154
+ "[attr.placeholder]": "placeholderText()",
155
+ "[attr.aria-invalid]": "isInvalid() ? \"true\" : null",
156
+ "[attr.aria-describedby]": "describedBy()",
157
+ "(input)": "sync()",
158
+ "(blur)": "sync()"
159
+ }
160
+ }]
161
+ }],
162
+ ctorParameters: () => [],
163
+ propDecorators: {
164
+ id: [{
165
+ type: i0.Input,
166
+ args: [{
167
+ isSignal: true,
168
+ alias: "id",
169
+ required: false
170
+ }]
171
+ }],
172
+ size: [{
173
+ type: i0.Input,
174
+ args: [{
175
+ isSignal: true,
176
+ alias: "size",
177
+ required: false
178
+ }]
179
+ }],
180
+ plaintext: [{
181
+ type: i0.Input,
182
+ args: [{
183
+ isSignal: true,
184
+ alias: "plaintext",
185
+ required: false
186
+ }]
187
+ }],
188
+ invalid: [{
189
+ type: i0.Input,
190
+ args: [{
191
+ isSignal: true,
192
+ alias: "invalid",
193
+ required: false
194
+ }]
195
+ }],
196
+ placeholder: [{
197
+ type: i0.Input,
198
+ args: [{
199
+ isSignal: true,
200
+ alias: "placeholder",
201
+ required: false
202
+ }]
203
+ }]
204
+ }
205
+ });
206
+ var NgbField = class NgbField {
207
+ control = contentChild(NgbInput, ...ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []);
208
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
209
+ hint = input(...ngDevMode ? [void 0, { debugName: "hint" }] : /* istanbul ignore next */ []);
210
+ error = input(...ngDevMode ? [void 0, { debugName: "error" }] : /* istanbul ignore next */ []);
211
+ hintId = ngbId("ngb-hint");
212
+ errorId = ngbId("ngb-error");
213
+ labelFor = computed(() => this.control()?.id() ?? null, ...ngDevMode ? [{ debugName: "labelFor" }] : /* istanbul ignore next */ []);
214
+ showError = computed(() => !!this.error() && !!this.control()?.isInvalid(), ...ngDevMode ? [{ debugName: "showError" }] : /* istanbul ignore next */ []);
215
+ describedBy = computed(() => {
216
+ return [this.hint() ? this.hintId : "", this.showError() ? this.errorId : ""].filter(Boolean).join(" ") || null;
217
+ }, ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
218
+ static ɵfac = i0.ɵɵngDeclareFactory({
219
+ minVersion: "12.0.0",
220
+ version: "22.2.3",
221
+ ngImport: i0,
222
+ type: NgbField,
223
+ deps: [],
224
+ target: i0.ɵɵFactoryTarget.Directive
225
+ });
226
+ static ɵdir = i0.ɵɵngDeclareDirective({
227
+ minVersion: "17.2.0",
228
+ version: "22.2.3",
229
+ type: NgbField,
230
+ isStandalone: true,
231
+ inputs: {
232
+ label: {
233
+ classPropertyName: "label",
234
+ publicName: "label",
235
+ isSignal: true,
236
+ isRequired: false,
237
+ transformFunction: null
238
+ },
239
+ hint: {
240
+ classPropertyName: "hint",
241
+ publicName: "hint",
242
+ isSignal: true,
243
+ isRequired: false,
244
+ transformFunction: null
245
+ },
246
+ error: {
247
+ classPropertyName: "error",
248
+ publicName: "error",
249
+ isSignal: true,
250
+ isRequired: false,
251
+ transformFunction: null
252
+ }
253
+ },
254
+ queries: [{
255
+ propertyName: "control",
256
+ first: true,
257
+ predicate: NgbInput,
258
+ descendants: true,
259
+ isSignal: true
260
+ }],
261
+ ngImport: i0
262
+ });
263
+ };
264
+ i0.ɵɵngDeclareClassMetadata({
265
+ minVersion: "12.0.0",
266
+ version: "22.2.3",
267
+ ngImport: i0,
268
+ type: NgbField,
269
+ decorators: [{ type: Directive }],
270
+ propDecorators: {
271
+ control: [{
272
+ type: i0.ContentChild,
273
+ args: [i0.forwardRef(() => NgbInput), { isSignal: true }]
274
+ }],
275
+ label: [{
276
+ type: i0.Input,
277
+ args: [{
278
+ isSignal: true,
279
+ alias: "label",
280
+ required: false
281
+ }]
282
+ }],
283
+ hint: [{
284
+ type: i0.Input,
285
+ args: [{
286
+ isSignal: true,
287
+ alias: "hint",
288
+ required: false
289
+ }]
290
+ }],
291
+ error: [{
292
+ type: i0.Input,
293
+ args: [{
294
+ isSignal: true,
295
+ alias: "error",
296
+ required: false
297
+ }]
298
+ }]
299
+ }
300
+ });
301
+ var NgbPrefix = class NgbPrefix {
302
+ interactive = ["BUTTON", "A"].includes(inject(ElementRef).nativeElement.tagName);
303
+ static ɵfac = i0.ɵɵngDeclareFactory({
304
+ minVersion: "12.0.0",
305
+ version: "22.2.3",
306
+ ngImport: i0,
307
+ type: NgbPrefix,
308
+ deps: [],
309
+ target: i0.ɵɵFactoryTarget.Directive
310
+ });
311
+ static ɵdir = i0.ɵɵngDeclareDirective({
312
+ minVersion: "14.0.0",
313
+ version: "22.2.3",
314
+ type: NgbPrefix,
315
+ isStandalone: true,
316
+ selector: "[ngbPrefix]",
317
+ host: { properties: { "class.input-group-text": "!interactive" } },
318
+ ngImport: i0
319
+ });
320
+ };
321
+ i0.ɵɵngDeclareClassMetadata({
322
+ minVersion: "12.0.0",
323
+ version: "22.2.3",
324
+ ngImport: i0,
325
+ type: NgbPrefix,
326
+ decorators: [{
327
+ type: Directive,
328
+ args: [{
329
+ selector: "[ngbPrefix]",
330
+ host: { "[class.input-group-text]": "!interactive" }
331
+ }]
332
+ }]
333
+ });
334
+ var NgbSuffix = class NgbSuffix {
335
+ interactive = ["BUTTON", "A"].includes(inject(ElementRef).nativeElement.tagName);
336
+ static ɵfac = i0.ɵɵngDeclareFactory({
337
+ minVersion: "12.0.0",
338
+ version: "22.2.3",
339
+ ngImport: i0,
340
+ type: NgbSuffix,
341
+ deps: [],
342
+ target: i0.ɵɵFactoryTarget.Directive
343
+ });
344
+ static ɵdir = i0.ɵɵngDeclareDirective({
345
+ minVersion: "14.0.0",
346
+ version: "22.2.3",
347
+ type: NgbSuffix,
348
+ isStandalone: true,
349
+ selector: "[ngbSuffix]",
350
+ host: { properties: { "class.input-group-text": "!interactive" } },
351
+ ngImport: i0
352
+ });
353
+ };
354
+ i0.ɵɵngDeclareClassMetadata({
355
+ minVersion: "12.0.0",
356
+ version: "22.2.3",
357
+ ngImport: i0,
358
+ type: NgbSuffix,
359
+ decorators: [{
360
+ type: Directive,
361
+ args: [{
362
+ selector: "[ngbSuffix]",
363
+ host: { "[class.input-group-text]": "!interactive" }
364
+ }]
365
+ }]
366
+ });
367
+ var NgbTextfield = class NgbTextfield extends NgbField {
368
+ i18n = inject(NGB_I18N);
369
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
370
+ clearable = input(false, {
371
+ ...ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {},
372
+ transform: booleanAttribute
373
+ });
374
+ clearLabel = input(...ngDevMode ? [void 0, { debugName: "clearLabel" }] : /* istanbul ignore next */ []);
375
+ cleared = output();
376
+ showClear = computed(() => {
377
+ const control = this.control();
378
+ return this.clearable() && !!control && control.hasValue() && !control.disabled() && !control.readonly();
379
+ }, ...ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []);
380
+ clear() {
381
+ this.control()?.clear();
382
+ this.cleared.emit();
383
+ }
384
+ static ɵfac = i0.ɵɵngDeclareFactory({
385
+ minVersion: "12.0.0",
386
+ version: "22.2.3",
387
+ ngImport: i0,
388
+ type: NgbTextfield,
389
+ deps: null,
390
+ target: i0.ɵɵFactoryTarget.Component
391
+ });
392
+ static ɵcmp = i0.ɵɵngDeclareComponent({
393
+ minVersion: "17.0.0",
394
+ version: "22.2.3",
395
+ type: NgbTextfield,
396
+ isStandalone: true,
397
+ selector: "ngb-textfield",
398
+ inputs: {
399
+ size: {
400
+ classPropertyName: "size",
401
+ publicName: "size",
402
+ isSignal: true,
403
+ isRequired: false,
404
+ transformFunction: null
405
+ },
406
+ clearable: {
407
+ classPropertyName: "clearable",
408
+ publicName: "clearable",
409
+ isSignal: true,
410
+ isRequired: false,
411
+ transformFunction: null
412
+ },
413
+ clearLabel: {
414
+ classPropertyName: "clearLabel",
415
+ publicName: "clearLabel",
416
+ isSignal: true,
417
+ isRequired: false,
418
+ transformFunction: null
419
+ }
420
+ },
421
+ outputs: { cleared: "cleared" },
422
+ host: { classAttribute: "form-field" },
423
+ providers: [{
424
+ provide: NGB_INPUT_FIELD,
425
+ useExisting: forwardRef(() => NgbTextfield)
426
+ }],
427
+ usesInheritance: true,
428
+ ngImport: i0,
429
+ template: `
430
+ @if (label()) {
431
+ <label class="form-label" [attr.for]="labelFor()">{{ label() }}</label>
432
+ }
433
+ <div
434
+ class="input-group"
435
+ [class.input-group-sm]="size() === 'sm'"
436
+ [class.input-group-lg]="size() === 'lg'"
437
+ >
438
+ <ng-content select="[ngbPrefix]" />
439
+ <ng-content />
440
+ @if (showClear()) {
441
+ <span class="input-group-text ngb-textfield-clear">
442
+ <button ngbButtonX [label]="clearLabel() ?? i18n.clear" (click)="clear()"></button>
443
+ </span>
444
+ }
445
+ <ng-content select="[ngbSuffix]" />
446
+ </div>
447
+ @if (hint()) {
448
+ <div class="form-text" [id]="hintId">{{ hint() }}</div>
449
+ }
450
+ @if (showError()) {
451
+ <div class="invalid-feedback" [id]="errorId">{{ error() }}</div>
452
+ }
453
+ `,
454
+ isInline: true,
455
+ dependencies: [{
456
+ kind: "directive",
457
+ type: NgbButtonX,
458
+ selector: "button[ngbButtonX]",
459
+ inputs: ["label"]
460
+ }],
461
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
462
+ });
463
+ };
464
+ i0.ɵɵngDeclareClassMetadata({
465
+ minVersion: "12.0.0",
466
+ version: "22.2.3",
467
+ ngImport: i0,
468
+ type: NgbTextfield,
469
+ decorators: [{
470
+ type: Component,
471
+ args: [{
472
+ selector: "ngb-textfield",
473
+ imports: [NgbButtonX],
474
+ template: `
475
+ @if (label()) {
476
+ <label class="form-label" [attr.for]="labelFor()">{{ label() }}</label>
477
+ }
478
+ <div
479
+ class="input-group"
480
+ [class.input-group-sm]="size() === 'sm'"
481
+ [class.input-group-lg]="size() === 'lg'"
482
+ >
483
+ <ng-content select="[ngbPrefix]" />
484
+ <ng-content />
485
+ @if (showClear()) {
486
+ <span class="input-group-text ngb-textfield-clear">
487
+ <button ngbButtonX [label]="clearLabel() ?? i18n.clear" (click)="clear()"></button>
488
+ </span>
489
+ }
490
+ <ng-content select="[ngbSuffix]" />
491
+ </div>
492
+ @if (hint()) {
493
+ <div class="form-text" [id]="hintId">{{ hint() }}</div>
494
+ }
495
+ @if (showError()) {
496
+ <div class="invalid-feedback" [id]="errorId">{{ error() }}</div>
497
+ }
498
+ `,
499
+ changeDetection: ChangeDetectionStrategy.OnPush,
500
+ providers: [{
501
+ provide: NGB_INPUT_FIELD,
502
+ useExisting: forwardRef(() => NgbTextfield)
503
+ }],
504
+ host: { class: "form-field" }
505
+ }]
506
+ }],
507
+ propDecorators: {
508
+ size: [{
509
+ type: i0.Input,
510
+ args: [{
511
+ isSignal: true,
512
+ alias: "size",
513
+ required: false
514
+ }]
515
+ }],
516
+ clearable: [{
517
+ type: i0.Input,
518
+ args: [{
519
+ isSignal: true,
520
+ alias: "clearable",
521
+ required: false
522
+ }]
523
+ }],
524
+ clearLabel: [{
525
+ type: i0.Input,
526
+ args: [{
527
+ isSignal: true,
528
+ alias: "clearLabel",
529
+ required: false
530
+ }]
531
+ }],
532
+ cleared: [{
533
+ type: i0.Output,
534
+ args: ["cleared"]
535
+ }]
536
+ }
537
+ });
538
+ export { NGB_INPUT_FIELD, NgbField, NgbInput, NgbPrefix, NgbSuffix, NgbTextfield };
539
+
540
+ //# sourceMappingURL=ngb-bootstrap-core-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngb-bootstrap-core-input.mjs","names":[],"sources":["../../../../projects/core/input/input.ts","../../../../projects/core/input/field.ts","../../../../projects/core/input/textfield.ts"],"sourcesContent":["// API adapted from Taiga UI (Apache-2.0), see NOTICE.\nimport {\n DestroyRef,\n Directive,\n DoCheck,\n ElementRef,\n InjectionToken,\n Signal,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { ngbId } from '@ngb-bootstrap/core/cdk';\n\nexport type NgbInputSize = 'sm' | 'md' | 'lg';\n\n/**\n * What a field wrapper (`ngb-textfield`, `ngb-floating-label`) tells the `ngbInput` inside it.\n * Provided under `NGB_INPUT_FIELD`, so the input can read it without a query or an effect.\n */\nexport interface NgbInputField {\n /** Ids of the hint and error elements, for `aria-describedby`. */\n readonly describedBy: Signal<string | null>;\n /** Default `placeholder` of the input. Bootstrap's floating label needs one to detect a value. */\n readonly placeholder?: string;\n}\n\n/** Provided by the field wrappers; the `ngbInput` inside them injects it. */\nexport const NGB_INPUT_FIELD = new InjectionToken<NgbInputField>('NGB_INPUT_FIELD');\n\n/**\n * Native `<input>`, `<textarea>` or `<select>` styled with Bootstrap 6 `.form-control`. It\n * enhances the element instead of wrapping it, so `formControlName`, `formControl` and `ngModel`\n * attach to the native element with Angular's built-in value accessors. No custom\n * `ControlValueAccessor` is needed, as the value is a plain string or number.\n *\n * It adds `is-invalid` and `aria-invalid` once the control is invalid and touched, and a stable\n * `id` for the label. Inside `ngb-textfield` or `ngb-floating-label` it also links hint and error\n * text with `aria-describedby`.\n *\n * ```html\n * <input ngbInput size=\"lg\" placeholder=\"Name\" [formControl]=\"name\" />\n * <textarea ngbInput rows=\"3\" [(ngModel)]=\"bio\"></textarea>\n * ```\n */\n@Directive({\n selector: 'input[ngbInput], textarea[ngbInput], select[ngbInput]',\n exportAs: 'ngbInput',\n host: {\n '[class.form-control]': '!plaintext()',\n '[class.form-control-plaintext]': 'plaintext()',\n '[class.form-control-sm]': 'size() === \"sm\"',\n '[class.form-control-lg]': 'size() === \"lg\"',\n '[class.is-invalid]': 'isInvalid()',\n '[attr.id]': 'id()',\n '[attr.placeholder]': 'placeholderText()',\n '[attr.aria-invalid]': 'isInvalid() ? \"true\" : null',\n '[attr.aria-describedby]': 'describedBy()',\n '(input)': 'sync()',\n '(blur)': 'sync()',\n },\n})\nexport class NgbInput implements DoCheck {\n private readonly element =\n inject<ElementRef<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>>(ElementRef)\n .nativeElement;\n private readonly control = inject(NgControl, { optional: true, self: true });\n private readonly field = inject(NGB_INPUT_FIELD, { optional: true });\n private readonly ownDescribedBy = this.element.getAttribute('aria-describedby');\n private watched: AbstractControl | null = null;\n private subscription?: { unsubscribe(): void };\n\n /** Element id, which the label points at. Defaults to a generated `ngb-input-n`. */\n readonly id = input(ngbId('ngb-input'));\n /** `sm`, `md` (default) or `lg`. */\n readonly size = input<NgbInputSize>('md');\n /** Shows the value as text without a border (`.form-control-plaintext`), for a readonly input. */\n readonly plaintext = input(false, { transform: booleanAttribute });\n /**\n * Forces the invalid state on or off, for errors the form does not know about, such as a server\n * response. By default the input is invalid when its control is invalid and touched.\n */\n readonly invalid = input<boolean | undefined>(undefined);\n /** Placeholder. Inside `ngb-floating-label` it defaults to a space, which the CSS needs. */\n readonly placeholder = input<string>();\n\n private readonly touchedInvalid = signal(false);\n private readonly valueState = signal(false);\n private readonly disabledState = signal(false);\n private readonly readonlyState = signal(false);\n\n /** `true` while the field shows its invalid state. */\n readonly isInvalid = computed(() => this.invalid() ?? this.touchedInvalid());\n /** `true` when the input is not empty. */\n readonly hasValue = this.valueState.asReadonly();\n /** `true` when the input or its control is disabled. */\n readonly disabled = this.disabledState.asReadonly();\n /** `true` when the input is read-only. */\n readonly readonly = this.readonlyState.asReadonly();\n\n protected readonly placeholderText = computed(() =>\n this.element.tagName === 'SELECT'\n ? null\n : (this.placeholder() ?? this.field?.placeholder ?? null),\n );\n protected readonly describedBy = computed(() => {\n const ids = [this.ownDescribedBy, this.field?.describedBy()].filter(Boolean).join(' ');\n return ids || null;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n }\n\n ngDoCheck(): void {\n this.sync();\n }\n\n /** Re-reads the control and element state. Runs on every change detection pass and on events. */\n protected sync(): void {\n const control = this.control?.control ?? null;\n if (control !== this.watched) {\n this.subscription?.unsubscribe();\n this.watched = control;\n this.subscription = control?.events.subscribe(() => this.sync());\n }\n const value = this.control ? this.control.value : this.element.value;\n this.touchedInvalid.set(!!this.control?.invalid && !!this.control.touched);\n this.valueState.set(value != null && value !== '');\n this.disabledState.set(this.control ? !!this.control.disabled : this.element.disabled);\n this.readonlyState.set('readOnly' in this.element && this.element.readOnly);\n }\n\n /** Empties the input like the user would, so any bound control or `(input)` handler sees it. */\n clear(): void {\n this.element.value = '';\n this.element.dispatchEvent(new Event('input', { bubbles: true }));\n this.focus();\n }\n\n /** Focuses the native element. */\n focus(): void {\n this.element.focus();\n }\n}\n","// API adapted from Taiga UI (Apache-2.0), see NOTICE.\nimport { Directive, computed, contentChild, input } from '@angular/core';\nimport { ngbId } from '@ngb-bootstrap/core/cdk';\nimport { NgbInput } from './input';\n\n/**\n * Shared by `ngb-textfield` and `ngb-floating-label`: finds the `ngbInput` inside, and owns the\n * label, hint and error text and their ids.\n */\n@Directive()\nexport abstract class NgbField {\n protected readonly control = contentChild(NgbInput);\n\n /** Label text. It is a `<label>` tied to the input with `for`. */\n readonly label = input<string>();\n /** Help text under the field. It describes the input through `aria-describedby`. */\n readonly hint = input<string>();\n /** Error text, shown while the input is invalid (its control is invalid and touched). */\n readonly error = input<string>();\n\n protected readonly hintId = ngbId('ngb-hint');\n protected readonly errorId = ngbId('ngb-error');\n\n protected readonly labelFor = computed(() => this.control()?.id() ?? null);\n protected readonly showError = computed(() => !!this.error() && !!this.control()?.isInvalid());\n /** Ids for the input's `aria-describedby`: the hint, then the error. */\n readonly describedBy = computed(() => {\n const ids = [this.hint() ? this.hintId : '', this.showError() ? this.errorId : ''];\n return ids.filter(Boolean).join(' ') || null;\n });\n}\n","// API adapted from Taiga UI (Apache-2.0), see NOTICE.\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { NGB_I18N } from '@ngb-bootstrap/core';\nimport { NgbButtonX } from '@ngb-bootstrap/core/button';\nimport { NgbField } from './field';\nimport { NGB_INPUT_FIELD, NgbInputSize } from './input';\n\n/**\n * Content before the input of an `ngb-textfield`: an icon, text or a button. Text and icons get\n * `.input-group-text`; a `<button>` or `<a>` keeps its own `.btn` styling.\n *\n * ```html\n * <span ngbPrefix>$</span>\n * ```\n */\n@Directive({\n selector: '[ngbPrefix]',\n host: {\n '[class.input-group-text]': '!interactive',\n },\n})\nexport class NgbPrefix {\n protected readonly interactive = ['BUTTON', 'A'].includes(\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.tagName,\n );\n}\n\n/**\n * Content after the input of an `ngb-textfield`, with the same rules as `ngbPrefix`.\n *\n * ```html\n * <button ngbButton ngbSuffix variant=\"outline\">Search</button>\n * ```\n */\n@Directive({\n selector: '[ngbSuffix]',\n host: {\n '[class.input-group-text]': '!interactive',\n },\n})\nexport class NgbSuffix {\n protected readonly interactive = ['BUTTON', 'A'].includes(\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.tagName,\n );\n}\n\n/**\n * Text field in the Taiga UI Textfield style: a label, a native `ngbInput` or textarea, optional\n * prefix and suffix content, a clear button, and hint and error text. Built on Bootstrap 6\n * `.form-field`, `.form-label`, `.input-group`, `.form-text` and `.invalid-feedback`.\n *\n * ```html\n * <ngb-textfield label=\"Email\" hint=\"We never share it.\" error=\"Enter a valid email.\" clearable>\n * <ngb-icon ngbPrefix [icon]=\"mail\" />\n * <input ngbInput type=\"email\" formControlName=\"email\" />\n * </ngb-textfield>\n * ```\n */\n@Component({\n selector: 'ngb-textfield',\n imports: [NgbButtonX],\n template: `\n @if (label()) {\n <label class=\"form-label\" [attr.for]=\"labelFor()\">{{ label() }}</label>\n }\n <div\n class=\"input-group\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n >\n <ng-content select=\"[ngbPrefix]\" />\n <ng-content />\n @if (showClear()) {\n <span class=\"input-group-text ngb-textfield-clear\">\n <button ngbButtonX [label]=\"clearLabel() ?? i18n.clear\" (click)=\"clear()\"></button>\n </span>\n }\n <ng-content select=\"[ngbSuffix]\" />\n </div>\n @if (hint()) {\n <div class=\"form-text\" [id]=\"hintId\">{{ hint() }}</div>\n }\n @if (showError()) {\n <div class=\"invalid-feedback\" [id]=\"errorId\">{{ error() }}</div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: NGB_INPUT_FIELD, useExisting: forwardRef(() => NgbTextfield) }],\n host: {\n class: 'form-field',\n },\n})\nexport class NgbTextfield extends NgbField {\n protected readonly i18n = inject(NGB_I18N);\n\n /** `sm`, `md` (default) or `lg`. Sizes the whole group: input, prefix, suffix and buttons. */\n readonly size = input<NgbInputSize>('md');\n /** Shows a clear button while the input has a value and is neither disabled nor read-only. */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Accessible name of the clear button. Defaults to the `clear` string of `NGB_I18N`. */\n readonly clearLabel = input<string>();\n /** Emits after the clear button emptied the input. */\n readonly cleared = output<void>();\n\n protected readonly showClear = computed(() => {\n const control = this.control();\n return (\n this.clearable() &&\n !!control &&\n control.hasValue() &&\n !control.disabled() &&\n !control.readonly()\n );\n });\n\n protected clear(): void {\n this.control()?.clear();\n this.cleared.emit();\n }\n}\n"],"mappings":"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"}