ngxsmk-tel-input 1.5.9 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -25,22 +25,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
25
25
|
}] });
|
|
26
26
|
|
|
27
27
|
class NgxsmkTelInputComponent {
|
|
28
|
-
set telI18n(v) {
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
set telLocalizedCountries(v) {
|
|
32
|
-
this.localizedCountries = v;
|
|
33
|
-
}
|
|
28
|
+
set telI18n(v) { this.i18n = v; }
|
|
29
|
+
set telLocalizedCountries(v) { this.localizedCountries = v; }
|
|
34
30
|
constructor(zone, tel) {
|
|
35
31
|
this.zone = zone;
|
|
36
32
|
this.tel = tel;
|
|
37
33
|
/* Core config */
|
|
38
34
|
this.initialCountry = 'US';
|
|
39
35
|
this.preferredCountries = ['US', 'GB'];
|
|
40
|
-
this.
|
|
41
|
-
this.separateDialCode = false;
|
|
36
|
+
this.separateDialCode = true; // dropdown shows dial code; input never does
|
|
42
37
|
this.allowDropdown = true;
|
|
43
|
-
|
|
38
|
+
/* Display/formatting */
|
|
39
|
+
/** 'formatted' => national with spaces; 'digits' => national digits only */
|
|
40
|
+
this.nationalDisplay = 'formatted';
|
|
41
|
+
/** when to format: 'typing' (live), 'blur', or 'off' */
|
|
42
|
+
this.formatWhenValid = 'typing';
|
|
44
43
|
this.autocomplete = 'tel';
|
|
45
44
|
this.disabled = false;
|
|
46
45
|
this.size = 'md';
|
|
@@ -48,7 +47,6 @@ class NgxsmkTelInputComponent {
|
|
|
48
47
|
this.showClear = true;
|
|
49
48
|
this.autoFocus = false;
|
|
50
49
|
this.selectOnFocus = false;
|
|
51
|
-
this.formatOnBlur = true;
|
|
52
50
|
this.showErrorWhenTouched = true;
|
|
53
51
|
/* Dropdown plumbing */
|
|
54
52
|
this.dropdownAttachToBody = true;
|
|
@@ -56,29 +54,27 @@ class NgxsmkTelInputComponent {
|
|
|
56
54
|
this.clearAriaLabel = 'Clear phone number';
|
|
57
55
|
this.dir = 'ltr';
|
|
58
56
|
/* Placeholders (intl-tel-input) */
|
|
59
|
-
this.autoPlaceholder = 'off';
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
this.
|
|
63
|
-
this.allowLeadingPlus = true;
|
|
57
|
+
this.autoPlaceholder = 'off';
|
|
58
|
+
/* Input behavior */
|
|
59
|
+
this.digitsOnly = true; // typing filter (we still allow our own spaces when formatting)
|
|
60
|
+
this.lockWhenValid = true; // prevent extra digits when valid
|
|
64
61
|
/* Outputs */
|
|
65
62
|
this.countryChange = new EventEmitter();
|
|
66
63
|
this.validityChange = new EventEmitter();
|
|
67
64
|
this.inputChange = new EventEmitter();
|
|
68
65
|
/* Internal */
|
|
69
66
|
this.iti = null;
|
|
70
|
-
this.onChange = () => {
|
|
71
|
-
};
|
|
72
|
-
this.onTouchedCb = () => {
|
|
73
|
-
};
|
|
67
|
+
this.onChange = () => { };
|
|
68
|
+
this.onTouchedCb = () => { };
|
|
74
69
|
this.lastEmittedValid = false;
|
|
75
70
|
this.pendingWrite = null;
|
|
76
71
|
this.touched = false;
|
|
72
|
+
this.allowDropdownWasTrue = false;
|
|
73
|
+
this.suppressEvents = false;
|
|
77
74
|
this.resolvedId = this.inputId || ('tel-' + Math.random().toString(36).slice(2));
|
|
78
75
|
this.platformId = inject(PLATFORM_ID);
|
|
79
|
-
this.allowDropdownWasTrue = false;
|
|
80
|
-
this.suppressEvents = false; // already used elsewhere if you added it
|
|
81
76
|
}
|
|
77
|
+
// ---------- Lifecycle ----------
|
|
82
78
|
ngAfterViewInit() {
|
|
83
79
|
if (!isPlatformBrowser(this.platformId))
|
|
84
80
|
return;
|
|
@@ -88,7 +84,6 @@ class NgxsmkTelInputComponent {
|
|
|
88
84
|
await this.initIntlTelInput();
|
|
89
85
|
this.bindDomListeners();
|
|
90
86
|
if (this.pendingWrite !== null) {
|
|
91
|
-
// IMPORTANT: use writeValue so the plugin sets country, then we normalize input
|
|
92
87
|
const v = this.pendingWrite;
|
|
93
88
|
this.pendingWrite = null;
|
|
94
89
|
this.writeValue(v);
|
|
@@ -101,47 +96,50 @@ class NgxsmkTelInputComponent {
|
|
|
101
96
|
return;
|
|
102
97
|
const configChanged = [
|
|
103
98
|
'initialCountry', 'preferredCountries', 'onlyCountries',
|
|
104
|
-
'separateDialCode', 'allowDropdown',
|
|
99
|
+
'separateDialCode', 'allowDropdown',
|
|
105
100
|
'i18n', 'localizedCountries', 'dir',
|
|
106
|
-
'autoPlaceholder', 'utilsScript', 'customPlaceholder'
|
|
107
|
-
'digitsOnly', 'allowLeadingPlus'
|
|
101
|
+
'autoPlaceholder', 'utilsScript', 'customPlaceholder'
|
|
108
102
|
].some(k => k in changes && !changes[k]?.firstChange);
|
|
109
103
|
if (configChanged && this.iti) {
|
|
110
104
|
this.reinitPlugin();
|
|
111
105
|
this.validatorChange?.();
|
|
112
106
|
}
|
|
113
107
|
}
|
|
114
|
-
ngOnDestroy() {
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
// ----- CVA -----
|
|
108
|
+
ngOnDestroy() { this.destroyPlugin(); }
|
|
109
|
+
// ---------- CVA ----------
|
|
118
110
|
writeValue(val) {
|
|
119
111
|
if (!this.inputRef)
|
|
120
112
|
return;
|
|
121
|
-
if (!this.iti) {
|
|
113
|
+
if (!this.iti) { // not ready
|
|
122
114
|
this.pendingWrite = val ?? '';
|
|
123
115
|
return;
|
|
124
116
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
117
|
+
this.suppressEvents = true;
|
|
118
|
+
try {
|
|
119
|
+
// Let plugin infer the country from E.164
|
|
120
|
+
this.iti.setNumber(val || '');
|
|
121
|
+
const iso2 = this.currentIso2();
|
|
122
|
+
const normalized = this.stripTrunkZeroIfNeeded(val ?? '', iso2);
|
|
123
|
+
const parsed = this.tel.parse(normalized, iso2);
|
|
124
|
+
// Visible input: ALWAYS national (formatted or digits-only)
|
|
125
|
+
const nsnDigits = this.toNSN(parsed.national ?? normalized.replace(/^\+\d+/, ''));
|
|
126
|
+
const display = this.nationalDisplay === 'formatted'
|
|
127
|
+
? this.formatNational(nsnDigits, iso2)
|
|
128
|
+
: nsnDigits;
|
|
129
|
+
this.setInputValue(display);
|
|
130
|
+
// FormControl value: ALWAYS E.164 (or null)
|
|
131
|
+
this.zone.run(() => this.onChange(parsed.e164));
|
|
132
|
+
this.zone.run(() => this.inputChange.emit({ raw: display, e164: parsed.e164, iso2 }));
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
this.suppressEvents = false;
|
|
136
|
+
}
|
|
141
137
|
}
|
|
138
|
+
registerOnChange(fn) { this.onChange = fn; }
|
|
139
|
+
registerOnTouched(fn) { this.onTouchedCb = fn; }
|
|
142
140
|
setDisabledState(isDisabled) {
|
|
143
141
|
this.disabled = isDisabled;
|
|
144
|
-
// 1) native input
|
|
142
|
+
// 1) native input state
|
|
145
143
|
if (this.inputRef)
|
|
146
144
|
this.inputRef.nativeElement.disabled = isDisabled;
|
|
147
145
|
// 2) toggle dropdown by re-init with allowDropdown=false when disabled
|
|
@@ -149,36 +147,22 @@ class NgxsmkTelInputComponent {
|
|
|
149
147
|
if (isDisabled && this.allowDropdown) {
|
|
150
148
|
this.allowDropdownWasTrue = true;
|
|
151
149
|
this.allowDropdown = false;
|
|
152
|
-
this.reinitPlugin();
|
|
150
|
+
this.reinitPlugin();
|
|
153
151
|
}
|
|
154
152
|
else if (!isDisabled && this.allowDropdownWasTrue) {
|
|
155
153
|
this.allowDropdown = true;
|
|
156
154
|
this.allowDropdownWasTrue = false;
|
|
157
|
-
this.reinitPlugin();
|
|
155
|
+
this.reinitPlugin();
|
|
158
156
|
}
|
|
159
157
|
else {
|
|
160
|
-
// even if we didn't reinit, harden UI
|
|
161
158
|
this.applyDisabledUi(isDisabled);
|
|
162
159
|
}
|
|
163
160
|
}
|
|
164
161
|
else {
|
|
165
|
-
// Not initialized yet; just harden UI for first paint
|
|
166
162
|
this.applyDisabledUi(isDisabled);
|
|
167
163
|
}
|
|
168
164
|
}
|
|
169
|
-
|
|
170
|
-
// wrapper already gets [class.disabled]="disabled" from template
|
|
171
|
-
const input = this.inputRef?.nativeElement;
|
|
172
|
-
if (!input)
|
|
173
|
-
return;
|
|
174
|
-
// Make the flag button non-focusable/non-clickable
|
|
175
|
-
const flag = input.parentElement?.querySelector('.iti__selected-flag');
|
|
176
|
-
if (flag) {
|
|
177
|
-
flag.tabIndex = disabled ? -1 : 0;
|
|
178
|
-
flag.setAttribute('aria-disabled', String(disabled));
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// ----- Validator -----
|
|
165
|
+
// ---------- Validator ----------
|
|
182
166
|
validate(_) {
|
|
183
167
|
const raw = this.currentRaw();
|
|
184
168
|
if (!raw)
|
|
@@ -190,10 +174,8 @@ class NgxsmkTelInputComponent {
|
|
|
190
174
|
}
|
|
191
175
|
return valid ? null : { phoneInvalid: true };
|
|
192
176
|
}
|
|
193
|
-
registerOnValidatorChange(fn) {
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
// ----- Public helpers -----
|
|
177
|
+
registerOnValidatorChange(fn) { this.validatorChange = fn; }
|
|
178
|
+
// ---------- Public helpers ----------
|
|
197
179
|
focus() {
|
|
198
180
|
this.inputRef?.nativeElement.focus();
|
|
199
181
|
if (this.selectOnFocus) {
|
|
@@ -212,44 +194,41 @@ class NgxsmkTelInputComponent {
|
|
|
212
194
|
this.handleInput();
|
|
213
195
|
this.inputRef.nativeElement.focus();
|
|
214
196
|
}
|
|
215
|
-
//
|
|
197
|
+
// ---------- intl-tel-input wiring ----------
|
|
216
198
|
async initIntlTelInput() {
|
|
217
199
|
const [{ default: intlTelInput }] = await Promise.all([import('intl-tel-input')]);
|
|
218
200
|
const toLowerKeys = (m) => {
|
|
219
201
|
if (!m)
|
|
220
202
|
return undefined;
|
|
221
203
|
const out = {};
|
|
222
|
-
for (const k in m)
|
|
204
|
+
for (const k in m)
|
|
223
205
|
if (Object.prototype.hasOwnProperty.call(m, k)) {
|
|
224
206
|
const v = m[k];
|
|
225
207
|
if (v != null)
|
|
226
208
|
out[k.toLowerCase()] = v;
|
|
227
209
|
}
|
|
228
|
-
}
|
|
229
210
|
return out;
|
|
230
211
|
};
|
|
231
212
|
const config = {
|
|
232
213
|
initialCountry: this.initialCountry === 'auto' ? 'auto' : (this.initialCountry?.toLowerCase() || 'us'),
|
|
233
214
|
preferredCountries: (this.preferredCountries ?? []).map(c => c.toLowerCase()),
|
|
234
215
|
onlyCountries: (this.onlyCountries ?? []).map(c => c.toLowerCase()),
|
|
235
|
-
nationalMode: true,
|
|
216
|
+
nationalMode: true, // we control display; prevents '+' re-injection
|
|
236
217
|
allowDropdown: this.allowDropdown,
|
|
237
218
|
separateDialCode: this.separateDialCode,
|
|
238
219
|
geoIpLookup: (cb) => cb('us'),
|
|
239
|
-
// placeholders
|
|
240
220
|
autoPlaceholder: this.autoPlaceholder,
|
|
241
221
|
utilsScript: this.utilsScript,
|
|
242
222
|
customPlaceholder: this.customPlaceholder,
|
|
243
|
-
// localization
|
|
244
223
|
i18n: this.i18n,
|
|
245
224
|
localizedCountries: toLowerKeys(this.localizedCountries),
|
|
246
|
-
// dropdown container
|
|
247
225
|
dropdownContainer: this.dropdownAttachToBody && typeof document !== 'undefined' ? document.body : undefined
|
|
248
226
|
};
|
|
249
227
|
this.zone.runOutsideAngular(() => {
|
|
250
228
|
this.iti = intlTelInput(this.inputRef.nativeElement, config);
|
|
251
229
|
});
|
|
252
230
|
this.inputRef.nativeElement.style.setProperty('--tel-dd-z', String(this.dropdownZIndex));
|
|
231
|
+
this.applyDisabledUi(this.disabled);
|
|
253
232
|
}
|
|
254
233
|
async reinitPlugin() {
|
|
255
234
|
const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();
|
|
@@ -257,7 +236,6 @@ class NgxsmkTelInputComponent {
|
|
|
257
236
|
this.destroyPlugin();
|
|
258
237
|
await this.initIntlTelInput();
|
|
259
238
|
this.bindDomListeners();
|
|
260
|
-
// restore country & value
|
|
261
239
|
try {
|
|
262
240
|
this.iti?.setCountry(prevIso2);
|
|
263
241
|
}
|
|
@@ -266,7 +244,6 @@ class NgxsmkTelInputComponent {
|
|
|
266
244
|
this.setInputValue(prevValue);
|
|
267
245
|
this.handleInput();
|
|
268
246
|
}
|
|
269
|
-
this.inputRef.nativeElement.style.setProperty('--tel-dd-z', String(this.dropdownZIndex));
|
|
270
247
|
this.applyDisabledUi(this.disabled);
|
|
271
248
|
}
|
|
272
249
|
destroyPlugin() {
|
|
@@ -277,56 +254,16 @@ class NgxsmkTelInputComponent {
|
|
|
277
254
|
if (this.inputRef?.nativeElement) {
|
|
278
255
|
const el = this.inputRef.nativeElement;
|
|
279
256
|
const clone = el.cloneNode(true);
|
|
280
|
-
// preserve
|
|
257
|
+
// preserve state across clone
|
|
281
258
|
clone.disabled = this.disabled;
|
|
282
|
-
clone.id = this.resolvedId;
|
|
259
|
+
clone.id = this.resolvedId;
|
|
283
260
|
clone.name = this.name ?? clone.name;
|
|
284
261
|
clone.value = el.value;
|
|
285
262
|
el.parentNode?.replaceChild(clone, el);
|
|
286
263
|
this.inputRef.nativeElement = clone;
|
|
287
264
|
}
|
|
288
265
|
}
|
|
289
|
-
//
|
|
290
|
-
sanitizeDigits(value) {
|
|
291
|
-
if (!this.digitsOnly)
|
|
292
|
-
return value;
|
|
293
|
-
let v = value.replace(/[^\d+]/g, '');
|
|
294
|
-
if (this.allowLeadingPlus) {
|
|
295
|
-
const hasLeadingPlus = v.startsWith('+');
|
|
296
|
-
v = (hasLeadingPlus ? '+' : '') + v.replace(/\+/g, '');
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
v = v.replace(/\+/g, '');
|
|
300
|
-
}
|
|
301
|
-
return v;
|
|
302
|
-
}
|
|
303
|
-
/** Remove a single trunk '0' when that makes the number valid.
|
|
304
|
-
* Works for: "+<cc>0..." and "0..." (national), but only if the stripped form parses valid.
|
|
305
|
-
*/
|
|
306
|
-
stripTrunkZeroIfNeeded(raw, iso2) {
|
|
307
|
-
if (!raw)
|
|
308
|
-
return raw;
|
|
309
|
-
const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';
|
|
310
|
-
// If already valid, don't touch.
|
|
311
|
-
const parsed0 = this.tel.parse(raw, iso2);
|
|
312
|
-
if (parsed0.isValid)
|
|
313
|
-
return raw;
|
|
314
|
-
// Try: +<dial>0xxxx → +<dial>xxxx
|
|
315
|
-
if (dial && raw.startsWith(`+${dial}0`)) {
|
|
316
|
-
const attempt = `+${dial}${raw.slice(dial.length + 2)}`;
|
|
317
|
-
const p = this.tel.parse(attempt, iso2);
|
|
318
|
-
if (p.isValid)
|
|
319
|
-
return attempt;
|
|
320
|
-
}
|
|
321
|
-
// Try: 0xxxx → xxxx (national)
|
|
322
|
-
if (!raw.startsWith('+') && raw.startsWith('0')) {
|
|
323
|
-
const attemptNat = raw.slice(1);
|
|
324
|
-
const p = this.tel.parse(attemptNat, iso2);
|
|
325
|
-
if (p.isValid)
|
|
326
|
-
return attemptNat;
|
|
327
|
-
}
|
|
328
|
-
return raw;
|
|
329
|
-
}
|
|
266
|
+
// ---------- Input listeners ----------
|
|
330
267
|
bindDomListeners() {
|
|
331
268
|
const el = this.inputRef.nativeElement;
|
|
332
269
|
this.zone.runOutsideAngular(() => {
|
|
@@ -338,54 +275,27 @@ class NgxsmkTelInputComponent {
|
|
|
338
275
|
if (this.lockWhenValid && this.isCurrentlyValid()) {
|
|
339
276
|
const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);
|
|
340
277
|
const isDigit = !!data && ev.inputType === 'insertText' && data >= '0' && data <= '9';
|
|
341
|
-
|
|
342
|
-
if (selCollapsed && (isDigit || isPlusAtStart)) {
|
|
278
|
+
if (selCollapsed && isDigit) {
|
|
343
279
|
ev.preventDefault();
|
|
344
280
|
return;
|
|
345
281
|
}
|
|
346
282
|
}
|
|
347
|
-
// normal filtering when not valid (or replacing text)
|
|
348
283
|
if (!data || ev.inputType !== 'insertText')
|
|
349
284
|
return;
|
|
350
|
-
const pos = el.selectionStart ?? 0;
|
|
351
285
|
const isDigit = data >= '0' && data <= '9';
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
ev.preventDefault();
|
|
286
|
+
if (!isDigit)
|
|
287
|
+
ev.preventDefault(); // users type digits only; we insert spaces ourselves
|
|
355
288
|
});
|
|
356
289
|
el.addEventListener('paste', (e) => {
|
|
357
|
-
if (!this.digitsOnly)
|
|
358
|
-
return;
|
|
359
290
|
const text = (e.clipboardData || window.clipboardData).getData('text') || '';
|
|
360
|
-
const hasAnyDigit = /[0-9]/.test(text);
|
|
361
|
-
// block pasting extra digits if valid and there is no selection
|
|
362
|
-
if (this.lockWhenValid && this.isCurrentlyValid()) {
|
|
363
|
-
const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);
|
|
364
|
-
if (selCollapsed && hasAnyDigit) {
|
|
365
|
-
e.preventDefault();
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
// sanitize paste
|
|
370
291
|
e.preventDefault();
|
|
371
|
-
const
|
|
292
|
+
const digits = this.toNSN(text);
|
|
372
293
|
const start = el.selectionStart ?? el.value.length;
|
|
373
294
|
const end = el.selectionEnd ?? el.value.length;
|
|
374
|
-
el.setRangeText(
|
|
295
|
+
el.setRangeText(digits, start, end, 'end');
|
|
375
296
|
queueMicrotask(() => this.handleInput());
|
|
376
297
|
});
|
|
377
|
-
el.addEventListener('input', () =>
|
|
378
|
-
if (this.digitsOnly) {
|
|
379
|
-
const val = el.value;
|
|
380
|
-
const sanitized = this.sanitizeDigits(val);
|
|
381
|
-
if (val !== sanitized) {
|
|
382
|
-
const caret = el.selectionStart ?? sanitized.length;
|
|
383
|
-
el.value = sanitized;
|
|
384
|
-
el.setSelectionRange(caret, caret);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
this.handleInput();
|
|
388
|
-
});
|
|
298
|
+
el.addEventListener('input', () => this.handleInput());
|
|
389
299
|
el.addEventListener('countrychange', () => {
|
|
390
300
|
const iso2 = this.currentIso2();
|
|
391
301
|
this.zone.run(() => {
|
|
@@ -397,15 +307,22 @@ class NgxsmkTelInputComponent {
|
|
|
397
307
|
el.addEventListener('blur', () => this.onBlur());
|
|
398
308
|
});
|
|
399
309
|
}
|
|
310
|
+
// ---------- UX handlers ----------
|
|
400
311
|
onBlur() {
|
|
401
312
|
this.touched = true;
|
|
402
313
|
this.zone.run(() => this.onTouchedCb());
|
|
403
|
-
if (
|
|
314
|
+
if (this.formatWhenValid === 'off')
|
|
404
315
|
return;
|
|
405
316
|
const iso2 = this.currentIso2();
|
|
406
|
-
const
|
|
407
|
-
|
|
408
|
-
|
|
317
|
+
const digits = this.toNSN(this.currentRaw());
|
|
318
|
+
const parsed = this.tel.parse(digits, iso2);
|
|
319
|
+
if (!parsed.isValid)
|
|
320
|
+
return;
|
|
321
|
+
if (this.formatWhenValid !== 'typing') {
|
|
322
|
+
const display = this.nationalDisplay === 'formatted'
|
|
323
|
+
? this.formatNational(digits, iso2)
|
|
324
|
+
: this.toNSN(parsed.national ?? digits);
|
|
325
|
+
this.setInputValue(display);
|
|
409
326
|
}
|
|
410
327
|
}
|
|
411
328
|
onFocus() {
|
|
@@ -414,59 +331,103 @@ class NgxsmkTelInputComponent {
|
|
|
414
331
|
queueMicrotask(() => el.setSelectionRange(0, el.value.length));
|
|
415
332
|
}
|
|
416
333
|
}
|
|
334
|
+
// ---------- Core input pipeline ----------
|
|
417
335
|
handleInput() {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
raw = raw.replace(/\D/g, '');
|
|
421
|
-
if (raw !== this.currentRaw())
|
|
422
|
-
this.setInputValue(raw);
|
|
336
|
+
if (this.suppressEvents)
|
|
337
|
+
return;
|
|
423
338
|
const iso2 = this.currentIso2();
|
|
424
|
-
|
|
425
|
-
//
|
|
339
|
+
let digits = this.toNSN(this.currentRaw());
|
|
340
|
+
// Parse once from digits
|
|
341
|
+
const parsed = this.tel.parse(digits, iso2);
|
|
342
|
+
// Emit E.164 to the form (or null if invalid/incomplete)
|
|
426
343
|
this.zone.run(() => this.onChange(parsed.e164));
|
|
427
|
-
this.zone.run(() => this.inputChange.emit({ raw, e164: parsed.e164, iso2 }));
|
|
428
|
-
//
|
|
429
|
-
if (
|
|
430
|
-
const
|
|
431
|
-
|
|
432
|
-
|
|
344
|
+
this.zone.run(() => this.inputChange.emit({ raw: this.currentRaw(), e164: parsed.e164, iso2 }));
|
|
345
|
+
// Visible value
|
|
346
|
+
if (this.formatWhenValid === 'typing' && digits.length) {
|
|
347
|
+
const display = this.nationalDisplay === 'formatted'
|
|
348
|
+
? this.formatNational(digits, iso2)
|
|
349
|
+
: digits;
|
|
350
|
+
if (display !== this.currentRaw()) {
|
|
351
|
+
this.suppressEvents = true;
|
|
352
|
+
this.setInputValue(display);
|
|
353
|
+
this.suppressEvents = false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else if (parsed.isValid) {
|
|
357
|
+
const display = this.nationalDisplay === 'formatted'
|
|
358
|
+
? this.formatNational(digits, iso2)
|
|
359
|
+
: this.toNSN(parsed.national ?? digits);
|
|
360
|
+
if (display !== this.currentRaw())
|
|
361
|
+
this.setInputValue(display);
|
|
433
362
|
}
|
|
434
363
|
}
|
|
435
|
-
|
|
364
|
+
// ---------- Utilities ----------
|
|
365
|
+
/** Format NATIONAL number (with spaces) using libphonenumber rules. Accepts digits only. */
|
|
366
|
+
formatNational(digits, iso2) {
|
|
436
367
|
try {
|
|
437
|
-
// When a region is provided, AsYouType returns NATIONAL formatting
|
|
438
368
|
const fmt = new AsYouType(iso2);
|
|
439
|
-
return fmt.input(
|
|
369
|
+
return fmt.input(digits);
|
|
440
370
|
}
|
|
441
371
|
catch {
|
|
442
|
-
return
|
|
372
|
+
return digits;
|
|
443
373
|
}
|
|
444
374
|
}
|
|
445
|
-
|
|
446
|
-
|
|
375
|
+
/** Convert any string to NSN (digits only). */
|
|
376
|
+
toNSN(v) {
|
|
377
|
+
return (v ?? '').replace(/\D/g, '');
|
|
447
378
|
}
|
|
379
|
+
/** Remove one trunk '0' after +<dial> or at national start, only if it makes a valid number */
|
|
380
|
+
stripTrunkZeroIfNeeded(raw, iso2) {
|
|
381
|
+
if (!raw)
|
|
382
|
+
return raw;
|
|
383
|
+
const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';
|
|
384
|
+
const p0 = this.tel.parse(raw, iso2);
|
|
385
|
+
if (p0.isValid)
|
|
386
|
+
return raw;
|
|
387
|
+
if (raw.startsWith('+') && dial && raw.startsWith(`+${dial}0`)) {
|
|
388
|
+
const attempt = `+${dial}${raw.slice(dial.length + 2)}`;
|
|
389
|
+
const p1 = this.tel.parse(attempt, iso2);
|
|
390
|
+
if (p1.isValid)
|
|
391
|
+
return attempt;
|
|
392
|
+
}
|
|
393
|
+
if (!raw.startsWith('+') && raw.startsWith('0')) {
|
|
394
|
+
const attemptNat = raw.slice(1);
|
|
395
|
+
const p2 = this.tel.parse(attemptNat, iso2);
|
|
396
|
+
if (p2.isValid)
|
|
397
|
+
return attemptNat;
|
|
398
|
+
}
|
|
399
|
+
return raw;
|
|
400
|
+
}
|
|
401
|
+
currentRaw() { return (this.inputRef?.nativeElement.value ?? '').trim(); }
|
|
448
402
|
currentIso2() {
|
|
449
403
|
const iso2 = (this.iti?.getSelectedCountryData?.().iso2 ?? this.initialCountry ?? 'US')
|
|
450
404
|
.toString().toUpperCase();
|
|
451
405
|
return iso2;
|
|
452
406
|
}
|
|
453
|
-
setInputValue(v) {
|
|
454
|
-
this.inputRef.nativeElement.value = v ?? '';
|
|
455
|
-
}
|
|
407
|
+
setInputValue(v) { this.inputRef.nativeElement.value = v ?? ''; }
|
|
456
408
|
get showError() {
|
|
457
409
|
const invalid = !!this.validate({});
|
|
458
410
|
return this.showErrorWhenTouched ? (this.touched && invalid) : invalid;
|
|
459
411
|
}
|
|
460
|
-
isCurrentlyValid() {
|
|
461
|
-
|
|
412
|
+
isCurrentlyValid() { return this.tel.isValid(this.currentRaw(), this.currentIso2()); }
|
|
413
|
+
/** Make flag/dropdown non-interactive when disabled */
|
|
414
|
+
applyDisabledUi(disabled) {
|
|
415
|
+
const input = this.inputRef?.nativeElement;
|
|
416
|
+
if (!input)
|
|
417
|
+
return;
|
|
418
|
+
const flag = input.parentElement?.querySelector('.iti__selected-flag');
|
|
419
|
+
if (flag) {
|
|
420
|
+
flag.tabIndex = disabled ? -1 : 0;
|
|
421
|
+
flag.setAttribute('aria-disabled', String(disabled));
|
|
422
|
+
}
|
|
462
423
|
}
|
|
463
424
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgxsmkTelInputComponent, deps: [{ token: i0.NgZone }, { token: NgxsmkTelInputService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
464
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgxsmkTelInputComponent, isStandalone: true, selector: "ngxsmk-tel-input", inputs: { initialCountry: "initialCountry", preferredCountries: "preferredCountries", onlyCountries: "onlyCountries",
|
|
425
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgxsmkTelInputComponent, isStandalone: true, selector: "ngxsmk-tel-input", inputs: { initialCountry: "initialCountry", preferredCountries: "preferredCountries", onlyCountries: "onlyCountries", separateDialCode: "separateDialCode", allowDropdown: "allowDropdown", nationalDisplay: "nationalDisplay", formatWhenValid: "formatWhenValid", placeholder: "placeholder", autocomplete: "autocomplete", name: "name", inputId: "inputId", disabled: "disabled", label: "label", hint: "hint", errorText: "errorText", size: "size", variant: "variant", showClear: "showClear", autoFocus: "autoFocus", selectOnFocus: "selectOnFocus", showErrorWhenTouched: "showErrorWhenTouched", dropdownAttachToBody: "dropdownAttachToBody", dropdownZIndex: "dropdownZIndex", i18n: "i18n", telI18n: "telI18n", localizedCountries: "localizedCountries", telLocalizedCountries: "telLocalizedCountries", clearAriaLabel: "clearAriaLabel", dir: "dir", autoPlaceholder: "autoPlaceholder", utilsScript: "utilsScript", customPlaceholder: "customPlaceholder", digitsOnly: "digitsOnly", lockWhenValid: "lockWhenValid" }, outputs: { countryChange: "countryChange", validityChange: "validityChange", inputChange: "inputChange" }, providers: [
|
|
465
426
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },
|
|
466
427
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }
|
|
467
428
|
], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["telInput"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
468
429
|
<div class="ngxsmk-tel"
|
|
469
|
-
[class.
|
|
430
|
+
[class.disabled]="disabled"
|
|
470
431
|
[attr.data-size]="size"
|
|
471
432
|
[attr.data-variant]="variant"
|
|
472
433
|
[attr.dir]="dir">
|
|
@@ -485,15 +446,14 @@ class NgxsmkTelInputComponent {
|
|
|
485
446
|
[attr.placeholder]="placeholder || null"
|
|
486
447
|
[attr.autocomplete]="autocomplete"
|
|
487
448
|
[attr.inputmode]="digitsOnly ? 'numeric' : 'tel'"
|
|
488
|
-
[
|
|
489
|
-
[class.ngxsmk-tel-disabled]="disabled"
|
|
449
|
+
[disabled]="disabled"
|
|
490
450
|
[attr.aria-invalid]="showError ? 'true' : 'false'"
|
|
491
451
|
(blur)="onBlur()"
|
|
492
452
|
(focus)="onFocus()"
|
|
493
453
|
/>
|
|
494
454
|
</div>
|
|
495
455
|
|
|
496
|
-
@if (showClear && currentRaw()
|
|
456
|
+
@if (showClear && currentRaw()) {
|
|
497
457
|
<button type="button"
|
|
498
458
|
class="ngxsmk-tel__clear"
|
|
499
459
|
(click)="clearInput()"
|
|
@@ -507,13 +467,13 @@ class NgxsmkTelInputComponent {
|
|
|
507
467
|
<div class="ngxsmk-tel__hint">{{ hint }}</div>
|
|
508
468
|
}
|
|
509
469
|
</div>
|
|
510
|
-
`, isInline: true, styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel-disabled{pointer-events:none;opacity:.6}\n"] }); }
|
|
470
|
+
`, isInline: true, styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel.disabled .iti__flag-container,.ngxsmk-tel.disabled .iti__selected-flag{pointer-events:none;opacity:.6}\n"] }); }
|
|
511
471
|
}
|
|
512
472
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgxsmkTelInputComponent, decorators: [{
|
|
513
473
|
type: Component,
|
|
514
474
|
args: [{ selector: 'ngxsmk-tel-input', standalone: true, imports: [], template: `
|
|
515
475
|
<div class="ngxsmk-tel"
|
|
516
|
-
[class.
|
|
476
|
+
[class.disabled]="disabled"
|
|
517
477
|
[attr.data-size]="size"
|
|
518
478
|
[attr.data-variant]="variant"
|
|
519
479
|
[attr.dir]="dir">
|
|
@@ -532,15 +492,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
532
492
|
[attr.placeholder]="placeholder || null"
|
|
533
493
|
[attr.autocomplete]="autocomplete"
|
|
534
494
|
[attr.inputmode]="digitsOnly ? 'numeric' : 'tel'"
|
|
535
|
-
[
|
|
536
|
-
[class.ngxsmk-tel-disabled]="disabled"
|
|
495
|
+
[disabled]="disabled"
|
|
537
496
|
[attr.aria-invalid]="showError ? 'true' : 'false'"
|
|
538
497
|
(blur)="onBlur()"
|
|
539
498
|
(focus)="onFocus()"
|
|
540
499
|
/>
|
|
541
500
|
</div>
|
|
542
501
|
|
|
543
|
-
@if (showClear && currentRaw()
|
|
502
|
+
@if (showClear && currentRaw()) {
|
|
544
503
|
<button type="button"
|
|
545
504
|
class="ngxsmk-tel__clear"
|
|
546
505
|
(click)="clearInput()"
|
|
@@ -557,7 +516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
557
516
|
`, providers: [
|
|
558
517
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },
|
|
559
518
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }
|
|
560
|
-
], styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel-disabled{pointer-events:none;opacity:.6}\n"] }]
|
|
519
|
+
], styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel.disabled .iti__flag-container,.ngxsmk-tel.disabled .iti__selected-flag{pointer-events:none;opacity:.6}\n"] }]
|
|
561
520
|
}], ctorParameters: () => [{ type: i0.NgZone }, { type: NgxsmkTelInputService }], propDecorators: { inputRef: [{
|
|
562
521
|
type: ViewChild,
|
|
563
522
|
args: ['telInput', { static: true }]
|
|
@@ -567,13 +526,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
567
526
|
type: Input
|
|
568
527
|
}], onlyCountries: [{
|
|
569
528
|
type: Input
|
|
570
|
-
}], nationalMode: [{
|
|
571
|
-
type: Input
|
|
572
529
|
}], separateDialCode: [{
|
|
573
530
|
type: Input
|
|
574
531
|
}], allowDropdown: [{
|
|
575
532
|
type: Input
|
|
576
|
-
}],
|
|
533
|
+
}], nationalDisplay: [{
|
|
534
|
+
type: Input
|
|
535
|
+
}], formatWhenValid: [{
|
|
577
536
|
type: Input
|
|
578
537
|
}], placeholder: [{
|
|
579
538
|
type: Input
|
|
@@ -601,8 +560,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
601
560
|
type: Input
|
|
602
561
|
}], selectOnFocus: [{
|
|
603
562
|
type: Input
|
|
604
|
-
}], formatOnBlur: [{
|
|
605
|
-
type: Input
|
|
606
563
|
}], showErrorWhenTouched: [{
|
|
607
564
|
type: Input
|
|
608
565
|
}], dropdownAttachToBody: [{
|
|
@@ -631,11 +588,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
631
588
|
type: Input
|
|
632
589
|
}], customPlaceholder: [{
|
|
633
590
|
type: Input
|
|
634
|
-
}], formatWhenValid: [{
|
|
635
|
-
type: Input
|
|
636
591
|
}], digitsOnly: [{
|
|
637
592
|
type: Input
|
|
638
|
-
}],
|
|
593
|
+
}], lockWhenValid: [{
|
|
639
594
|
type: Input
|
|
640
595
|
}], countryChange: [{
|
|
641
596
|
type: Output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-tel-input.mjs","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.service.ts","../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts","../../../projects/ngxsmk-tel-input/src/ngxsmk-tel-input.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxsmkTelInputService {\r\n parse(input: string, iso2: CountryCode): { e164: string | null; national: string | null; isValid: boolean } {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n if (!phone) return { e164: null, national: null, isValid: false };\r\n const isValid = phone.isValid();\r\n return { e164: isValid ? phone.number : null, national: phone.formatNational(), isValid };\r\n }\r\n\r\n isValid(input: string, iso2: CountryCode): boolean {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n return !!phone && phone.isValid();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n PLATFORM_ID,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {isPlatformBrowser} from '@angular/common';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator\r\n} from '@angular/forms';\r\nimport {AsYouType, CountryCode} from 'libphonenumber-js';\r\nimport {NgxsmkTelInputService} from './ngxsmk-tel-input.service';\r\nimport {CountryMap, IntlTelI18n} from './types';\r\n\r\ntype IntlTelInstance = any;\r\n\r\n@Component({\r\n selector: 'ngxsmk-tel-input',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <div class=\"ngxsmk-tel\"\r\n [class.ngxsmk-tel-disabled]=\"disabled\"\r\n [attr.data-size]=\"size\"\r\n [attr.data-variant]=\"variant\"\r\n [attr.dir]=\"dir\">\r\n @if (label) {\r\n <label class=\"ngxsmk-tel__label\" [for]=\"resolvedId\">{{ label }}</label>\r\n }\r\n\r\n <div class=\"ngxsmk-tel__wrap\" [class.has-error]=\"showError\">\r\n <div class=\"ngxsmk-tel-input__wrapper\">\r\n <input\r\n #telInput\r\n type=\"tel\"\r\n class=\"ngxsmk-tel-input__control\"\r\n [id]=\"resolvedId\"\r\n [attr.name]=\"name || null\"\r\n [attr.placeholder]=\"placeholder || null\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.inputmode]=\"digitsOnly ? 'numeric' : 'tel'\"\r\n [attr.pattern]=\"digitsOnly ? (allowLeadingPlus ? '\\\\\\\\+?[0-9]*' : '[0-9]*') : null\"\r\n [class.ngxsmk-tel-disabled]=\"disabled\"\r\n [attr.aria-invalid]=\"showError ? 'true' : 'false'\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n\r\n @if (showClear && currentRaw() && !disabled) {\r\n <button type=\"button\"\r\n class=\"ngxsmk-tel__clear\"\r\n (click)=\"clearInput()\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (hint && !showError) {\r\n <div class=\"ngxsmk-tel__hint\">{{ hint }}</div>\r\n }\r\n </div>\r\n `,\r\n styleUrls: ['./ngxsmk-tel-input.component.scss'],\r\n providers: [\r\n {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true},\r\n {provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true}\r\n ]\r\n})\r\nexport class NgxsmkTelInputComponent implements AfterViewInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\r\n\r\n @ViewChild('telInput', {static: true}) inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n /* Core config */\r\n @Input() initialCountry: CountryCode | 'auto' = 'US';\r\n @Input() preferredCountries: CountryCode[] = ['US', 'GB'];\r\n @Input() onlyCountries?: CountryCode[];\r\n @Input() nationalMode: boolean = false;\r\n @Input() separateDialCode: boolean = false;\r\n @Input() allowDropdown: boolean = true;\r\n\r\n @Input() lockWhenValid: boolean = true;\r\n\r\n /* UX */\r\n @Input() placeholder?: string;\r\n @Input() autocomplete = 'tel';\r\n @Input() name?: string;\r\n @Input() inputId?: string;\r\n @Input() disabled: boolean = false;\r\n\r\n @Input() label?: string;\r\n @Input() hint?: string;\r\n @Input() errorText?: string;\r\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\r\n @Input() variant: 'outline' | 'filled' | 'underline' = 'outline';\r\n @Input() showClear: boolean = true;\r\n @Input() autoFocus: boolean = false;\r\n @Input() selectOnFocus: boolean = false;\r\n @Input() formatOnBlur: boolean = true;\r\n @Input() showErrorWhenTouched: boolean = true;\r\n\r\n /* Dropdown plumbing */\r\n @Input() dropdownAttachToBody: boolean = true;\r\n @Input() dropdownZIndex: number = 2000;\r\n\r\n /* Localization + RTL */\r\n @Input('i18n') i18n?: IntlTelI18n;\r\n\r\n @Input('telI18n') set telI18n(v: IntlTelI18n | undefined) {\r\n this.i18n = v;\r\n }\r\n\r\n @Input('localizedCountries') localizedCountries?: CountryMap;\r\n\r\n @Input('telLocalizedCountries') set telLocalizedCountries(v: CountryMap | undefined) {\r\n this.localizedCountries = v;\r\n }\r\n\r\n @Input() clearAriaLabel: string = 'Clear phone number';\r\n @Input() dir: 'ltr' | 'rtl' = 'ltr';\r\n\r\n /* Placeholders (intl-tel-input) */\r\n @Input() autoPlaceholder: 'off' | 'polite' | 'aggressive' = 'off'; // default OFF since no utils fallback\r\n @Input() utilsScript?: string;\r\n @Input() customPlaceholder?: (example: string, country: any) => string;\r\n\r\n @Input() formatWhenValid: 'off' | 'blur' | 'typing' = 'blur';\r\n\r\n /* Digits-only controls */\r\n @Input() digitsOnly: boolean = true;\r\n @Input() allowLeadingPlus: boolean = true;\r\n\r\n /* Outputs */\r\n @Output() countryChange = new EventEmitter<{ iso2: CountryCode }>();\r\n @Output() validityChange = new EventEmitter<boolean>();\r\n @Output() inputChange = new EventEmitter<{ raw: string; e164: string | null; iso2: CountryCode }>();\r\n\r\n /* Internal */\r\n private iti: IntlTelInstance | null = null;\r\n private onChange: (val: string | null) => void = () => {\r\n };\r\n private onTouchedCb: () => void = () => {\r\n };\r\n private validatorChange?: () => void;\r\n private lastEmittedValid = false;\r\n private pendingWrite: string | null = null;\r\n private touched: boolean = false;\r\n\r\n readonly resolvedId: string = this.inputId || ('tel-' + Math.random().toString(36).slice(2));\r\n\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n private allowDropdownWasTrue = false;\r\n private suppressEvents = false; // already used elsewhere if you added it\r\n\r\n constructor(\r\n private readonly zone: NgZone,\r\n private readonly tel: NgxsmkTelInputService\r\n ) {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n void this.initAndWire();\r\n }\r\n\r\n private async initAndWire(): Promise<void> {\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n if (this.pendingWrite !== null) {\r\n // IMPORTANT: use writeValue so the plugin sets country, then we normalize input\r\n const v = this.pendingWrite;\r\n this.pendingWrite = null;\r\n this.writeValue(v);\r\n }\r\n\r\n if (this.autoFocus) setTimeout(() => this.focus(), 0);\r\n }\r\n\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n const configChanged = [\r\n 'initialCountry', 'preferredCountries', 'onlyCountries',\r\n 'separateDialCode', 'allowDropdown', 'nationalMode',\r\n 'i18n', 'localizedCountries', 'dir',\r\n 'autoPlaceholder', 'utilsScript', 'customPlaceholder',\r\n 'digitsOnly', 'allowLeadingPlus'\r\n ].some(k => k in changes && !changes[k]?.firstChange);\r\n if (configChanged && this.iti) {\r\n this.reinitPlugin();\r\n this.validatorChange?.();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyPlugin();\r\n }\r\n\r\n // ----- CVA -----\r\n writeValue(val: string | null): void {\r\n if (!this.inputRef) return;\r\n if (!this.iti) { this.pendingWrite = val ?? ''; return; }\r\n\r\n // Let the plugin pick the country from E.164\r\n this.iti.setNumber(val || '');\r\n const iso2 = this.currentIso2();\r\n\r\n const parsed = this.tel.parse(val ?? '', iso2);\r\n\r\n // Show national number only (digits)\r\n const nsn = (parsed.national ?? '').replace(/\\D/g, '');\r\n this.setInputValue(nsn);\r\n\r\n // Keep form value as E.164 (or null)\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw: nsn, e164: parsed.e164, iso2 }));\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouchedCb = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n\r\n // 1) native input\r\n if (this.inputRef) this.inputRef.nativeElement.disabled = isDisabled;\r\n\r\n // 2) toggle dropdown by re-init with allowDropdown=false when disabled\r\n if (this.iti) {\r\n if (isDisabled && this.allowDropdown) {\r\n this.allowDropdownWasTrue = true;\r\n this.allowDropdown = false;\r\n this.reinitPlugin(); // closes popup & removes handlers\r\n } else if (!isDisabled && this.allowDropdownWasTrue) {\r\n this.allowDropdown = true;\r\n this.allowDropdownWasTrue = false;\r\n this.reinitPlugin(); // restore dropdown\r\n } else {\r\n // even if we didn't reinit, harden UI\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n } else {\r\n // Not initialized yet; just harden UI for first paint\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n }\r\n\r\n private applyDisabledUi(disabled: boolean) {\r\n // wrapper already gets [class.disabled]=\"disabled\" from template\r\n const input = this.inputRef?.nativeElement;\r\n if (!input) return;\r\n\r\n // Make the flag button non-focusable/non-clickable\r\n const flag = input.parentElement?.querySelector('.iti__selected-flag') as HTMLElement | null;\r\n if (flag) {\r\n flag.tabIndex = disabled ? -1 : 0;\r\n flag.setAttribute('aria-disabled', String(disabled));\r\n }\r\n }\r\n\r\n\r\n // ----- Validator -----\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n const raw = this.currentRaw();\r\n if (!raw) return null;\r\n const valid = this.tel.isValid(raw, this.currentIso2());\r\n if (valid !== this.lastEmittedValid) {\r\n this.lastEmittedValid = valid;\r\n this.validityChange.emit(valid);\r\n }\r\n return valid ? null : {phoneInvalid: true};\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.validatorChange = fn;\r\n }\r\n\r\n // ----- Public helpers -----\r\n focus(): void {\r\n this.inputRef?.nativeElement.focus();\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n selectCountry(iso2: CountryCode): void {\r\n if (this.iti) {\r\n this.iti.setCountry(iso2.toLowerCase());\r\n this.handleInput();\r\n }\r\n }\r\n\r\n clearInput() {\r\n this.setInputValue('');\r\n this.handleInput();\r\n this.inputRef.nativeElement.focus();\r\n }\r\n\r\n // ----- Plugin wiring -----\r\n private async initIntlTelInput() {\r\n const [{default: intlTelInput}] = await Promise.all([import('intl-tel-input')]);\r\n\r\n const toLowerKeys = (m?: CountryMap) => {\r\n if (!m) return undefined;\r\n const out: Record<string, string> = {};\r\n for (const k in m) {\r\n if (Object.prototype.hasOwnProperty.call(m, k)) {\r\n const v = (m as Record<string, string | undefined>)[k];\r\n if (v != null) out[k.toLowerCase()] = v;\r\n }\r\n }\r\n return out;\r\n };\r\n\r\n const config: any = {\r\n initialCountry: this.initialCountry === 'auto' ? 'auto' : (this.initialCountry?.toLowerCase() || 'us'),\r\n preferredCountries: (this.preferredCountries ?? []).map(c => c.toLowerCase()),\r\n onlyCountries: (this.onlyCountries ?? []).map(c => c.toLowerCase()),\r\n nationalMode: true,\r\n allowDropdown: this.allowDropdown,\r\n separateDialCode: this.separateDialCode,\r\n geoIpLookup: (cb: (iso2: string) => void) => cb('us'),\r\n\r\n // placeholders\r\n autoPlaceholder: this.autoPlaceholder,\r\n utilsScript: this.utilsScript,\r\n customPlaceholder: this.customPlaceholder,\r\n\r\n // localization\r\n i18n: this.i18n,\r\n localizedCountries: toLowerKeys(this.localizedCountries),\r\n\r\n // dropdown container\r\n dropdownContainer: this.dropdownAttachToBody && typeof document !== 'undefined' ? document.body : undefined\r\n };\r\n\r\n this.zone.runOutsideAngular(() => {\r\n this.iti = intlTelInput(this.inputRef.nativeElement, config);\r\n });\r\n\r\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\r\n }\r\n\r\n private async reinitPlugin() {\r\n const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();\r\n const prevValue = this.currentRaw();\r\n\r\n this.destroyPlugin();\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n // restore country & value\r\n try { this.iti?.setCountry(prevIso2); } catch {}\r\n if (prevValue) {\r\n this.setInputValue(prevValue);\r\n this.handleInput();\r\n }\r\n\r\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\r\n this.applyDisabledUi(this.disabled);\r\n }\r\n\r\n private destroyPlugin() {\r\n if (this.iti) {\r\n this.iti.destroy();\r\n this.iti = null;\r\n }\r\n if (this.inputRef?.nativeElement) {\r\n const el = this.inputRef.nativeElement;\r\n const clone = el.cloneNode(true) as HTMLInputElement;\r\n\r\n // preserve important state across clone\r\n clone.disabled = this.disabled;\r\n clone.id = this.resolvedId; // keep the same id\r\n clone.name = this.name ?? clone.name;\r\n clone.value = el.value;\r\n\r\n el.parentNode?.replaceChild(clone, el);\r\n (this.inputRef as any).nativeElement = clone;\r\n }\r\n }\r\n\r\n\r\n // ----- Input filtering (digits-only) -----\r\n private sanitizeDigits(value: string): string {\r\n if (!this.digitsOnly) return value;\r\n let v = value.replace(/[^\\d+]/g, '');\r\n if (this.allowLeadingPlus) {\r\n const hasLeadingPlus = v.startsWith('+');\r\n v = (hasLeadingPlus ? '+' : '') + v.replace(/\\+/g, '');\r\n } else {\r\n v = v.replace(/\\+/g, '');\r\n }\r\n return v;\r\n }\r\n\r\n\r\n /** Remove a single trunk '0' when that makes the number valid.\r\n * Works for: \"+<cc>0...\" and \"0...\" (national), but only if the stripped form parses valid.\r\n */\r\n private stripTrunkZeroIfNeeded(raw: string, iso2: CountryCode): string {\r\n if (!raw) return raw;\r\n\r\n const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';\r\n\r\n // If already valid, don't touch.\r\n const parsed0 = this.tel.parse(raw, iso2);\r\n if (parsed0.isValid) return raw;\r\n\r\n // Try: +<dial>0xxxx → +<dial>xxxx\r\n if (dial && raw.startsWith(`+${dial}0`)) {\r\n const attempt = `+${dial}${raw.slice(dial.length + 2)}`;\r\n const p = this.tel.parse(attempt, iso2);\r\n if (p.isValid) return attempt;\r\n }\r\n\r\n // Try: 0xxxx → xxxx (national)\r\n if (!raw.startsWith('+') && raw.startsWith('0')) {\r\n const attemptNat = raw.slice(1);\r\n const p = this.tel.parse(attemptNat, iso2);\r\n if (p.isValid) return attemptNat;\r\n }\r\n\r\n return raw;\r\n }\r\n\r\n private bindDomListeners() {\r\n const el = this.inputRef.nativeElement;\r\n\r\n this.zone.runOutsideAngular(() => {\r\n el.addEventListener('beforeinput', (ev: InputEvent) => {\r\n if (!this.digitsOnly) return;\r\n\r\n const data = (ev as any).data as string | null;\r\n\r\n // If already valid, block extra digit insertions when no selection\r\n if (this.lockWhenValid && this.isCurrentlyValid()) {\r\n const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);\r\n const isDigit = !!data && ev.inputType === 'insertText' && data >= '0' && data <= '9';\r\n const isPlusAtStart = this.allowLeadingPlus && data === '+' && (el.selectionStart ?? 0) === 0 && !el.value.includes('+');\r\n\r\n if (selCollapsed && (isDigit || isPlusAtStart)) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n // normal filtering when not valid (or replacing text)\r\n if (!data || ev.inputType !== 'insertText') return;\r\n\r\n const pos = el.selectionStart ?? 0;\r\n const isDigit = data >= '0' && data <= '9';\r\n const isPlusAtStart = this.allowLeadingPlus && data === '+' && pos === 0 && !el.value.includes('+');\r\n\r\n if (!isDigit && !isPlusAtStart) ev.preventDefault();\r\n });\r\n\r\n el.addEventListener('paste', (e: ClipboardEvent) => {\r\n if (!this.digitsOnly) return;\r\n\r\n const text = (e.clipboardData || (window as any).clipboardData).getData('text') || '';\r\n const hasAnyDigit = /[0-9]/.test(text);\r\n\r\n // block pasting extra digits if valid and there is no selection\r\n if (this.lockWhenValid && this.isCurrentlyValid()) {\r\n const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);\r\n if (selCollapsed && hasAnyDigit) {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n // sanitize paste\r\n e.preventDefault();\r\n const sanitized = this.sanitizeDigits(text);\r\n const start = el.selectionStart ?? el.value.length;\r\n const end = el.selectionEnd ?? el.value.length;\r\n el.setRangeText(sanitized, start, end, 'end');\r\n queueMicrotask(() => this.handleInput());\r\n });\r\n\r\n el.addEventListener('input', () => {\r\n if (this.digitsOnly) {\r\n const val = el.value;\r\n const sanitized = this.sanitizeDigits(val);\r\n if (val !== sanitized) {\r\n const caret = el.selectionStart ?? sanitized.length;\r\n el.value = sanitized;\r\n el.setSelectionRange(caret, caret);\r\n }\r\n }\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('countrychange', () => {\r\n const iso2 = this.currentIso2();\r\n this.zone.run(() => {\r\n this.countryChange.emit({iso2});\r\n this.validatorChange?.();\r\n });\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('blur', () => this.onBlur());\r\n });\r\n }\r\n\r\n onBlur() {\r\n this.touched = true;\r\n this.zone.run(() => this.onTouchedCb());\r\n if (!this.formatOnBlur) return;\r\n\r\n const iso2 = this.currentIso2();\r\n const parsed = this.tel.parse(this.currentRaw(), iso2);\r\n if (parsed.isValid && parsed.national) {\r\n this.setInputValue(parsed.national.replace(/\\D/g, '')); // digits only\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n private handleInput() {\r\n let raw = this.currentRaw();\r\n // ensure digits-only in the box\r\n raw = raw.replace(/\\D/g, '');\r\n if (raw !== this.currentRaw()) this.setInputValue(raw);\r\n\r\n const iso2 = this.currentIso2();\r\n const parsed = this.tel.parse(raw, iso2);\r\n\r\n // emit E.164 to the form\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw, e164: parsed.e164, iso2 }));\r\n\r\n // keep visible input as national digits only (when valid we can normalize spacing, but we remove it anyway)\r\n if (parsed.isValid && parsed.national) {\r\n const nsn = parsed.national.replace(/\\D/g, '');\r\n if (nsn !== raw) this.setInputValue(nsn);\r\n }\r\n }\r\n\r\n private formatAsYouType(raw: string, iso2: CountryCode): string {\r\n try {\r\n // When a region is provided, AsYouType returns NATIONAL formatting\r\n const fmt = new AsYouType(iso2);\r\n return fmt.input(raw);\r\n } catch {\r\n return raw;\r\n }\r\n }\r\n\r\n currentRaw(): string {\r\n return (this.inputRef?.nativeElement.value ?? '').trim();\r\n }\r\n\r\n private currentIso2(): CountryCode {\r\n const iso2 = (this.iti?.getSelectedCountryData?.().iso2 ?? this.initialCountry ?? 'US')\r\n .toString().toUpperCase();\r\n return iso2 as CountryCode;\r\n }\r\n\r\n private setInputValue(v: string) {\r\n this.inputRef.nativeElement.value = v ?? '';\r\n }\r\n\r\n get showError(): boolean {\r\n const invalid = !!this.validate({} as AbstractControl);\r\n return this.showErrorWhenTouched ? (this.touched && invalid) : invalid;\r\n }\r\n\r\n private isCurrentlyValid(): boolean {\r\n return this.tel.isValid(this.currentRaw(), this.currentIso2());\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxsmkTelInputService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngxsmk-tel-input.mjs","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.service.ts","../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts","../../../projects/ngxsmk-tel-input/src/ngxsmk-tel-input.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxsmkTelInputService {\r\n parse(input: string, iso2: CountryCode): { e164: string | null; national: string | null; isValid: boolean } {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n if (!phone) return { e164: null, national: null, isValid: false };\r\n const isValid = phone.isValid();\r\n return { e164: isValid ? phone.number : null, national: phone.formatNational(), isValid };\r\n }\r\n\r\n isValid(input: string, iso2: CountryCode): boolean {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n return !!phone && phone.isValid();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n PLATFORM_ID,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator\r\n} from '@angular/forms';\r\nimport { AsYouType, CountryCode } from 'libphonenumber-js';\r\nimport { NgxsmkTelInputService } from './ngxsmk-tel-input.service';\r\nimport { CountryMap, IntlTelI18n } from './types';\r\n\r\ntype IntlTelInstance = any;\r\n\r\n@Component({\r\n selector: 'ngxsmk-tel-input',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <div class=\"ngxsmk-tel\"\r\n [class.disabled]=\"disabled\"\r\n [attr.data-size]=\"size\"\r\n [attr.data-variant]=\"variant\"\r\n [attr.dir]=\"dir\">\r\n @if (label) {\r\n <label class=\"ngxsmk-tel__label\" [for]=\"resolvedId\">{{ label }}</label>\r\n }\r\n\r\n <div class=\"ngxsmk-tel__wrap\" [class.has-error]=\"showError\">\r\n <div class=\"ngxsmk-tel-input__wrapper\">\r\n <input\r\n #telInput\r\n type=\"tel\"\r\n class=\"ngxsmk-tel-input__control\"\r\n [id]=\"resolvedId\"\r\n [attr.name]=\"name || null\"\r\n [attr.placeholder]=\"placeholder || null\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.inputmode]=\"digitsOnly ? 'numeric' : 'tel'\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-invalid]=\"showError ? 'true' : 'false'\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n\r\n @if (showClear && currentRaw()) {\r\n <button type=\"button\"\r\n class=\"ngxsmk-tel__clear\"\r\n (click)=\"clearInput()\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (hint && !showError) {\r\n <div class=\"ngxsmk-tel__hint\">{{ hint }}</div>\r\n }\r\n </div>\r\n `,\r\n styleUrls: ['./ngxsmk-tel-input.component.scss'],\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },\r\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }\r\n ]\r\n})\r\nexport class NgxsmkTelInputComponent implements AfterViewInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\r\n @ViewChild('telInput', { static: true }) inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n /* Core config */\r\n @Input() initialCountry: CountryCode | 'auto' = 'US';\r\n @Input() preferredCountries: CountryCode[] = ['US', 'GB'];\r\n @Input() onlyCountries?: CountryCode[];\r\n @Input() separateDialCode: boolean = true; // dropdown shows dial code; input never does\r\n @Input() allowDropdown: boolean = true;\r\n\r\n /* Display/formatting */\r\n /** 'formatted' => national with spaces; 'digits' => national digits only */\r\n @Input() nationalDisplay: 'formatted' | 'digits' = 'formatted';\r\n /** when to format: 'typing' (live), 'blur', or 'off' */\r\n @Input() formatWhenValid: 'off' | 'blur' | 'typing' = 'typing';\r\n\r\n /* UX */\r\n @Input() placeholder?: string;\r\n @Input() autocomplete = 'tel';\r\n @Input() name?: string;\r\n @Input() inputId?: string;\r\n @Input() disabled = false;\r\n\r\n @Input() label?: string;\r\n @Input() hint?: string;\r\n @Input() errorText?: string;\r\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\r\n @Input() variant: 'outline' | 'filled' | 'underline' = 'outline';\r\n @Input() showClear = true;\r\n @Input() autoFocus = false;\r\n @Input() selectOnFocus = false;\r\n @Input() showErrorWhenTouched = true;\r\n\r\n /* Dropdown plumbing */\r\n @Input() dropdownAttachToBody = true;\r\n @Input() dropdownZIndex = 2000;\r\n\r\n /* Localization + RTL */\r\n @Input('i18n') i18n?: IntlTelI18n;\r\n @Input('telI18n') set telI18n(v: IntlTelI18n | undefined) { this.i18n = v; }\r\n @Input('localizedCountries') localizedCountries?: CountryMap;\r\n @Input('telLocalizedCountries') set telLocalizedCountries(v: CountryMap | undefined) { this.localizedCountries = v; }\r\n\r\n @Input() clearAriaLabel = 'Clear phone number';\r\n @Input() dir: 'ltr' | 'rtl' = 'ltr';\r\n\r\n /* Placeholders (intl-tel-input) */\r\n @Input() autoPlaceholder: 'off' | 'polite' | 'aggressive' = 'off';\r\n @Input() utilsScript?: string;\r\n @Input() customPlaceholder?: (example: string, country: any) => string;\r\n\r\n /* Input behavior */\r\n @Input() digitsOnly = true; // typing filter (we still allow our own spaces when formatting)\r\n @Input() lockWhenValid = true; // prevent extra digits when valid\r\n\r\n /* Outputs */\r\n @Output() countryChange = new EventEmitter<{ iso2: CountryCode }>();\r\n @Output() validityChange = new EventEmitter<boolean>();\r\n @Output() inputChange = new EventEmitter<{ raw: string; e164: string | null; iso2: CountryCode }>();\r\n\r\n /* Internal */\r\n private iti: IntlTelInstance | null = null;\r\n private onChange: (val: string | null) => void = () => {};\r\n private onTouchedCb: () => void = () => {};\r\n private validatorChange?: () => void;\r\n private lastEmittedValid = false;\r\n private pendingWrite: string | null = null;\r\n private touched = false;\r\n\r\n private allowDropdownWasTrue = false;\r\n private suppressEvents = false;\r\n\r\n readonly resolvedId: string = this.inputId || ('tel-' + Math.random().toString(36).slice(2));\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n constructor(private readonly zone: NgZone, private readonly tel: NgxsmkTelInputService) {}\r\n\r\n // ---------- Lifecycle ----------\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n void this.initAndWire();\r\n }\r\n\r\n private async initAndWire(): Promise<void> {\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n if (this.pendingWrite !== null) {\r\n const v = this.pendingWrite;\r\n this.pendingWrite = null;\r\n this.writeValue(v);\r\n }\r\n\r\n if (this.autoFocus) setTimeout(() => this.focus(), 0);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n const configChanged = [\r\n 'initialCountry', 'preferredCountries', 'onlyCountries',\r\n 'separateDialCode', 'allowDropdown',\r\n 'i18n', 'localizedCountries', 'dir',\r\n 'autoPlaceholder', 'utilsScript', 'customPlaceholder'\r\n ].some(k => k in changes && !changes[k]?.firstChange);\r\n\r\n if (configChanged && this.iti) {\r\n this.reinitPlugin();\r\n this.validatorChange?.();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void { this.destroyPlugin(); }\r\n\r\n // ---------- CVA ----------\r\n writeValue(val: string | null): void {\r\n if (!this.inputRef) return;\r\n\r\n if (!this.iti) { // not ready\r\n this.pendingWrite = val ?? '';\r\n return;\r\n }\r\n\r\n this.suppressEvents = true;\r\n try {\r\n // Let plugin infer the country from E.164\r\n this.iti.setNumber(val || '');\r\n\r\n const iso2 = this.currentIso2();\r\n const normalized = this.stripTrunkZeroIfNeeded(val ?? '', iso2);\r\n const parsed = this.tel.parse(normalized, iso2);\r\n\r\n // Visible input: ALWAYS national (formatted or digits-only)\r\n const nsnDigits = this.toNSN(parsed.national ?? normalized.replace(/^\\+\\d+/, ''));\r\n const display = this.nationalDisplay === 'formatted'\r\n ? this.formatNational(nsnDigits, iso2)\r\n : nsnDigits;\r\n\r\n this.setInputValue(display);\r\n\r\n // FormControl value: ALWAYS E.164 (or null)\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw: display, e164: parsed.e164, iso2 }));\r\n } finally {\r\n this.suppressEvents = false;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void { this.onChange = fn; }\r\n registerOnTouched(fn: any): void { this.onTouchedCb = fn; }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n\r\n // 1) native input state\r\n if (this.inputRef) this.inputRef.nativeElement.disabled = isDisabled;\r\n\r\n // 2) toggle dropdown by re-init with allowDropdown=false when disabled\r\n if (this.iti) {\r\n if (isDisabled && this.allowDropdown) {\r\n this.allowDropdownWasTrue = true;\r\n this.allowDropdown = false;\r\n this.reinitPlugin();\r\n } else if (!isDisabled && this.allowDropdownWasTrue) {\r\n this.allowDropdown = true;\r\n this.allowDropdownWasTrue = false;\r\n this.reinitPlugin();\r\n } else {\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n } else {\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n }\r\n\r\n // ---------- Validator ----------\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n const raw = this.currentRaw();\r\n if (!raw) return null;\r\n const valid = this.tel.isValid(raw, this.currentIso2());\r\n if (valid !== this.lastEmittedValid) {\r\n this.lastEmittedValid = valid;\r\n this.validityChange.emit(valid);\r\n }\r\n return valid ? null : { phoneInvalid: true };\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void { this.validatorChange = fn; }\r\n\r\n // ---------- Public helpers ----------\r\n focus(): void {\r\n this.inputRef?.nativeElement.focus();\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n selectCountry(iso2: CountryCode): void {\r\n if (this.iti) {\r\n this.iti.setCountry(iso2.toLowerCase());\r\n this.handleInput();\r\n }\r\n }\r\n\r\n clearInput(): void {\r\n this.setInputValue('');\r\n this.handleInput();\r\n this.inputRef.nativeElement.focus();\r\n }\r\n\r\n // ---------- intl-tel-input wiring ----------\r\n private async initIntlTelInput() {\r\n const [{ default: intlTelInput }] = await Promise.all([import('intl-tel-input')]);\r\n\r\n const toLowerKeys = (m?: CountryMap) => {\r\n if (!m) return undefined;\r\n const out: Record<string, string> = {};\r\n for (const k in m) if (Object.prototype.hasOwnProperty.call(m, k)) {\r\n const v = (m as Record<string, string | undefined>)[k];\r\n if (v != null) out[k.toLowerCase()] = v;\r\n }\r\n return out;\r\n };\r\n\r\n const config: any = {\r\n initialCountry: this.initialCountry === 'auto' ? 'auto' : (this.initialCountry?.toLowerCase() || 'us'),\r\n preferredCountries: (this.preferredCountries ?? []).map(c => c.toLowerCase()),\r\n onlyCountries: (this.onlyCountries ?? []).map(c => c.toLowerCase()),\r\n nationalMode: true, // we control display; prevents '+' re-injection\r\n allowDropdown: this.allowDropdown,\r\n separateDialCode: this.separateDialCode,\r\n geoIpLookup: (cb: (iso2: string) => void) => cb('us'),\r\n\r\n autoPlaceholder: this.autoPlaceholder,\r\n utilsScript: this.utilsScript,\r\n customPlaceholder: this.customPlaceholder,\r\n\r\n i18n: this.i18n,\r\n localizedCountries: toLowerKeys(this.localizedCountries),\r\n dropdownContainer: this.dropdownAttachToBody && typeof document !== 'undefined' ? document.body : undefined\r\n };\r\n\r\n this.zone.runOutsideAngular(() => {\r\n this.iti = intlTelInput(this.inputRef.nativeElement, config);\r\n });\r\n\r\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\r\n this.applyDisabledUi(this.disabled);\r\n }\r\n\r\n private async reinitPlugin() {\r\n const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();\r\n const prevValue = this.currentRaw();\r\n\r\n this.destroyPlugin();\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n try { this.iti?.setCountry(prevIso2); } catch {}\r\n if (prevValue) {\r\n this.setInputValue(prevValue);\r\n this.handleInput();\r\n }\r\n this.applyDisabledUi(this.disabled);\r\n }\r\n\r\n private destroyPlugin() {\r\n if (this.iti) {\r\n this.iti.destroy();\r\n this.iti = null;\r\n }\r\n if (this.inputRef?.nativeElement) {\r\n const el = this.inputRef.nativeElement;\r\n const clone = el.cloneNode(true) as HTMLInputElement;\r\n\r\n // preserve state across clone\r\n clone.disabled = this.disabled;\r\n clone.id = this.resolvedId;\r\n clone.name = this.name ?? clone.name;\r\n clone.value = el.value;\r\n\r\n el.parentNode?.replaceChild(clone, el);\r\n (this.inputRef as any).nativeElement = clone;\r\n }\r\n }\r\n\r\n // ---------- Input listeners ----------\r\n private bindDomListeners() {\r\n const el = this.inputRef.nativeElement;\r\n\r\n this.zone.runOutsideAngular(() => {\r\n el.addEventListener('beforeinput', (ev: InputEvent) => {\r\n if (!this.digitsOnly) return;\r\n const data = (ev as any).data as string | null;\r\n\r\n // If already valid, block extra digit insertions when no selection\r\n if (this.lockWhenValid && this.isCurrentlyValid()) {\r\n const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);\r\n const isDigit = !!data && ev.inputType === 'insertText' && data >= '0' && data <= '9';\r\n if (selCollapsed && isDigit) { ev.preventDefault(); return; }\r\n }\r\n\r\n if (!data || ev.inputType !== 'insertText') return;\r\n const isDigit = data >= '0' && data <= '9';\r\n if (!isDigit) ev.preventDefault(); // users type digits only; we insert spaces ourselves\r\n });\r\n\r\n el.addEventListener('paste', (e: ClipboardEvent) => {\r\n const text = (e.clipboardData || (window as any).clipboardData).getData('text') || '';\r\n e.preventDefault();\r\n const digits = this.toNSN(text);\r\n const start = el.selectionStart ?? el.value.length;\r\n const end = el.selectionEnd ?? el.value.length;\r\n el.setRangeText(digits, start, end, 'end');\r\n queueMicrotask(() => this.handleInput());\r\n });\r\n\r\n el.addEventListener('input', () => this.handleInput());\r\n\r\n el.addEventListener('countrychange', () => {\r\n const iso2 = this.currentIso2();\r\n this.zone.run(() => {\r\n this.countryChange.emit({ iso2 });\r\n this.validatorChange?.();\r\n });\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('blur', () => this.onBlur());\r\n });\r\n }\r\n\r\n // ---------- UX handlers ----------\r\n onBlur() {\r\n this.touched = true;\r\n this.zone.run(() => this.onTouchedCb());\r\n if (this.formatWhenValid === 'off') return;\r\n\r\n const iso2 = this.currentIso2();\r\n const digits = this.toNSN(this.currentRaw());\r\n const parsed = this.tel.parse(digits, iso2);\r\n if (!parsed.isValid) return;\r\n\r\n if (this.formatWhenValid !== 'typing') {\r\n const display = this.nationalDisplay === 'formatted'\r\n ? this.formatNational(digits, iso2)\r\n : this.toNSN(parsed.national ?? digits);\r\n this.setInputValue(display);\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n // ---------- Core input pipeline ----------\r\n private handleInput() {\r\n if (this.suppressEvents) return;\r\n\r\n const iso2 = this.currentIso2();\r\n let digits = this.toNSN(this.currentRaw());\r\n\r\n // Parse once from digits\r\n const parsed = this.tel.parse(digits, iso2);\r\n\r\n // Emit E.164 to the form (or null if invalid/incomplete)\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw: this.currentRaw(), e164: parsed.e164, iso2 }));\r\n\r\n // Visible value\r\n if (this.formatWhenValid === 'typing' && digits.length) {\r\n const display = this.nationalDisplay === 'formatted'\r\n ? this.formatNational(digits, iso2)\r\n : digits;\r\n if (display !== this.currentRaw()) {\r\n this.suppressEvents = true;\r\n this.setInputValue(display);\r\n this.suppressEvents = false;\r\n }\r\n } else if (parsed.isValid) {\r\n const display = this.nationalDisplay === 'formatted'\r\n ? this.formatNational(digits, iso2)\r\n : this.toNSN(parsed.national ?? digits);\r\n if (display !== this.currentRaw()) this.setInputValue(display);\r\n }\r\n }\r\n\r\n // ---------- Utilities ----------\r\n /** Format NATIONAL number (with spaces) using libphonenumber rules. Accepts digits only. */\r\n private formatNational(digits: string, iso2: CountryCode): string {\r\n try {\r\n const fmt = new AsYouType(iso2);\r\n return fmt.input(digits);\r\n } catch {\r\n return digits;\r\n }\r\n }\r\n\r\n /** Convert any string to NSN (digits only). */\r\n private toNSN(v: string | null | undefined): string {\r\n return (v ?? '').replace(/\\D/g, '');\r\n }\r\n\r\n /** Remove one trunk '0' after +<dial> or at national start, only if it makes a valid number */\r\n private stripTrunkZeroIfNeeded(raw: string, iso2: CountryCode): string {\r\n if (!raw) return raw;\r\n\r\n const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';\r\n const p0 = this.tel.parse(raw, iso2);\r\n if (p0.isValid) return raw;\r\n\r\n if (raw.startsWith('+') && dial && raw.startsWith(`+${dial}0`)) {\r\n const attempt = `+${dial}${raw.slice(dial.length + 2)}`;\r\n const p1 = this.tel.parse(attempt, iso2);\r\n if (p1.isValid) return attempt;\r\n }\r\n\r\n if (!raw.startsWith('+') && raw.startsWith('0')) {\r\n const attemptNat = raw.slice(1);\r\n const p2 = this.tel.parse(attemptNat, iso2);\r\n if (p2.isValid) return attemptNat;\r\n }\r\n\r\n return raw;\r\n }\r\n\r\n currentRaw(): string { return (this.inputRef?.nativeElement.value ?? '').trim(); }\r\n\r\n private currentIso2(): CountryCode {\r\n const iso2 = (this.iti?.getSelectedCountryData?.().iso2 ?? this.initialCountry ?? 'US')\r\n .toString().toUpperCase();\r\n return iso2 as CountryCode;\r\n }\r\n\r\n private setInputValue(v: string) { this.inputRef.nativeElement.value = v ?? ''; }\r\n\r\n get showError(): boolean {\r\n const invalid = !!this.validate({} as AbstractControl);\r\n return this.showErrorWhenTouched ? (this.touched && invalid) : invalid;\r\n }\r\n\r\n private isCurrentlyValid(): boolean { return this.tel.isValid(this.currentRaw(), this.currentIso2()); }\r\n\r\n /** Make flag/dropdown non-interactive when disabled */\r\n private applyDisabledUi(disabled: boolean) {\r\n const input = this.inputRef?.nativeElement;\r\n if (!input) return;\r\n const flag = input.parentElement?.querySelector('.iti__selected-flag') as HTMLElement | null;\r\n if (flag) {\r\n flag.tabIndex = disabled ? -1 : 0;\r\n flag.setAttribute('aria-disabled', String(disabled));\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxsmkTelInputService"],"mappings":";;;;;;MAIa,qBAAqB,CAAA;IAChC,KAAK,CAAC,KAAa,EAAE,IAAiB,EAAA;QACpC,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;AACjE,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE;QAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE;;IAG3F,OAAO,CAAC,KAAa,EAAE,IAAiB,EAAA;QACtC,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC;QAC3D,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;;+GAVxB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCiFrB,uBAAuB,CAAA;IAuClC,IAAsB,OAAO,CAAC,CAA0B,EAAI,EAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAE1E,IAAoC,qBAAqB,CAAC,CAAyB,EAAI,EAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;IAkCnH,WAA6B,CAAA,IAAY,EAAmB,GAA0B,EAAA;QAAzD,IAAI,CAAA,IAAA,GAAJ,IAAI;QAA2B,IAAG,CAAA,GAAA,GAAH,GAAG;;QAvEtD,IAAc,CAAA,cAAA,GAAyB,IAAI;AAC3C,QAAA,IAAA,CAAA,kBAAkB,GAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;AAEhD,QAAA,IAAA,CAAA,gBAAgB,GAAY,IAAI,CAAC;QACjC,IAAa,CAAA,aAAA,GAAY,IAAI;;;QAI7B,IAAe,CAAA,eAAA,GAA2B,WAAW;;QAErD,IAAe,CAAA,eAAA,GAA8B,QAAQ;QAIrD,IAAY,CAAA,YAAA,GAAG,KAAK;QAGpB,IAAQ,CAAA,QAAA,GAAG,KAAK;QAKhB,IAAI,CAAA,IAAA,GAAuB,IAAI;QAC/B,IAAO,CAAA,OAAA,GAAuC,SAAS;QACvD,IAAS,CAAA,SAAA,GAAG,IAAI;QAChB,IAAS,CAAA,SAAA,GAAG,KAAK;QACjB,IAAa,CAAA,aAAA,GAAG,KAAK;QACrB,IAAoB,CAAA,oBAAA,GAAG,IAAI;;QAG3B,IAAoB,CAAA,oBAAA,GAAG,IAAI;QAC3B,IAAc,CAAA,cAAA,GAAG,IAAI;QAQrB,IAAc,CAAA,cAAA,GAAG,oBAAoB;QACrC,IAAG,CAAA,GAAA,GAAkB,KAAK;;QAG1B,IAAe,CAAA,eAAA,GAAoC,KAAK;;AAKxD,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC;AAClB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC;;AAGpB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAyB;AACzD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAW;AAC5C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAA2D;;QAG3F,IAAG,CAAA,GAAA,GAA2B,IAAI;AAClC,QAAA,IAAA,CAAA,QAAQ,GAAiC,MAAK,GAAG;AACjD,QAAA,IAAA,CAAA,WAAW,GAAe,MAAK,GAAG;QAElC,IAAgB,CAAA,gBAAA,GAAG,KAAK;QACxB,IAAY,CAAA,YAAA,GAAkB,IAAI;QAClC,IAAO,CAAA,OAAA,GAAG,KAAK;QAEf,IAAoB,CAAA,oBAAA,GAAG,KAAK;QAC5B,IAAc,CAAA,cAAA,GAAG,KAAK;QAErB,IAAU,CAAA,UAAA,GAAW,IAAI,CAAC,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3E,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;;;IAKjD,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;AACzC,QAAA,KAAK,IAAI,CAAC,WAAW,EAAE;;AAGjB,IAAA,MAAM,WAAW,GAAA;AACvB,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE;AAC9B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY;AAC3B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;QAGpB,IAAI,IAAI,CAAC,SAAS;YAAE,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;AAGvD,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;AACzC,QAAA,MAAM,aAAa,GAAG;YACpB,gBAAgB,EAAE,oBAAoB,EAAE,eAAe;AACvD,YAAA,kBAAkB,EAAE,eAAe;YACnC,MAAM,EAAE,oBAAoB,EAAE,KAAK;YACnC,iBAAiB,EAAE,aAAa,EAAE;AACnC,SAAA,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;AAErD,QAAA,IAAI,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,eAAe,IAAI;;;AAI5B,IAAA,WAAW,KAAW,IAAI,CAAC,aAAa,EAAE,CAAC;;AAG3C,IAAA,UAAU,CAAC,GAAkB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACb,YAAA,IAAI,CAAC,YAAY,GAAG,GAAG,IAAI,EAAE;YAC7B;;AAGF,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI;;YAEF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;AAE7B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC;AAC/D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC;;AAG/C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACjF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,KAAK;kBACrC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI;kBACnC,SAAS;AAEb,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;AAG3B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/C,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;gBAC7E;AACR,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;;;IAI/B,gBAAgB,CAAC,EAAO,EAAA,EAAU,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrD,iBAAiB,CAAC,EAAO,EAAA,EAAU,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AAEzD,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;;QAG1B,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,GAAG,UAAU;;AAGpE,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE;AACpC,gBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;gBAC1B,IAAI,CAAC,YAAY,EAAE;;AACd,iBAAA,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,oBAAoB,EAAE;AACnD,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;gBACjC,IAAI,CAAC,YAAY,EAAE;;iBACd;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;;;aAE7B;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;;;;AAKpC,IAAA,QAAQ,CAAC,CAAkB,EAAA;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AACvD,QAAA,IAAI,KAAK,KAAK,IAAI,CAAC,gBAAgB,EAAE;AACnC,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7B,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;;AAEjC,QAAA,OAAO,KAAK,GAAG,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE;;IAG9C,yBAAyB,CAAC,EAAc,EAAA,EAAU,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;;IAG5E,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AACtC,YAAA,cAAc,CAAC,MAAM,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;;AAIlE,IAAA,aAAa,CAAC,IAAiB,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,EAAE;;;IAItB,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE;;;AAI7B,IAAA,MAAM,gBAAgB,GAAA;QAC5B,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAEjF,QAAA,MAAM,WAAW,GAAG,CAAC,CAAc,KAAI;AACrC,YAAA,IAAI,CAAC,CAAC;AAAE,gBAAA,OAAO,SAAS;YACxB,MAAM,GAAG,GAA2B,EAAE;YACtC,KAAK,MAAM,CAAC,IAAI,CAAC;AAAE,gBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AACjE,oBAAA,MAAM,CAAC,GAAI,CAAwC,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,IAAI,IAAI;wBAAE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;;AAEzC,YAAA,OAAO,GAAG;AACZ,SAAC;AAED,QAAA,MAAM,MAAM,GAAQ;YAClB,cAAc,EAAE,IAAI,CAAC,cAAc,KAAK,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;AACtG,YAAA,kBAAkB,EAAE,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7E,YAAA,aAAa,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,WAAW,EAAE,CAAC,EAA0B,KAAK,EAAE,CAAC,IAAI,CAAC;YAErD,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YAEzC,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,kBAAkB,EAAE,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACxD,YAAA,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,IAAI,OAAO,QAAQ,KAAK,WAAW,GAAG,QAAQ,CAAC,IAAI,GAAG;SACnG;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;AAC9D,SAAC,CAAC;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,aAA6B,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACzG,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAG7B,IAAA,MAAM,YAAY,GAAA;QACxB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;AACpH,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE;QAEnC,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI;AAAE,YAAA,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC;;QAAI,MAAM;QAC9C,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;YAC7B,IAAI,CAAC,WAAW,EAAE;;AAEpB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAG7B,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAClB,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI;;AAEjB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE;AAChC,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;YACtC,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAqB;;AAGpD,YAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,YAAA,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU;YAC1B,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI;AACpC,YAAA,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;YAEtB,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;AACrC,YAAA,IAAI,CAAC,QAAgB,CAAC,aAAa,GAAG,KAAK;;;;IAKxC,gBAAgB,GAAA;AACtB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AAEtC,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAC/B,EAAE,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,EAAc,KAAI;gBACpD,IAAI,CAAC,IAAI,CAAC,UAAU;oBAAE;AACtB,gBAAA,MAAM,IAAI,GAAI,EAAU,CAAC,IAAqB;;gBAG9C,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACjD,oBAAA,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC;AACxE,oBAAA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,KAAK,YAAY,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG;AACrF,oBAAA,IAAI,YAAY,IAAI,OAAO,EAAE;wBAAE,EAAE,CAAC,cAAc,EAAE;wBAAE;;;AAGtD,gBAAA,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,KAAK,YAAY;oBAAE;gBAC5C,MAAM,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG;AAC1C,gBAAA,IAAI,CAAC,OAAO;AAAE,oBAAA,EAAE,CAAC,cAAc,EAAE,CAAC;AACpC,aAAC,CAAC;YAEF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAiB,KAAI;AACjD,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,IAAK,MAAc,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;gBACrF,CAAC,CAAC,cAAc,EAAE;gBAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC/B,MAAM,KAAK,GAAG,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM;gBAClD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM;gBAC9C,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;gBAC1C,cAAc,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;AAC1C,aAAC,CAAC;AAEF,YAAA,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;AAEtD,YAAA,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAK;AACxC,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;oBACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AACjC,oBAAA,IAAI,CAAC,eAAe,IAAI;AAC1B,iBAAC,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE;AACpB,aAAC,CAAC;AAEF,YAAA,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;AAClD,SAAC,CAAC;;;IAIJ,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;AACvC,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK;YAAE;AAEpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE;AAErB,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,KAAK;kBACrC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI;kBAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;;IAI/B,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AACtC,YAAA,cAAc,CAAC,MAAM,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;;;IAK1D,WAAW,GAAA;QACjB,IAAI,IAAI,CAAC,cAAc;YAAE;AAEzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;;AAG1C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;;AAG3C,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;QAG/F,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;AACtD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,KAAK;kBACrC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI;kBAChC,MAAM;AACV,YAAA,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,EAAE;AACjC,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AAC3B,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;;;AAExB,aAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,KAAK;kBACrC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI;kBAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;AACzC,YAAA,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;;;;IAM1D,cAAc,CAAC,MAAc,EAAE,IAAiB,EAAA;AACtD,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC;AAC/B,YAAA,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;;AACxB,QAAA,MAAM;AACN,YAAA,OAAO,MAAM;;;;AAKT,IAAA,KAAK,CAAC,CAA4B,EAAA;AACxC,QAAA,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;;;IAI7B,sBAAsB,CAAC,GAAW,EAAE,IAAiB,EAAA;AAC3D,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,GAAG;AAEpB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,IAAI,CAAC,QAAQ,IAAI,EAAE;AAChE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;QACpC,IAAI,EAAE,CAAC,OAAO;AAAE,YAAA,OAAO,GAAG;AAE1B,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA,CAAA,EAAI,IAAI,CAAG,CAAA,CAAA,CAAC,EAAE;AAC9D,YAAA,MAAM,OAAO,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;AACvD,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;YACxC,IAAI,EAAE,CAAC,OAAO;AAAE,gBAAA,OAAO,OAAO;;AAGhC,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC;YAC3C,IAAI,EAAE,CAAC,OAAO;AAAE,gBAAA,OAAO,UAAU;;AAGnC,QAAA,OAAO,GAAG;;AAGZ,IAAA,UAAU,KAAa,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;IAExE,WAAW,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI;AACnF,aAAA,QAAQ,EAAE,CAAC,WAAW,EAAE;AAC3B,QAAA,OAAO,IAAmB;;AAGpB,IAAA,aAAa,CAAC,CAAS,EAAA,EAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;AAE/E,IAAA,IAAI,SAAS,GAAA;QACX,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAqB,CAAC;AACtD,QAAA,OAAO,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO;;IAGhE,gBAAgB,GAAA,EAAc,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;;AAG7F,IAAA,eAAe,CAAC,QAAiB,EAAA;AACvC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa;AAC1C,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,aAAa,CAAC,qBAAqB,CAAuB;QAC5F,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;;;+GArc7C,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EALvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,GAAA,EAAA,KAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAAA;AACT,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACnG,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI;SAC9F,EA/CS,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qwHAAA,CAAA,EAAA,CAAA,CAAA;;4FAOU,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBArDnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAChB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,EAAE,EACD,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CT,EAEU,SAAA,EAAA;AACT,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACnG,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC,EAAE,KAAK,EAAE,IAAI;AAC9F,qBAAA,EAAA,MAAA,EAAA,CAAA,qwHAAA,CAAA,EAAA;4GAGwC,QAAQ,EAAA,CAAA;sBAAhD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAG9B,cAAc,EAAA,CAAA;sBAAtB;gBACQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAIQ,eAAe,EAAA,CAAA;sBAAvB;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAGQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBAGc,IAAI,EAAA,CAAA;sBAAlB,KAAK;uBAAC,MAAM;gBACS,OAAO,EAAA,CAAA;sBAA5B,KAAK;uBAAC,SAAS;gBACa,kBAAkB,EAAA,CAAA;sBAA9C,KAAK;uBAAC,oBAAoB;gBACS,qBAAqB,EAAA,CAAA;sBAAxD,KAAK;uBAAC,uBAAuB;gBAErB,cAAc,EAAA,CAAA;sBAAtB;gBACQ,GAAG,EAAA,CAAA;sBAAX;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAGS,aAAa,EAAA,CAAA;sBAAtB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBACS,WAAW,EAAA,CAAA;sBAApB;;;AC9IH;;AAEG;;;;"}
|
|
@@ -11,10 +11,12 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
11
11
|
initialCountry: CountryCode | 'auto';
|
|
12
12
|
preferredCountries: CountryCode[];
|
|
13
13
|
onlyCountries?: CountryCode[];
|
|
14
|
-
nationalMode: boolean;
|
|
15
14
|
separateDialCode: boolean;
|
|
16
15
|
allowDropdown: boolean;
|
|
17
|
-
|
|
16
|
+
/** 'formatted' => national with spaces; 'digits' => national digits only */
|
|
17
|
+
nationalDisplay: 'formatted' | 'digits';
|
|
18
|
+
/** when to format: 'typing' (live), 'blur', or 'off' */
|
|
19
|
+
formatWhenValid: 'off' | 'blur' | 'typing';
|
|
18
20
|
placeholder?: string;
|
|
19
21
|
autocomplete: string;
|
|
20
22
|
name?: string;
|
|
@@ -28,7 +30,6 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
28
30
|
showClear: boolean;
|
|
29
31
|
autoFocus: boolean;
|
|
30
32
|
selectOnFocus: boolean;
|
|
31
|
-
formatOnBlur: boolean;
|
|
32
33
|
showErrorWhenTouched: boolean;
|
|
33
34
|
dropdownAttachToBody: boolean;
|
|
34
35
|
dropdownZIndex: number;
|
|
@@ -41,9 +42,8 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
41
42
|
autoPlaceholder: 'off' | 'polite' | 'aggressive';
|
|
42
43
|
utilsScript?: string;
|
|
43
44
|
customPlaceholder?: (example: string, country: any) => string;
|
|
44
|
-
formatWhenValid: 'off' | 'blur' | 'typing';
|
|
45
45
|
digitsOnly: boolean;
|
|
46
|
-
|
|
46
|
+
lockWhenValid: boolean;
|
|
47
47
|
countryChange: EventEmitter<{
|
|
48
48
|
iso2: CountryCode;
|
|
49
49
|
}>;
|
|
@@ -60,10 +60,10 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
60
60
|
private lastEmittedValid;
|
|
61
61
|
private pendingWrite;
|
|
62
62
|
private touched;
|
|
63
|
-
readonly resolvedId: string;
|
|
64
|
-
private readonly platformId;
|
|
65
63
|
private allowDropdownWasTrue;
|
|
66
64
|
private suppressEvents;
|
|
65
|
+
readonly resolvedId: string;
|
|
66
|
+
private readonly platformId;
|
|
67
67
|
constructor(zone: NgZone, tel: NgxsmkTelInputService);
|
|
68
68
|
ngAfterViewInit(): void;
|
|
69
69
|
private initAndWire;
|
|
@@ -73,7 +73,6 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
73
73
|
registerOnChange(fn: any): void;
|
|
74
74
|
registerOnTouched(fn: any): void;
|
|
75
75
|
setDisabledState(isDisabled: boolean): void;
|
|
76
|
-
private applyDisabledUi;
|
|
77
76
|
validate(_: AbstractControl): ValidationErrors | null;
|
|
78
77
|
registerOnValidatorChange(fn: () => void): void;
|
|
79
78
|
focus(): void;
|
|
@@ -82,22 +81,24 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
82
81
|
private initIntlTelInput;
|
|
83
82
|
private reinitPlugin;
|
|
84
83
|
private destroyPlugin;
|
|
85
|
-
private sanitizeDigits;
|
|
86
|
-
/** Remove a single trunk '0' when that makes the number valid.
|
|
87
|
-
* Works for: "+<cc>0..." and "0..." (national), but only if the stripped form parses valid.
|
|
88
|
-
*/
|
|
89
|
-
private stripTrunkZeroIfNeeded;
|
|
90
84
|
private bindDomListeners;
|
|
91
85
|
onBlur(): void;
|
|
92
86
|
onFocus(): void;
|
|
93
87
|
private handleInput;
|
|
94
|
-
|
|
88
|
+
/** Format NATIONAL number (with spaces) using libphonenumber rules. Accepts digits only. */
|
|
89
|
+
private formatNational;
|
|
90
|
+
/** Convert any string to NSN (digits only). */
|
|
91
|
+
private toNSN;
|
|
92
|
+
/** Remove one trunk '0' after +<dial> or at national start, only if it makes a valid number */
|
|
93
|
+
private stripTrunkZeroIfNeeded;
|
|
95
94
|
currentRaw(): string;
|
|
96
95
|
private currentIso2;
|
|
97
96
|
private setInputValue;
|
|
98
97
|
get showError(): boolean;
|
|
99
98
|
private isCurrentlyValid;
|
|
99
|
+
/** Make flag/dropdown non-interactive when disabled */
|
|
100
|
+
private applyDisabledUi;
|
|
100
101
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkTelInputComponent, never>;
|
|
101
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkTelInputComponent, "ngxsmk-tel-input", never, { "initialCountry": { "alias": "initialCountry"; "required": false; }; "preferredCountries": { "alias": "preferredCountries"; "required": false; }; "onlyCountries": { "alias": "onlyCountries"; "required": false; }; "
|
|
102
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkTelInputComponent, "ngxsmk-tel-input", never, { "initialCountry": { "alias": "initialCountry"; "required": false; }; "preferredCountries": { "alias": "preferredCountries"; "required": false; }; "onlyCountries": { "alias": "onlyCountries"; "required": false; }; "separateDialCode": { "alias": "separateDialCode"; "required": false; }; "allowDropdown": { "alias": "allowDropdown"; "required": false; }; "nationalDisplay": { "alias": "nationalDisplay"; "required": false; }; "formatWhenValid": { "alias": "formatWhenValid"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "name": { "alias": "name"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "label": { "alias": "label"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "errorText": { "alias": "errorText"; "required": false; }; "size": { "alias": "size"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; }; "showErrorWhenTouched": { "alias": "showErrorWhenTouched"; "required": false; }; "dropdownAttachToBody": { "alias": "dropdownAttachToBody"; "required": false; }; "dropdownZIndex": { "alias": "dropdownZIndex"; "required": false; }; "i18n": { "alias": "i18n"; "required": false; }; "telI18n": { "alias": "telI18n"; "required": false; }; "localizedCountries": { "alias": "localizedCountries"; "required": false; }; "telLocalizedCountries": { "alias": "telLocalizedCountries"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "dir": { "alias": "dir"; "required": false; }; "autoPlaceholder": { "alias": "autoPlaceholder"; "required": false; }; "utilsScript": { "alias": "utilsScript"; "required": false; }; "customPlaceholder": { "alias": "customPlaceholder"; "required": false; }; "digitsOnly": { "alias": "digitsOnly"; "required": false; }; "lockWhenValid": { "alias": "lockWhenValid"; "required": false; }; }, { "countryChange": "countryChange"; "validityChange": "validityChange"; "inputChange": "inputChange"; }, never, never, true, never>;
|
|
102
103
|
}
|
|
103
104
|
//# sourceMappingURL=ngxsmk-tel-input.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-tel-input.component.d.ts","sourceRoot":"","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,UAAU,EACV,YAAY,EAIZ,MAAM,EACN,SAAS,EACT,SAAS,EAGT,aAAa,EAEd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,oBAAoB,EAGpB,gBAAgB,EAChB,SAAS,EACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"ngxsmk-tel-input.component.d.ts","sourceRoot":"","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED