shirkasoft-ui-components 1.2.0 → 1.3.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 (79) hide show
  1. package/fesm2022/shirkasoft-ui-components-breadcrumb.mjs +199 -0
  2. package/fesm2022/shirkasoft-ui-components-breadcrumb.mjs.map +1 -0
  3. package/fesm2022/shirkasoft-ui-components-button.mjs +148 -0
  4. package/fesm2022/shirkasoft-ui-components-button.mjs.map +1 -0
  5. package/fesm2022/shirkasoft-ui-components-chart.mjs +153 -0
  6. package/fesm2022/shirkasoft-ui-components-chart.mjs.map +1 -0
  7. package/fesm2022/shirkasoft-ui-components-confirm-dialog.mjs +143 -0
  8. package/fesm2022/shirkasoft-ui-components-confirm-dialog.mjs.map +1 -0
  9. package/fesm2022/shirkasoft-ui-components-date-picker.mjs +638 -0
  10. package/fesm2022/shirkasoft-ui-components-date-picker.mjs.map +1 -0
  11. package/fesm2022/shirkasoft-ui-components-fieldset.mjs +94 -0
  12. package/fesm2022/shirkasoft-ui-components-fieldset.mjs.map +1 -0
  13. package/fesm2022/shirkasoft-ui-components-file-upload.mjs +242 -0
  14. package/fesm2022/shirkasoft-ui-components-file-upload.mjs.map +1 -0
  15. package/fesm2022/shirkasoft-ui-components-knob.mjs +269 -0
  16. package/fesm2022/shirkasoft-ui-components-knob.mjs.map +1 -0
  17. package/fesm2022/shirkasoft-ui-components-loading.mjs +255 -0
  18. package/fesm2022/shirkasoft-ui-components-loading.mjs.map +1 -0
  19. package/fesm2022/shirkasoft-ui-components-modal.mjs +290 -0
  20. package/fesm2022/shirkasoft-ui-components-modal.mjs.map +1 -0
  21. package/fesm2022/shirkasoft-ui-components-notification.mjs +143 -0
  22. package/fesm2022/shirkasoft-ui-components-notification.mjs.map +1 -0
  23. package/fesm2022/shirkasoft-ui-components-price-input.mjs +64 -0
  24. package/fesm2022/shirkasoft-ui-components-price-input.mjs.map +1 -0
  25. package/fesm2022/shirkasoft-ui-components-rail-sidebar.mjs +205 -0
  26. package/fesm2022/shirkasoft-ui-components-rail-sidebar.mjs.map +1 -0
  27. package/fesm2022/shirkasoft-ui-components-select.mjs +737 -0
  28. package/fesm2022/shirkasoft-ui-components-select.mjs.map +1 -0
  29. package/fesm2022/shirkasoft-ui-components-sidebar.mjs +185 -0
  30. package/fesm2022/shirkasoft-ui-components-sidebar.mjs.map +1 -0
  31. package/fesm2022/shirkasoft-ui-components-skeleton.mjs +74 -0
  32. package/fesm2022/shirkasoft-ui-components-skeleton.mjs.map +1 -0
  33. package/fesm2022/shirkasoft-ui-components-table.mjs +689 -0
  34. package/fesm2022/shirkasoft-ui-components-table.mjs.map +1 -0
  35. package/fesm2022/shirkasoft-ui-components-tabs.mjs +249 -0
  36. package/fesm2022/shirkasoft-ui-components-tabs.mjs.map +1 -0
  37. package/fesm2022/shirkasoft-ui-components-tag.mjs +70 -0
  38. package/fesm2022/shirkasoft-ui-components-tag.mjs.map +1 -0
  39. package/fesm2022/shirkasoft-ui-components-text-field.mjs +370 -0
  40. package/fesm2022/shirkasoft-ui-components-text-field.mjs.map +1 -0
  41. package/fesm2022/shirkasoft-ui-components-timeline.mjs +222 -0
  42. package/fesm2022/shirkasoft-ui-components-timeline.mjs.map +1 -0
  43. package/fesm2022/shirkasoft-ui-components-toggle.mjs +186 -0
  44. package/fesm2022/shirkasoft-ui-components-toggle.mjs.map +1 -0
  45. package/fesm2022/shirkasoft-ui-components-tooltip.mjs +169 -0
  46. package/fesm2022/shirkasoft-ui-components-tooltip.mjs.map +1 -0
  47. package/fesm2022/shirkasoft-ui-components-utils.mjs +64 -0
  48. package/fesm2022/shirkasoft-ui-components-utils.mjs.map +1 -0
  49. package/fesm2022/shirkasoft-ui-components-wizard.mjs +167 -0
  50. package/fesm2022/shirkasoft-ui-components-wizard.mjs.map +1 -0
  51. package/fesm2022/shirkasoft-ui-components.mjs +0 -5729
  52. package/fesm2022/shirkasoft-ui-components.mjs.map +1 -1
  53. package/package.json +101 -1
  54. package/types/shirkasoft-ui-components-breadcrumb.d.ts +68 -0
  55. package/types/shirkasoft-ui-components-button.d.ts +59 -0
  56. package/types/shirkasoft-ui-components-chart.d.ts +65 -0
  57. package/types/shirkasoft-ui-components-confirm-dialog.d.ts +88 -0
  58. package/types/shirkasoft-ui-components-date-picker.d.ts +200 -0
  59. package/types/shirkasoft-ui-components-fieldset.d.ts +72 -0
  60. package/types/shirkasoft-ui-components-file-upload.d.ts +87 -0
  61. package/types/shirkasoft-ui-components-knob.d.ts +69 -0
  62. package/types/shirkasoft-ui-components-loading.d.ts +94 -0
  63. package/types/shirkasoft-ui-components-modal.d.ts +139 -0
  64. package/types/shirkasoft-ui-components-notification.d.ts +82 -0
  65. package/types/shirkasoft-ui-components-price-input.d.ts +41 -0
  66. package/types/shirkasoft-ui-components-rail-sidebar.d.ts +121 -0
  67. package/types/shirkasoft-ui-components-select.d.ts +182 -0
  68. package/types/shirkasoft-ui-components-sidebar.d.ts +106 -0
  69. package/types/shirkasoft-ui-components-skeleton.d.ts +36 -0
  70. package/types/shirkasoft-ui-components-table.d.ts +293 -0
  71. package/types/shirkasoft-ui-components-tabs.d.ts +102 -0
  72. package/types/shirkasoft-ui-components-tag.d.ts +31 -0
  73. package/types/shirkasoft-ui-components-text-field.d.ts +120 -0
  74. package/types/shirkasoft-ui-components-timeline.d.ts +178 -0
  75. package/types/shirkasoft-ui-components-toggle.d.ts +48 -0
  76. package/types/shirkasoft-ui-components-tooltip.d.ts +47 -0
  77. package/types/shirkasoft-ui-components-utils.d.ts +9 -0
  78. package/types/shirkasoft-ui-components-wizard.d.ts +101 -0
  79. package/types/shirkasoft-ui-components.d.ts +1 -2333
@@ -0,0 +1,370 @@
1
+ import * as i1 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, ChangeDetectorRef, input, output, viewChild, signal, computed, DestroyRef, effect, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
5
+ import * as i2 from '@angular/forms';
6
+ import { ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
+ import { TranslocoService } from '@jsverse/transloco';
9
+ import { LucideEye, LucideDynamicIcon } from '@lucide/angular';
10
+ import { getIcon } from 'shirkasoft-ui-components/utils';
11
+
12
+ /**
13
+ * Shirkasoft UI Components.
14
+ * Authors: Roberto Valladares Martin (Ansem13), Julio César García García (Sanjuli14).
15
+ * Belongs to Shirkasoft.
16
+ */
17
+ /**
18
+ * Text input (or textarea) that implements ControlValueAccessor with built-in
19
+ * validation messages, card/number formatting, password reveal and search mode.
20
+ */
21
+ class TextFieldComponent {
22
+ constructor() {
23
+ this.cdr = inject(ChangeDetectorRef);
24
+ /** id attribute applied to the native input. */
25
+ this.id = input('', ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
26
+ /** Formats the value as a credit card number (XXXX-XXXX-XXXX-XXXX). */
27
+ this.formatCard = input(false, ...(ngDevMode ? [{ debugName: "formatCard" }] : /* istanbul ignore next */ []));
28
+ /** Blocks the minus sign from being typed. */
29
+ this.preventNegative = input(false, ...(ngDevMode ? [{ debugName: "preventNegative" }] : /* istanbul ignore next */ []));
30
+ /** Label rendered above the field. */
31
+ this.label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
32
+ /** Native input type ('text', 'password', 'number', etc.). */
33
+ this.type = input('text', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
34
+ /** Allows digits only, stripping any other character. */
35
+ this.numbersOnly = input(false, ...(ngDevMode ? [{ debugName: "numbersOnly" }] : /* istanbul ignore next */ []));
36
+ /** When true, allows decimals and normalizes ',' to '.'. */
37
+ this.allowDecimals = input(false, ...(ngDevMode ? [{ debugName: "allowDecimals" }] : /* istanbul ignore next */ []));
38
+ /** Maximum number of characters the user can type. */
39
+ this.maxLength = input(undefined, ...(ngDevMode ? [{ debugName: "maxLength" }] : /* istanbul ignore next */ []));
40
+ /** Placeholder text of the native input. */
41
+ this.placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
42
+ /** Custom messages keyed by validation error name. */
43
+ this.errorMessages = input({}, ...(ngDevMode ? [{ debugName: "errorMessages" }] : /* istanbul ignore next */ []));
44
+ /** Parent reactive form used to resolve the control by label. */
45
+ this.formGroup = input(undefined, ...(ngDevMode ? [{ debugName: "formGroup" }] : /* istanbul ignore next */ []));
46
+ /** Reactive control bound directly to this field. */
47
+ this.control = input(undefined, ...(ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []));
48
+ /** Disables the field. */
49
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
50
+ /** Custom error message shown regardless of validation errors. */
51
+ this.errorMessage = input('', ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
52
+ /** Renders a textarea instead of an input. */
53
+ this.isTextArea = input(false, ...(ngDevMode ? [{ debugName: "isTextArea" }] : /* istanbul ignore next */ []));
54
+ /** Height classes applied when `isTextArea` is true. */
55
+ this.textAreaHeight = input('h-28', ...(ngDevMode ? [{ debugName: "textAreaHeight" }] : /* istanbul ignore next */ []));
56
+ /** Renders the field as a read-only search trigger. */
57
+ this.searchMode = input(false, ...(ngDevMode ? [{ debugName: "searchMode" }] : /* istanbul ignore next */ []));
58
+ /** Value shown when `searchMode` is enabled. */
59
+ this.displayValue = input('', ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
60
+ /** Native autocomplete attribute. */
61
+ this.autocomplete = input('', ...(ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []));
62
+ /** Emitted when the search button is clicked (search mode). */
63
+ this.searchButtonClick = output();
64
+ this.getIcon = (name) => getIcon(name, LucideEye);
65
+ /** Reference to the native input element. */
66
+ this.inputElement = viewChild('input', ...(ngDevMode ? [{ debugName: "inputElement" }] : /* istanbul ignore next */ []));
67
+ /** Reference to the native textarea element. */
68
+ this.textareaElement = viewChild('textarea', ...(ngDevMode ? [{ debugName: "textareaElement" }] : /* istanbul ignore next */ []));
69
+ /** Internal raw value of the field. */
70
+ this._value = signal('', ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
71
+ /** Reactive disabled state from the form control. */
72
+ this._disabledState = signal(false, ...(ngDevMode ? [{ debugName: "_disabledState" }] : /* istanbul ignore next */ []));
73
+ /** Whether the password is currently revealed. */
74
+ this.showPassword = signal(false, ...(ngDevMode ? [{ debugName: "showPassword" }] : /* istanbul ignore next */ []));
75
+ /** Tracks whether the control was in error at some point (for "was fixed" UX). */
76
+ this.hadError = signal(false, ...(ngDevMode ? [{ debugName: "hadError" }] : /* istanbul ignore next */ []));
77
+ /** Counter bumped to trigger recomputation of derived error signals. */
78
+ this.errorTracker = signal(0, ...(ngDevMode ? [{ debugName: "errorTracker" }] : /* istanbul ignore next */ []));
79
+ /** Text displayed in search mode when `displayValue` is set. */
80
+ this.displayLabel = computed(() => {
81
+ if (this.searchMode() && this.displayValue()) {
82
+ return this.displayValue();
83
+ }
84
+ return '';
85
+ }, ...(ngDevMode ? [{ debugName: "displayLabel" }] : /* istanbul ignore next */ []));
86
+ /** Prevents re-subscribing to the same form control. */
87
+ this.subscribed = signal(false, ...(ngDevMode ? [{ debugName: "subscribed" }] : /* istanbul ignore next */ []));
88
+ /** Effective disabled state combining the input and the form binding. */
89
+ this.isDisabled = computed(() => this.disabled() || this._disabledState(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
90
+ /** Current field value. */
91
+ this.value = computed(() => this._value(), ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
92
+ /** Resolves the reactive control: explicit `control` or `formGroup.get(label)`. */
93
+ this.actualControl = computed(() => {
94
+ const ctrl = this.control();
95
+ if (ctrl)
96
+ return ctrl;
97
+ const fg = this.formGroup();
98
+ const lbl = this.label();
99
+ if (fg && lbl) {
100
+ return fg.get(lbl);
101
+ }
102
+ return undefined;
103
+ }, ...(ngDevMode ? [{ debugName: "actualControl" }] : /* istanbul ignore next */ []));
104
+ /** True when the resolved control is invalid and dirty or touched. */
105
+ this.shouldShowError = computed(() => {
106
+ this.errorTracker();
107
+ const ctrl = this.actualControl();
108
+ return ctrl?.invalid && (ctrl?.dirty || ctrl?.touched);
109
+ }, ...(ngDevMode ? [{ debugName: "shouldShowError" }] : /* istanbul ignore next */ []));
110
+ /** True when the control had an error before and is now valid (success state). */
111
+ this.wasFixedError = computed(() => {
112
+ this.errorTracker();
113
+ const ctrl = this.actualControl();
114
+ return this.hadError() && ctrl?.valid && ctrl?.touched;
115
+ }, ...(ngDevMode ? [{ debugName: "wasFixedError" }] : /* istanbul ignore next */ []));
116
+ /** Resolved list of error messages for the current control state. */
117
+ this.getErrorMessages = computed(() => {
118
+ this.errorTracker();
119
+ const customError = this.errorMessage();
120
+ if (customError) {
121
+ return [customError];
122
+ }
123
+ const ctrl = this.actualControl();
124
+ if (!ctrl?.errors)
125
+ return [];
126
+ const customErrors = this.errorMessages();
127
+ const t = this.transloco;
128
+ return Object.keys(ctrl.errors).map((errorKey) => {
129
+ if (customErrors[errorKey])
130
+ return customErrors[errorKey];
131
+ switch (errorKey) {
132
+ case 'required':
133
+ return t.translate('validation.required');
134
+ case 'email':
135
+ return t.translate('validation.email');
136
+ case 'minlength':
137
+ return t.translate('validation.minlength', {
138
+ min: ctrl.errors['minlength'].requiredLength,
139
+ });
140
+ case 'maxlength':
141
+ return t.translate('validation.maxlength', {
142
+ max: ctrl.errors['maxlength'].requiredLength,
143
+ });
144
+ case 'pattern':
145
+ return t.translate('validation.pattern');
146
+ default:
147
+ return t.translate('validation.invalid');
148
+ }
149
+ });
150
+ }, ...(ngDevMode ? [{ debugName: "getErrorMessages" }] : /* istanbul ignore next */ []));
151
+ /** Effective input type (handles textarea and password reveal). */
152
+ this.effectiveType = computed(() => {
153
+ if (this.isTextArea())
154
+ return 'text';
155
+ if (this.type() === 'password' && this.showPassword())
156
+ return 'text';
157
+ return this.type();
158
+ }, ...(ngDevMode ? [{ debugName: "effectiveType" }] : /* istanbul ignore next */ []));
159
+ this.transloco = inject(TranslocoService);
160
+ /** Callback notified with the new value (ControlValueAccessor). */
161
+ this.onChange = () => { };
162
+ /** Callback notified when the field is touched (ControlValueAccessor). */
163
+ this.onTouched = () => { };
164
+ this.destroyRef = inject(DestroyRef);
165
+ effect(() => {
166
+ const ctrl = this.actualControl();
167
+ const shouldDisable = this.isDisabled();
168
+ if (ctrl && shouldDisable) {
169
+ Promise.resolve().then(() => {
170
+ ctrl.disable();
171
+ });
172
+ }
173
+ });
174
+ effect(() => {
175
+ const ctrl = this.actualControl();
176
+ if (!ctrl) {
177
+ this.subscribed.set(false);
178
+ return;
179
+ }
180
+ if (this.subscribed())
181
+ return;
182
+ if (ctrl.invalid && ctrl.touched) {
183
+ this.hadError.set(true);
184
+ }
185
+ ctrl.statusChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
186
+ this.errorTracker.update((v) => v + 1);
187
+ if (ctrl.invalid && ctrl.touched) {
188
+ this.hadError.set(true);
189
+ }
190
+ });
191
+ ctrl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
192
+ this.errorTracker.update((v) => v + 1);
193
+ });
194
+ this.subscribed.set(true);
195
+ });
196
+ this.transloco.langChanges$
197
+ .pipe(takeUntilDestroyed(this.destroyRef))
198
+ .subscribe(() => {
199
+ this.errorTracker.update((v) => v + 1);
200
+ });
201
+ }
202
+ /** Prevents disallowed characters based on the `numbersOnly`/`allowDecimals` config. */
203
+ numberValidation(event) {
204
+ const allowedKeys = [
205
+ 'Backspace',
206
+ 'Tab',
207
+ 'End',
208
+ 'Home',
209
+ 'ArrowLeft',
210
+ 'ArrowRight',
211
+ 'Delete',
212
+ ];
213
+ if (this.numbersOnly()) {
214
+ const isNumber = /^\d$/.test(event.key);
215
+ if (!isNumber && !allowedKeys.includes(event.key)) {
216
+ event.preventDefault();
217
+ }
218
+ return;
219
+ }
220
+ if (this.allowDecimals() || this.type() === 'number') {
221
+ allowedKeys.push('.');
222
+ }
223
+ const isDecimal = event.key === '.' || event.key === ',';
224
+ const isNumber = !isNaN(Number(event.key));
225
+ if (allowedKeys.includes(event.key)) {
226
+ if (isDecimal) {
227
+ const input = event.target;
228
+ const currentValue = input.value;
229
+ const hasDecimalSeparator = currentValue.includes('.') || currentValue.includes(',');
230
+ if (hasDecimalSeparator) {
231
+ event.preventDefault();
232
+ }
233
+ }
234
+ return;
235
+ }
236
+ if (isNumber) {
237
+ return;
238
+ }
239
+ event.preventDefault();
240
+ }
241
+ /** Marks the field as touched and refreshes the error state. */
242
+ onBlur() {
243
+ this.onTouched();
244
+ this.errorTracker.update((v) => v + 1);
245
+ const ctrl = this.actualControl();
246
+ if (ctrl?.invalid && ctrl?.touched) {
247
+ this.hadError.set(true);
248
+ }
249
+ }
250
+ /** Formats the raw input as a credit card number and notifies the control. */
251
+ onCardInput(event) {
252
+ const input = event.target;
253
+ let value = input.value.replace(/[^0-9]/g, '');
254
+ if (value.length > 16) {
255
+ value = value.substring(0, 16);
256
+ }
257
+ let formatted = '';
258
+ for (let i = 0; i < value.length; i++) {
259
+ if (i > 0 && i % 4 === 0) {
260
+ formatted += '-';
261
+ }
262
+ formatted += value[i];
263
+ }
264
+ input.value = formatted;
265
+ this.onChange(formatted);
266
+ }
267
+ /** Handles raw input: applies number/card/max-length formatting and notifies the control. */
268
+ onInput(event) {
269
+ const input = event.target;
270
+ let newValue = input.value;
271
+ if (this.allowDecimals()) {
272
+ newValue = newValue.replace(/,/g, '.');
273
+ const parts = newValue.split('.');
274
+ if (parts.length > 2) {
275
+ newValue = parts[0] + '.' + parts.slice(1).join('');
276
+ }
277
+ if (parts.length > 1 && parts[1].length > 2) {
278
+ newValue = parts[0] + '.' + parts[1].substring(0, 2);
279
+ }
280
+ }
281
+ if (this.numbersOnly()) {
282
+ newValue = newValue.replace(/[^0-9]/g, '');
283
+ }
284
+ const maxLen = this.maxLength();
285
+ if (maxLen && newValue.length > maxLen) {
286
+ newValue = newValue.substring(0, maxLen);
287
+ input.value = newValue;
288
+ const ctrl = this.actualControl();
289
+ setTimeout(() => {
290
+ ctrl?.updateValueAndValidity();
291
+ this.errorTracker.update((v) => v + 1);
292
+ });
293
+ }
294
+ if (this.formatCard()) {
295
+ this.onCardInput(event);
296
+ }
297
+ else {
298
+ this.onChange(newValue);
299
+ }
300
+ }
301
+ /** Toggles the visibility of a password field. */
302
+ togglePasswordVisibility() {
303
+ this.showPassword.update((v) => !v);
304
+ }
305
+ /** Sets the value from the form control applying the same formatting rules. */
306
+ writeValue(value) {
307
+ let processedValue = value;
308
+ if (this.allowDecimals() && value) {
309
+ processedValue = String(value).replace(/,/g, '.');
310
+ }
311
+ if (this.numbersOnly() && value) {
312
+ processedValue = value.toString().replace(/[^0-9]/g, '');
313
+ }
314
+ const maxLen = this.maxLength();
315
+ if (maxLen && processedValue?.length > maxLen) {
316
+ processedValue = processedValue.substring(0, maxLen);
317
+ }
318
+ if (this.formatCard() && processedValue) {
319
+ const cleaned = processedValue.replace(/[^0-9]/g, '');
320
+ let formatted = '';
321
+ for (let i = 0; i < cleaned.length; i++) {
322
+ if (i > 0 && i % 4 === 0)
323
+ formatted += '-';
324
+ formatted += cleaned[i];
325
+ }
326
+ this._value.set(formatted);
327
+ }
328
+ else {
329
+ this._value.set(processedValue);
330
+ }
331
+ }
332
+ /** Registers the callback invoked on value changes (ControlValueAccessor). */
333
+ registerOnChange(fn) {
334
+ this.onChange = fn;
335
+ }
336
+ /** Registers the callback invoked when the field is touched. */
337
+ registerOnTouched(fn) {
338
+ this.onTouched = fn;
339
+ }
340
+ /** Reflects the disabled state of the form control. */
341
+ setDisabledState(isDisabled) {
342
+ this._disabledState.set(isDisabled);
343
+ this.cdr.markForCheck();
344
+ }
345
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TextFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
346
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: TextFieldComponent, isStandalone: true, selector: "shk-text-field", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, formatCard: { classPropertyName: "formatCard", publicName: "formatCard", isSignal: true, isRequired: false, transformFunction: null }, preventNegative: { classPropertyName: "preventNegative", publicName: "preventNegative", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, numbersOnly: { classPropertyName: "numbersOnly", publicName: "numbersOnly", isSignal: true, isRequired: false, transformFunction: null }, allowDecimals: { classPropertyName: "allowDecimals", publicName: "allowDecimals", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, errorMessages: { classPropertyName: "errorMessages", publicName: "errorMessages", isSignal: true, isRequired: false, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: false, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, isTextArea: { classPropertyName: "isTextArea", publicName: "isTextArea", isSignal: true, isRequired: false, transformFunction: null }, textAreaHeight: { classPropertyName: "textAreaHeight", publicName: "textAreaHeight", isSignal: true, isRequired: false, transformFunction: null }, searchMode: { classPropertyName: "searchMode", publicName: "searchMode", isSignal: true, isRequired: false, transformFunction: null }, displayValue: { classPropertyName: "displayValue", publicName: "displayValue", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchButtonClick: "searchButtonClick" }, providers: [
347
+ {
348
+ provide: NG_VALUE_ACCESSOR,
349
+ useExisting: forwardRef(() => TextFieldComponent),
350
+ multi: true,
351
+ },
352
+ ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "textareaElement", first: true, predicate: ["textarea"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"relative mb-4\">\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div class=\"relative\">\n @if (!isTextArea()) {\n <div class=\"flex\">\n @if (searchMode()) {\n @let isDisabledSearch = actualControl()?.disabled || isDisabled();\n <input\n #input\n [id]=\"id()\"\n type=\"text\"\n [value]=\"displayValue() || ''\"\n [placeholder]=\"placeholder() || label()\"\n [readOnly]=\"true\"\n [disabled]=\"isDisabledSearch\"\n (click)=\"!isDisabledSearch && searchButtonClick.emit()\"\n (keydown.enter)=\"!isDisabledSearch && searchButtonClick.emit()\"\n (blur)=\"onBlur()\"\n autocomplete=\"off\"\n [class.cursor-pointer]=\"!isDisabledSearch\"\n [class.cursor-not-allowed]=\"isDisabledSearch\"\n [class._shk-bg-surface-50]=\"isDisabledSearch\"\n [class.dark:[background-color:var(--shk-surface-100)]]=\"isDisabledSearch\"\n [class._shk-text-surface-400]=\"isDisabledSearch\"\n [class.dark:[color:var(--shk-surface-400)]]=\"isDisabledSearch\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-l-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500': shouldShowError() && !isDisabledSearch,\n '_shk-border': !shouldShowError() || isDisabledSearch,\n 'cursor-pointer': !isDisabledSearch,\n 'cursor-not-allowed _shk-text-surface-400 dark:[color:var(--shk-surface-400)]': isDisabledSearch\n }\"\n />\n <button\n type=\"button\"\n (click)=\"searchButtonClick.emit()\"\n tabindex=\"-1\"\n [disabled]=\"isDisabledSearch\"\n class=\"px-3 flex items-center justify-center shrink-0 _shk-bg-primary hover:[background-color:var(--shk-primary-700)] text-white border _shk-border-primary rounded-r-lg transition-colors duration-200 disabled:[background-color:var(--shk-surface-300)] dark:disabled:[background-color:var(--shk-surface-200)] disabled:[border-color:var(--shk-surface-300)] dark:disabled:[border-color:var(--shk-surface-200)] disabled:cursor-not-allowed\"\n >\n <svg [lucideIcon]=\"getIcon('search')\" class=\"w-4 h-4\"></svg>\n </button>\n }\n\n @if (!searchMode()) {\n <input\n #input\n [id]=\"id()\"\n [maxlength]=\"maxLength() || (formatCard() ? 19 : null)\"\n [min]=\"type() === 'number' && preventNegative() ? '0' : null\"\n (keypress)=\"type() === 'number' || numbersOnly() ? numberValidation($event) : null\"\n [type]=\"effectiveType()\"\n [formControl]=\"$any(actualControl())\"\n [placeholder]=\"placeholder() || label()\"\n (input)=\"onInput($event)\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onBlur()\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:outline-none focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] focus:ring-1 disabled:[background-color:var(--shk-surface-50)] dark:disabled:[background-color:var(--shk-surface-100)] disabled:cursor-not-allowed sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500 focus:border-red-500 focus:ring-red-500': shouldShowError(),\n 'border-green-500 focus:border-green-500 focus:ring-green-500': wasFixedError(),\n '_shk-border focus:[border-color:var(--shk-primary-500)] focus:[--tw-ring-color:var(--shk-primary-500)]': !shouldShowError() && !wasFixedError()\n }\"\n [class.pr-8]=\"type() === 'password' && actualControl()?.value?.length > 0\"\n [class.pr-3]=\"type() !== 'password' || !actualControl()?.value?.length\"\n />\n\n @if (type() === 'password' && actualControl()?.value?.length > 0) {\n <button\n type=\"button\"\n (click)=\"togglePasswordVisibility()\"\n [disabled]=\"actualControl()?.disabled\"\n class=\"absolute right-3 top-1/2 -translate-y-1/2 _shk-text-surface-400 dark:[color:var(--shk-surface-400)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-600)] focus:outline-none\"\n >\n @if (showPassword()) {\n <svg [lucideIcon]=\"getIcon('eye-off')\" class=\"w-4 h-4\"></svg>\n } @else {\n <svg [lucideIcon]=\"getIcon('eye')\" class=\"w-4 h-4\"></svg>\n }\n </button>\n }\n }\n </div>\n }\n\n @if (isTextArea()) {\n <textarea\n #textarea\n [id]=\"id()\"\n [formControl]=\"$any(actualControl())\"\n [placeholder]=\"placeholder() || label()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n [class]=\"isTextArea() ? textAreaHeight() : 'h-28'\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:outline-none focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] focus:ring-1 resize-none disabled:[background-color:var(--shk-surface-50)] dark:disabled:[background-color:var(--shk-surface-100)] disabled:cursor-not-allowed disabled:[color:var(--shk-surface-400)] dark:disabled:[color:var(--shk-surface-400)] sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500 focus:border-red-500 focus:ring-red-500': shouldShowError(),\n 'border-green-500 focus:border-green-500 focus:ring-green-500': wasFixedError(),\n '_shk-border focus:[border-color:var(--shk-primary-500)] focus:[--tw-ring-color:var(--shk-primary-500)]': !shouldShowError() && !wasFixedError()\n }\"\n ></textarea>\n }\n </div>\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
353
+ }
354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TextFieldComponent, decorators: [{
355
+ type: Component,
356
+ args: [{ selector: 'shk-text-field', standalone: true, imports: [CommonModule, ReactiveFormsModule, LucideDynamicIcon], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
357
+ {
358
+ provide: NG_VALUE_ACCESSOR,
359
+ useExisting: forwardRef(() => TextFieldComponent),
360
+ multi: true,
361
+ },
362
+ ], template: "<div class=\"relative mb-4\">\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div class=\"relative\">\n @if (!isTextArea()) {\n <div class=\"flex\">\n @if (searchMode()) {\n @let isDisabledSearch = actualControl()?.disabled || isDisabled();\n <input\n #input\n [id]=\"id()\"\n type=\"text\"\n [value]=\"displayValue() || ''\"\n [placeholder]=\"placeholder() || label()\"\n [readOnly]=\"true\"\n [disabled]=\"isDisabledSearch\"\n (click)=\"!isDisabledSearch && searchButtonClick.emit()\"\n (keydown.enter)=\"!isDisabledSearch && searchButtonClick.emit()\"\n (blur)=\"onBlur()\"\n autocomplete=\"off\"\n [class.cursor-pointer]=\"!isDisabledSearch\"\n [class.cursor-not-allowed]=\"isDisabledSearch\"\n [class._shk-bg-surface-50]=\"isDisabledSearch\"\n [class.dark:[background-color:var(--shk-surface-100)]]=\"isDisabledSearch\"\n [class._shk-text-surface-400]=\"isDisabledSearch\"\n [class.dark:[color:var(--shk-surface-400)]]=\"isDisabledSearch\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-l-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500': shouldShowError() && !isDisabledSearch,\n '_shk-border': !shouldShowError() || isDisabledSearch,\n 'cursor-pointer': !isDisabledSearch,\n 'cursor-not-allowed _shk-text-surface-400 dark:[color:var(--shk-surface-400)]': isDisabledSearch\n }\"\n />\n <button\n type=\"button\"\n (click)=\"searchButtonClick.emit()\"\n tabindex=\"-1\"\n [disabled]=\"isDisabledSearch\"\n class=\"px-3 flex items-center justify-center shrink-0 _shk-bg-primary hover:[background-color:var(--shk-primary-700)] text-white border _shk-border-primary rounded-r-lg transition-colors duration-200 disabled:[background-color:var(--shk-surface-300)] dark:disabled:[background-color:var(--shk-surface-200)] disabled:[border-color:var(--shk-surface-300)] dark:disabled:[border-color:var(--shk-surface-200)] disabled:cursor-not-allowed\"\n >\n <svg [lucideIcon]=\"getIcon('search')\" class=\"w-4 h-4\"></svg>\n </button>\n }\n\n @if (!searchMode()) {\n <input\n #input\n [id]=\"id()\"\n [maxlength]=\"maxLength() || (formatCard() ? 19 : null)\"\n [min]=\"type() === 'number' && preventNegative() ? '0' : null\"\n (keypress)=\"type() === 'number' || numbersOnly() ? numberValidation($event) : null\"\n [type]=\"effectiveType()\"\n [formControl]=\"$any(actualControl())\"\n [placeholder]=\"placeholder() || label()\"\n (input)=\"onInput($event)\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onBlur()\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:outline-none focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] focus:ring-1 disabled:[background-color:var(--shk-surface-50)] dark:disabled:[background-color:var(--shk-surface-100)] disabled:cursor-not-allowed sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500 focus:border-red-500 focus:ring-red-500': shouldShowError(),\n 'border-green-500 focus:border-green-500 focus:ring-green-500': wasFixedError(),\n '_shk-border focus:[border-color:var(--shk-primary-500)] focus:[--tw-ring-color:var(--shk-primary-500)]': !shouldShowError() && !wasFixedError()\n }\"\n [class.pr-8]=\"type() === 'password' && actualControl()?.value?.length > 0\"\n [class.pr-3]=\"type() !== 'password' || !actualControl()?.value?.length\"\n />\n\n @if (type() === 'password' && actualControl()?.value?.length > 0) {\n <button\n type=\"button\"\n (click)=\"togglePasswordVisibility()\"\n [disabled]=\"actualControl()?.disabled\"\n class=\"absolute right-3 top-1/2 -translate-y-1/2 _shk-text-surface-400 dark:[color:var(--shk-surface-400)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-600)] focus:outline-none\"\n >\n @if (showPassword()) {\n <svg [lucideIcon]=\"getIcon('eye-off')\" class=\"w-4 h-4\"></svg>\n } @else {\n <svg [lucideIcon]=\"getIcon('eye')\" class=\"w-4 h-4\"></svg>\n }\n </button>\n }\n }\n </div>\n }\n\n @if (isTextArea()) {\n <textarea\n #textarea\n [id]=\"id()\"\n [formControl]=\"$any(actualControl())\"\n [placeholder]=\"placeholder() || label()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n [class]=\"isTextArea() ? textAreaHeight() : 'h-28'\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:outline-none focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] focus:ring-1 resize-none disabled:[background-color:var(--shk-surface-50)] dark:disabled:[background-color:var(--shk-surface-100)] disabled:cursor-not-allowed disabled:[color:var(--shk-surface-400)] dark:disabled:[color:var(--shk-surface-400)] sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500 focus:border-red-500 focus:ring-red-500': shouldShowError(),\n 'border-green-500 focus:border-green-500 focus:ring-green-500': wasFixedError(),\n '_shk-border focus:[border-color:var(--shk-primary-500)] focus:[--tw-ring-color:var(--shk-primary-500)]': !shouldShowError() && !wasFixedError()\n }\"\n ></textarea>\n }\n </div>\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>\n" }]
363
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], formatCard: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatCard", required: false }] }], preventNegative: [{ type: i0.Input, args: [{ isSignal: true, alias: "preventNegative", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], numbersOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "numbersOnly", required: false }] }], allowDecimals: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowDecimals", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], errorMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessages", required: false }] }], formGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "formGroup", required: false }] }], control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], isTextArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "isTextArea", required: false }] }], textAreaHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "textAreaHeight", required: false }] }], searchMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchMode", required: false }] }], displayValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayValue", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], searchButtonClick: [{ type: i0.Output, args: ["searchButtonClick"] }], inputElement: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }], textareaElement: [{ type: i0.ViewChild, args: ['textarea', { isSignal: true }] }] } });
364
+
365
+ /**
366
+ * Generated bundle index. Do not edit.
367
+ */
368
+
369
+ export { TextFieldComponent };
370
+ //# sourceMappingURL=shirkasoft-ui-components-text-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shirkasoft-ui-components-text-field.mjs","sources":["../../../projects/ui-components/text-field/text-field.component.ts","../../../projects/ui-components/text-field/text-field.component.html","../../../projects/ui-components/text-field/shirkasoft-ui-components-text-field.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n input,\n forwardRef,\n signal,\n computed,\n effect,\n viewChild,\n ElementRef,\n ChangeDetectionStrategy,\n DestroyRef,\n inject,\n output,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormGroup,\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n LucideDynamicIcon,\n LucideEye,\n} from '@lucide/angular';\nimport { getIcon as getIconFromCentral } from 'shirkasoft-ui-components/utils';\n\n/**\n * Shirkasoft UI Components.\n * Authors: Roberto Valladares Martin (Ansem13), Julio César García García (Sanjuli14).\n * Belongs to Shirkasoft.\n */\n\n/**\n * Text input (or textarea) that implements ControlValueAccessor with built-in\n * validation messages, card/number formatting, password reveal and search mode.\n */\n@Component({\n selector: 'shk-text-field',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, LucideDynamicIcon],\n templateUrl: './text-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextFieldComponent),\n multi: true,\n },\n ],\n})\nexport class TextFieldComponent implements ControlValueAccessor {\n private cdr = inject(ChangeDetectorRef);\n\n /** id attribute applied to the native input. */\n id = input<string>('');\n /** Formats the value as a credit card number (XXXX-XXXX-XXXX-XXXX). */\n formatCard = input<boolean>(false);\n /** Blocks the minus sign from being typed. */\n preventNegative = input<boolean>(false);\n /** Label rendered above the field. */\n label = input<string>('');\n /** Native input type ('text', 'password', 'number', etc.). */\n type = input<string>('text');\n /** Allows digits only, stripping any other character. */\n numbersOnly = input<boolean>(false);\n /** When true, allows decimals and normalizes ',' to '.'. */\n allowDecimals = input<boolean>(false);\n /** Maximum number of characters the user can type. */\n maxLength = input<number | undefined>(undefined);\n /** Placeholder text of the native input. */\n placeholder = input<string>('');\n /** Custom messages keyed by validation error name. */\n errorMessages = input<{ [key: string]: string }>({});\n /** Parent reactive form used to resolve the control by label. */\n formGroup = input<FormGroup | undefined>(undefined);\n /** Reactive control bound directly to this field. */\n control = input<FormControl | undefined>(undefined);\n /** Disables the field. */\n disabled = input<boolean>(false);\n /** Custom error message shown regardless of validation errors. */\n errorMessage = input<string>('');\n /** Renders a textarea instead of an input. */\n isTextArea = input<boolean>(false);\n /** Height classes applied when `isTextArea` is true. */\n textAreaHeight = input<string>('h-28');\n /** Renders the field as a read-only search trigger. */\n searchMode = input<boolean>(false);\n /** Value shown when `searchMode` is enabled. */\n displayValue = input<string>('');\n /** Native autocomplete attribute. */\n autocomplete = input<string>('');\n /** Emitted when the search button is clicked (search mode). */\n searchButtonClick = output<void>();\n protected readonly getIcon = (name: any) => getIconFromCentral(name, LucideEye);\n\n /** Reference to the native input element. */\n inputElement = viewChild<ElementRef<HTMLInputElement>>('input');\n /** Reference to the native textarea element. */\n textareaElement = viewChild<ElementRef<HTMLTextAreaElement>>('textarea');\n\n /** Internal raw value of the field. */\n private _value = signal<any>('');\n /** Reactive disabled state from the form control. */\n private _disabledState = signal<boolean>(false);\n /** Whether the password is currently revealed. */\n showPassword = signal<boolean>(false);\n /** Tracks whether the control was in error at some point (for \"was fixed\" UX). */\n hadError = signal<boolean>(false);\n /** Counter bumped to trigger recomputation of derived error signals. */\n private errorTracker = signal<number>(0);\n\n /** Text displayed in search mode when `displayValue` is set. */\n displayLabel = computed(() => {\n if (this.searchMode() && this.displayValue()) {\n return this.displayValue();\n }\n return '';\n });\n /** Prevents re-subscribing to the same form control. */\n private subscribed = signal<boolean>(false);\n\n /** Effective disabled state combining the input and the form binding. */\n isDisabled = computed(() => this.disabled() || this._disabledState());\n\n /** Current field value. */\n value = computed(() => this._value());\n\n /** Resolves the reactive control: explicit `control` or `formGroup.get(label)`. */\n actualControl = computed(() => {\n const ctrl = this.control();\n if (ctrl) return ctrl;\n\n const fg = this.formGroup();\n const lbl = this.label();\n if (fg && lbl) {\n return fg.get(lbl) as FormControl;\n }\n return undefined;\n });\n\n /** True when the resolved control is invalid and dirty or touched. */\n shouldShowError = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n return ctrl?.invalid && (ctrl?.dirty || ctrl?.touched);\n });\n\n /** True when the control had an error before and is now valid (success state). */\n wasFixedError = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n return this.hadError() && ctrl?.valid && ctrl?.touched;\n });\n\n /** Resolved list of error messages for the current control state. */\n getErrorMessages = computed(() => {\n this.errorTracker();\n\n const customError = this.errorMessage();\n if (customError) {\n return [customError];\n }\n\n const ctrl = this.actualControl();\n if (!ctrl?.errors) return [];\n\n const customErrors = this.errorMessages();\n const t = this.transloco;\n\n return Object.keys(ctrl.errors).map((errorKey) => {\n if (customErrors[errorKey]) return customErrors[errorKey];\n\n switch (errorKey) {\n case 'required':\n return t.translate('validation.required');\n case 'email':\n return t.translate('validation.email');\n case 'minlength':\n return t.translate('validation.minlength', {\n min: ctrl.errors!['minlength'].requiredLength,\n });\n case 'maxlength':\n return t.translate('validation.maxlength', {\n max: ctrl.errors!['maxlength'].requiredLength,\n });\n case 'pattern':\n return t.translate('validation.pattern');\n default:\n return t.translate('validation.invalid');\n }\n });\n });\n\n /** Effective input type (handles textarea and password reveal). */\n effectiveType = computed(() => {\n if (this.isTextArea()) return 'text';\n if (this.type() === 'password' && this.showPassword()) return 'text';\n return this.type();\n });\n\n private transloco = inject(TranslocoService);\n /** Callback notified with the new value (ControlValueAccessor). */\n private onChange: (value: any) => void = () => {};\n\n /** Callback notified when the field is touched (ControlValueAccessor). */\n private onTouched: () => void = () => {};\n private destroyRef = inject(DestroyRef);\n\n constructor() {\n effect(() => {\n const ctrl = this.actualControl();\n const shouldDisable = this.isDisabled();\n\n if (ctrl && shouldDisable) {\n Promise.resolve().then(() => {\n ctrl.disable();\n });\n }\n });\n\n effect(() => {\n const ctrl = this.actualControl();\n\n if (!ctrl) {\n this.subscribed.set(false);\n return;\n }\n\n if (this.subscribed()) return;\n\n if (ctrl.invalid && ctrl.touched) {\n this.hadError.set(true);\n }\n\n ctrl.statusChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n\n if (ctrl.invalid && ctrl.touched) {\n this.hadError.set(true);\n }\n });\n\n ctrl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n });\n\n this.subscribed.set(true);\n });\n\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n });\n }\n\n /** Prevents disallowed characters based on the `numbersOnly`/`allowDecimals` config. */\n numberValidation(event: KeyboardEvent) {\n const allowedKeys = [\n 'Backspace',\n 'Tab',\n 'End',\n 'Home',\n 'ArrowLeft',\n 'ArrowRight',\n 'Delete',\n ];\n\n if (this.numbersOnly()) {\n const isNumber = /^\\d$/.test(event.key);\n if (!isNumber && !allowedKeys.includes(event.key)) {\n event.preventDefault();\n }\n return;\n }\n\n if (this.allowDecimals() || this.type() === 'number') {\n allowedKeys.push('.');\n }\n\n const isDecimal = event.key === '.' || event.key === ',';\n const isNumber = !isNaN(Number(event.key));\n\n if (allowedKeys.includes(event.key)) {\n if (isDecimal) {\n const input = event.target as HTMLInputElement;\n const currentValue = input.value;\n\n const hasDecimalSeparator =\n currentValue.includes('.') || currentValue.includes(',');\n\n if (hasDecimalSeparator) {\n event.preventDefault();\n }\n }\n return;\n }\n\n if (isNumber) {\n return;\n }\n\n event.preventDefault();\n }\n\n /** Marks the field as touched and refreshes the error state. */\n onBlur(): void {\n this.onTouched();\n\n this.errorTracker.update((v) => v + 1);\n\n const ctrl = this.actualControl();\n if (ctrl?.invalid && ctrl?.touched) {\n this.hadError.set(true);\n }\n }\n\n /** Formats the raw input as a credit card number and notifies the control. */\n onCardInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value.replace(/[^0-9]/g, '');\n\n if (value.length > 16) {\n value = value.substring(0, 16);\n }\n\n let formatted = '';\n for (let i = 0; i < value.length; i++) {\n if (i > 0 && i % 4 === 0) {\n formatted += '-';\n }\n formatted += value[i];\n }\n\n input.value = formatted;\n this.onChange(formatted);\n }\n\n /** Handles raw input: applies number/card/max-length formatting and notifies the control. */\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement | HTMLTextAreaElement;\n let newValue = input.value;\n\n if (this.allowDecimals()) {\n newValue = newValue.replace(/,/g, '.');\n\n const parts = newValue.split('.');\n if (parts.length > 2) {\n newValue = parts[0] + '.' + parts.slice(1).join('');\n }\n\n if (parts.length > 1 && parts[1].length > 2) {\n newValue = parts[0] + '.' + parts[1].substring(0, 2);\n }\n }\n\n if (this.numbersOnly()) {\n newValue = newValue.replace(/[^0-9]/g, '');\n }\n\n const maxLen = this.maxLength();\n if (maxLen && newValue.length > maxLen) {\n newValue = newValue.substring(0, maxLen);\n input.value = newValue;\n\n const ctrl = this.actualControl();\n setTimeout(() => {\n ctrl?.updateValueAndValidity();\n this.errorTracker.update((v) => v + 1);\n });\n }\n\n if (this.formatCard()) {\n this.onCardInput(event);\n } else {\n this.onChange(newValue);\n }\n }\n\n /** Toggles the visibility of a password field. */\n togglePasswordVisibility(): void {\n this.showPassword.update((v) => !v);\n }\n\n /** Sets the value from the form control applying the same formatting rules. */\n writeValue(value: any): void {\n let processedValue = value;\n\n if (this.allowDecimals() && value) {\n processedValue = String(value).replace(/,/g, '.');\n }\n\n if (this.numbersOnly() && value) {\n processedValue = value.toString().replace(/[^0-9]/g, '');\n }\n\n const maxLen = this.maxLength();\n if (maxLen && processedValue?.length > maxLen) {\n processedValue = processedValue.substring(0, maxLen);\n }\n\n if (this.formatCard() && processedValue) {\n const cleaned = processedValue.replace(/[^0-9]/g, '');\n let formatted = '';\n for (let i = 0; i < cleaned.length; i++) {\n if (i > 0 && i % 4 === 0) formatted += '-';\n formatted += cleaned[i];\n }\n this._value.set(formatted);\n } else {\n this._value.set(processedValue);\n }\n }\n\n /** Registers the callback invoked on value changes (ControlValueAccessor). */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /** Registers the callback invoked when the field is touched. */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n /** Reflects the disabled state of the form control. */\n setDisabledState(isDisabled: boolean): void {\n this._disabledState.set(isDisabled);\n this.cdr.markForCheck();\n }\n}\n","<div class=\"relative mb-4\">\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div class=\"relative\">\n @if (!isTextArea()) {\n <div class=\"flex\">\n @if (searchMode()) {\n @let isDisabledSearch = actualControl()?.disabled || isDisabled();\n <input\n #input\n [id]=\"id()\"\n type=\"text\"\n [value]=\"displayValue() || ''\"\n [placeholder]=\"placeholder() || label()\"\n [readOnly]=\"true\"\n [disabled]=\"isDisabledSearch\"\n (click)=\"!isDisabledSearch && searchButtonClick.emit()\"\n (keydown.enter)=\"!isDisabledSearch && searchButtonClick.emit()\"\n (blur)=\"onBlur()\"\n autocomplete=\"off\"\n [class.cursor-pointer]=\"!isDisabledSearch\"\n [class.cursor-not-allowed]=\"isDisabledSearch\"\n [class._shk-bg-surface-50]=\"isDisabledSearch\"\n [class.dark:[background-color:var(--shk-surface-100)]]=\"isDisabledSearch\"\n [class._shk-text-surface-400]=\"isDisabledSearch\"\n [class.dark:[color:var(--shk-surface-400)]]=\"isDisabledSearch\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-l-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500': shouldShowError() && !isDisabledSearch,\n '_shk-border': !shouldShowError() || isDisabledSearch,\n 'cursor-pointer': !isDisabledSearch,\n 'cursor-not-allowed _shk-text-surface-400 dark:[color:var(--shk-surface-400)]': isDisabledSearch\n }\"\n />\n <button\n type=\"button\"\n (click)=\"searchButtonClick.emit()\"\n tabindex=\"-1\"\n [disabled]=\"isDisabledSearch\"\n class=\"px-3 flex items-center justify-center shrink-0 _shk-bg-primary hover:[background-color:var(--shk-primary-700)] text-white border _shk-border-primary rounded-r-lg transition-colors duration-200 disabled:[background-color:var(--shk-surface-300)] dark:disabled:[background-color:var(--shk-surface-200)] disabled:[border-color:var(--shk-surface-300)] dark:disabled:[border-color:var(--shk-surface-200)] disabled:cursor-not-allowed\"\n >\n <svg [lucideIcon]=\"getIcon('search')\" class=\"w-4 h-4\"></svg>\n </button>\n }\n\n @if (!searchMode()) {\n <input\n #input\n [id]=\"id()\"\n [maxlength]=\"maxLength() || (formatCard() ? 19 : null)\"\n [min]=\"type() === 'number' && preventNegative() ? '0' : null\"\n (keypress)=\"type() === 'number' || numbersOnly() ? numberValidation($event) : null\"\n [type]=\"effectiveType()\"\n [formControl]=\"$any(actualControl())\"\n [placeholder]=\"placeholder() || label()\"\n (input)=\"onInput($event)\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onBlur()\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:outline-none focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] focus:ring-1 disabled:[background-color:var(--shk-surface-50)] dark:disabled:[background-color:var(--shk-surface-100)] disabled:cursor-not-allowed sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500 focus:border-red-500 focus:ring-red-500': shouldShowError(),\n 'border-green-500 focus:border-green-500 focus:ring-green-500': wasFixedError(),\n '_shk-border focus:[border-color:var(--shk-primary-500)] focus:[--tw-ring-color:var(--shk-primary-500)]': !shouldShowError() && !wasFixedError()\n }\"\n [class.pr-8]=\"type() === 'password' && actualControl()?.value?.length > 0\"\n [class.pr-3]=\"type() !== 'password' || !actualControl()?.value?.length\"\n />\n\n @if (type() === 'password' && actualControl()?.value?.length > 0) {\n <button\n type=\"button\"\n (click)=\"togglePasswordVisibility()\"\n [disabled]=\"actualControl()?.disabled\"\n class=\"absolute right-3 top-1/2 -translate-y-1/2 _shk-text-surface-400 dark:[color:var(--shk-surface-400)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-600)] focus:outline-none\"\n >\n @if (showPassword()) {\n <svg [lucideIcon]=\"getIcon('eye-off')\" class=\"w-4 h-4\"></svg>\n } @else {\n <svg [lucideIcon]=\"getIcon('eye')\" class=\"w-4 h-4\"></svg>\n }\n </button>\n }\n }\n </div>\n }\n\n @if (isTextArea()) {\n <textarea\n #textarea\n [id]=\"id()\"\n [formControl]=\"$any(actualControl())\"\n [placeholder]=\"placeholder() || label()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n [class]=\"isTextArea() ? textAreaHeight() : 'h-28'\"\n class=\"block w-full px-3 py-2 _shk-text-surface-700 dark:[color:var(--shk-surface-700)] _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border rounded-lg transition-colors placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-400)] focus:outline-none focus:[background-color:var(--shk-surface-50)] dark:focus:[background-color:var(--shk-surface-100)] focus:ring-1 resize-none disabled:[background-color:var(--shk-surface-50)] dark:disabled:[background-color:var(--shk-surface-100)] disabled:cursor-not-allowed disabled:[color:var(--shk-surface-400)] dark:disabled:[color:var(--shk-surface-400)] sm:text-sm\"\n [ngClass]=\"{\n 'border-red-500 focus:border-red-500 focus:ring-red-500': shouldShowError(),\n 'border-green-500 focus:border-green-500 focus:ring-green-500': wasFixedError(),\n '_shk-border focus:[border-color:var(--shk-primary-500)] focus:[--tw-ring-color:var(--shk-primary-500)]': !shouldShowError() && !wasFixedError()\n }\"\n ></textarea>\n }\n </div>\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getIconFromCentral"],"mappings":"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"}