ngxsmk-tel-input
Version:
Angular international telephone input (intl-tel-input UI + libphonenumber-js validation). ControlValueAccessor. SSR-safe.
1 lines • 212 kB
Source Map (JSON)
{"version":3,"file":"ngxsmk-tel-input.mjs","sources":["../../../projects/ngxsmk-tel-input/src/lib/signals.ts","../../../projects/ngxsmk-tel-input/src/lib/phone-intelligence.service.ts","../../../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/lib/theme.service.ts","../../../projects/ngxsmk-tel-input/src/lib/phone-input.utils.ts","../../../projects/ngxsmk-tel-input/src/lib/themes/material.theme.ts","../../../projects/ngxsmk-tel-input/src/lib/themes/primeng.theme.ts","../../../projects/ngxsmk-tel-input/src/lib/testing/mock-phone-service.ts","../../../projects/ngxsmk-tel-input/src/lib/testing/test-fixtures.ts","../../../projects/ngxsmk-tel-input/src/lib/testing/e2e-helpers.ts","../../../projects/ngxsmk-tel-input/src/lib/testing/testing.module.ts","../../../projects/ngxsmk-tel-input/src/lib/integrations/verification.service.ts","../../../projects/ngxsmk-tel-input/src/lib/integrations/twilio.service.ts","../../../projects/ngxsmk-tel-input/src/lib/integrations/vonage.service.ts","../../../projects/ngxsmk-tel-input/src/lib/integrations/aws-sns.service.ts","../../../projects/ngxsmk-tel-input/src/lib/types-enhanced.ts","../../../projects/ngxsmk-tel-input/src/ngxsmk-tel-input.ts"],"sourcesContent":["/**\r\n * Signal-based API utilities for ngxsmk-tel-input.\r\n * Provides reactive signal-based interfaces for modern Angular applications.\r\n */\r\n\r\nimport { signal, computed, Signal, WritableSignal } from '@angular/core';\r\nimport { CountryCode } from 'libphonenumber-js';\r\nimport { ParseResult } from './ngxsmk-tel-input.service';\r\n\r\n/**\r\n * Signal-based state interface for phone input component.\r\n */\r\nexport interface PhoneInputState {\r\n /** Raw input value as displayed */\r\n raw: string;\r\n /** E.164 formatted phone number or null if invalid */\r\n e164: string | null;\r\n /** Current country ISO2 code */\r\n iso2: CountryCode;\r\n /** Whether the phone number is valid */\r\n isValid: boolean;\r\n /** Whether the input has been touched */\r\n touched: boolean;\r\n /** Current validation errors */\r\n errors: Record<string, boolean> | null;\r\n}\r\n\r\n/**\r\n * Creates a default phone input state signal.\r\n */\r\nexport function createPhoneInputState(): WritableSignal<PhoneInputState> {\r\n return signal<PhoneInputState>({\r\n raw: '',\r\n e164: null,\r\n iso2: 'US' as CountryCode,\r\n isValid: false,\r\n touched: false,\r\n errors: null\r\n });\r\n}\r\n\r\n/**\r\n * Computed signal for formatted phone number display.\r\n */\r\nexport function createFormattedValueSignal(\r\n state: Signal<PhoneInputState>,\r\n nationalDisplay: Signal<'formatted' | 'digits'>\r\n): Signal<string> {\r\n return computed(() => {\r\n const current = state();\r\n if (!current.raw) return '';\r\n \r\n if (nationalDisplay() === 'formatted' && current.e164) {\r\n // Return formatted national format\r\n return current.raw;\r\n }\r\n \r\n return current.raw;\r\n });\r\n}\r\n\r\n/**\r\n * Computed signal for validation status.\r\n */\r\nexport function createValidationStatusSignal(\r\n state: Signal<PhoneInputState>\r\n): Signal<{\r\n isValid: boolean;\r\n isInvalid: boolean;\r\n hasErrors: boolean;\r\n errorKeys: string[];\r\n}> {\r\n return computed(() => {\r\n const current = state();\r\n const errors = current.errors || {};\r\n const errorKeys = Object.keys(errors);\r\n \r\n return {\r\n isValid: current.isValid,\r\n isInvalid: !current.isValid && current.touched,\r\n hasErrors: errorKeys.length > 0,\r\n errorKeys\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Computed signal for phone number metadata.\r\n */\r\nexport function createPhoneMetadataSignal(\r\n state: Signal<PhoneInputState>\r\n): Signal<{\r\n countryCode: string;\r\n dialCode: string | null;\r\n nationalNumber: string | null;\r\n internationalFormat: string | null;\r\n}> {\r\n return computed(() => {\r\n const current = state();\r\n \r\n if (!current.e164) {\r\n return {\r\n countryCode: current.iso2,\r\n dialCode: null,\r\n nationalNumber: null,\r\n internationalFormat: null\r\n };\r\n }\r\n \r\n // Extract dial code from E.164\r\n const dialCodeMatch = current.e164.match(/^\\+\\d{1,3}/);\r\n const dialCode = dialCodeMatch ? dialCodeMatch[0].slice(1) : null;\r\n \r\n return {\r\n countryCode: current.iso2,\r\n dialCode,\r\n nationalNumber: current.raw,\r\n internationalFormat: current.e164\r\n };\r\n });\r\n}\r\n\r\n","/**\r\n * Phone intelligence service for advanced features\r\n * Provides carrier detection, number type detection, and smart formatting\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { CountryCode, getNumberType, NumberType, parsePhoneNumberFromString } from 'libphonenumber-js';\r\n\r\nexport interface CarrierInfo {\r\n country: CountryCode;\r\n carrier?: string;\r\n type: NumberType | 'UNKNOWN';\r\n isMobile: boolean;\r\n isLandline: boolean;\r\n isTollFree: boolean;\r\n isPremiumRate: boolean;\r\n isVoip: boolean;\r\n}\r\n\r\nexport interface FormatSuggestion {\r\n original: string;\r\n suggested: string;\r\n confidence: number;\r\n reason: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PhoneIntelligenceService {\r\n /**\r\n * Detect carrier and number type\r\n */\r\n detectCarrierAndType(phoneNumber: string, country: CountryCode): CarrierInfo | null {\r\n try {\r\n const parsed = parsePhoneNumberFromString(phoneNumber, country);\r\n if (!parsed || !parsed.isValid()) {\r\n return null;\r\n }\r\n\r\n // getNumberType can accept PhoneNumber object directly (it's compatible with ParsedNumber)\r\n // Use type assertion to work around TypeScript type mismatch\r\n const numberType = getNumberType(parsed as any) || 'UNKNOWN';\r\n\r\n return {\r\n country: parsed.country as CountryCode,\r\n type: numberType,\r\n isMobile: numberType === 'MOBILE' || numberType === 'FIXED_LINE_OR_MOBILE',\r\n isLandline: numberType === 'FIXED_LINE' || numberType === 'FIXED_LINE_OR_MOBILE',\r\n isTollFree: numberType === 'TOLL_FREE',\r\n isPremiumRate: numberType === 'PREMIUM_RATE',\r\n isVoip: numberType === 'VOIP'\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get number type description\r\n */\r\n getNumberTypeDescription(type: NumberType | 'UNKNOWN'): string {\r\n const descriptions: Record<string, string> = {\r\n 'MOBILE': 'Mobile phone',\r\n 'FIXED_LINE': 'Landline',\r\n 'FIXED_LINE_OR_MOBILE': 'Mobile or landline',\r\n 'TOLL_FREE': 'Toll-free number',\r\n 'PREMIUM_RATE': 'Premium rate number',\r\n 'VOIP': 'VoIP number',\r\n 'UNKNOWN': 'Unknown type'\r\n };\r\n\r\n return descriptions[type as string] || 'Unknown';\r\n }\r\n\r\n /**\r\n * Suggest format corrections\r\n */\r\n suggestFormatCorrection(input: string, country: CountryCode): FormatSuggestion | null {\r\n if (!input || input.length < 3) {\r\n return null;\r\n }\r\n\r\n const digits = input.replace(/\\D/g, '');\r\n if (digits.length < 3) {\r\n return null;\r\n }\r\n\r\n try {\r\n // Try to parse as-is\r\n let parsed = parsePhoneNumberFromString(input, country);\r\n \r\n if (parsed && parsed.isValid()) {\r\n return null; // Already valid\r\n }\r\n\r\n // Common corrections\r\n const suggestions: FormatSuggestion[] = [];\r\n\r\n // Remove leading zeros\r\n if (digits.startsWith('0') && digits.length > 1) {\r\n const withoutZero = digits.substring(1);\r\n const testParsed = parsePhoneNumberFromString(withoutZero, country);\r\n if (testParsed && testParsed.isValid()) {\r\n suggestions.push({\r\n original: input,\r\n suggested: testParsed.formatNational(),\r\n confidence: 0.8,\r\n reason: 'Removed leading zero'\r\n });\r\n }\r\n }\r\n\r\n // Add country code if missing\r\n if (!input.startsWith('+') && !input.startsWith('00')) {\r\n const withPlus = `+${digits}`;\r\n const testParsed = parsePhoneNumberFromString(withPlus);\r\n if (testParsed && testParsed.isValid()) {\r\n suggestions.push({\r\n original: input,\r\n suggested: testParsed.formatNational(),\r\n confidence: 0.7,\r\n reason: 'Added country code'\r\n });\r\n }\r\n }\r\n\r\n // Fix common formatting issues\r\n const formatted = this.fixCommonFormattingIssues(input, country);\r\n if (formatted && formatted !== input) {\r\n const testParsed = parsePhoneNumberFromString(formatted, country);\r\n if (testParsed && testParsed.isValid()) {\r\n suggestions.push({\r\n original: input,\r\n suggested: testParsed.formatNational(),\r\n confidence: 0.6,\r\n reason: 'Fixed formatting'\r\n });\r\n }\r\n }\r\n\r\n // Return highest confidence suggestion\r\n if (suggestions.length > 0) {\r\n return suggestions.sort((a, b) => b.confidence - a.confidence)[0];\r\n }\r\n\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Fix common formatting issues\r\n */\r\n private fixCommonFormattingIssues(input: string, country: CountryCode): string | null {\r\n let fixed = input;\r\n\r\n // Remove spaces and dashes, keep only digits and +\r\n fixed = fixed.replace(/[^\\d+]/g, '');\r\n\r\n // Remove multiple plus signs\r\n if (fixed.indexOf('+') !== fixed.lastIndexOf('+')) {\r\n fixed = '+' + fixed.replace(/\\+/g, '');\r\n }\r\n\r\n // Remove leading zeros after country code\r\n if (fixed.startsWith('+')) {\r\n const parts = fixed.split('+');\r\n if (parts.length > 1) {\r\n const numberPart = parts[1].replace(/^0+/, '');\r\n fixed = '+' + numberPart;\r\n }\r\n }\r\n\r\n return fixed;\r\n }\r\n\r\n /**\r\n * Get timezone for phone number\r\n */\r\n getTimezone(phoneNumber: string, country: CountryCode): string | null {\r\n try {\r\n const parsed = parsePhoneNumberFromString(phoneNumber, country);\r\n if (!parsed) {\r\n return null;\r\n }\r\n\r\n // Basic timezone mapping (simplified)\r\n const timezoneMap: Record<string, string> = {\r\n 'US': 'America/New_York',\r\n 'GB': 'Europe/London',\r\n 'AU': 'Australia/Sydney',\r\n 'CA': 'America/Toronto',\r\n 'DE': 'Europe/Berlin',\r\n 'FR': 'Europe/Paris',\r\n 'JP': 'Asia/Tokyo',\r\n 'CN': 'Asia/Shanghai',\r\n 'IN': 'Asia/Kolkata',\r\n 'BR': 'America/Sao_Paulo',\r\n 'MX': 'America/Mexico_City',\r\n 'RU': 'Europe/Moscow'\r\n };\r\n\r\n return timezoneMap[parsed.country || country] || null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if number is likely spam (basic heuristic)\r\n */\r\n isLikelySpam(phoneNumber: string, country: CountryCode): boolean {\r\n try {\r\n const parsed = parsePhoneNumberFromString(phoneNumber, country);\r\n if (!parsed) {\r\n return false;\r\n }\r\n\r\n const nationalNumber = parsed.nationalNumber;\r\n\r\n // Check for suspicious patterns\r\n const suspiciousPatterns = [\r\n /^(\\d)\\1{6,}$/, // Same digit repeated 7+ times\r\n /^123456789/, // Sequential\r\n /^987654321/, // Reverse sequential\r\n /^0000000/, // All zeros\r\n ];\r\n\r\n return suspiciousPatterns.some(pattern => pattern.test(nationalNumber));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\n\r\n/**\r\n * Result of phone number parsing.\r\n */\r\nexport interface ParseResult {\r\n /** E.164 formatted phone number (e.g., +14155550123) or null if invalid */\r\n e164: string | null;\r\n /** National format phone number or null if invalid */\r\n national: string | null;\r\n /** Whether the phone number is valid */\r\n isValid: boolean;\r\n}\r\n\r\n/**\r\n * Enhanced parse result with invalid country code detection.\r\n */\r\nexport interface ParseWithInvalidResult extends ParseResult {\r\n /** Whether the input appears to be an invalid international number */\r\n isInvalidInternational: boolean;\r\n}\r\n\r\n/**\r\n * Service for parsing and validating phone numbers using libphonenumber-js.\r\n * Provides caching for improved performance and enhanced validation features.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(private telService: NgxsmkTelInputService) {}\r\n * \r\n * validatePhone(input: string, country: CountryCode) {\r\n * const result = this.telService.parse(input, country);\r\n * return result.isValid;\r\n * }\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxsmkTelInputService {\r\n private parseCache = new Map<string, ParseResult>();\r\n private parseWithInvalidCache = new Map<string, ParseWithInvalidResult>();\r\n private validationCache = new Map<string, boolean>();\r\n private readonly CACHE_SIZE_LIMIT = 1000;\r\n\r\n /**\r\n * Parses a phone number string and returns formatted results.\r\n * Results are cached for performance.\r\n * \r\n * @param input - The phone number string to parse (can include formatting)\r\n * @param iso2 - ISO 3166-1 alpha-2 country code (e.g., 'US', 'GB')\r\n * @returns ParseResult with E.164 format, national format, and validity status\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = service.parse('202-555-1234', 'US');\r\n * // result.e164 = '+12025551234'\r\n * // result.national = '(202) 555-1234'\r\n * // result.isValid = true\r\n * ```\r\n */\r\n parse(input: string, iso2: CountryCode): ParseResult {\r\n const cacheKey = `${input || ''}|${iso2}`;\r\n \r\n if (this.parseCache.has(cacheKey)) {\r\n return this.parseCache.get(cacheKey)!;\r\n }\r\n\r\n try {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n if (!phone) {\r\n const result = { e164: null, national: null, isValid: false };\r\n this.setCacheValue(this.parseCache, cacheKey, result);\r\n return result;\r\n }\r\n \r\n const isValid = phone.isValid();\r\n const result = { \r\n e164: isValid ? phone.number : null, \r\n national: phone.formatNational(), \r\n isValid \r\n };\r\n \r\n this.setCacheValue(this.parseCache, cacheKey, result);\r\n return result;\r\n } catch {\r\n const result = { e164: null, national: null, isValid: false };\r\n this.setCacheValue(this.parseCache, cacheKey, result);\r\n return result;\r\n }\r\n }\r\n\r\n /**\r\n * Validates whether a phone number string is valid for the given country.\r\n * Results are cached for performance.\r\n * \r\n * @param input - The phone number string to validate\r\n * @param iso2 - ISO 3166-1 alpha-2 country code\r\n * @returns true if the phone number is valid, false otherwise\r\n * \r\n * @example\r\n * ```typescript\r\n * const isValid = service.isValid('202-555-1234', 'US'); // true\r\n * const isInvalid = service.isValid('123', 'US'); // false\r\n * ```\r\n */\r\n isValid(input: string, iso2: CountryCode): boolean {\r\n const cacheKey = `${input || ''}|${iso2}`;\r\n \r\n if (this.validationCache.has(cacheKey)) {\r\n return this.validationCache.get(cacheKey)!;\r\n }\r\n\r\n try {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n const result = !!phone && phone.isValid();\r\n \r\n this.setCacheValue(this.validationCache, cacheKey, result);\r\n return result;\r\n } catch {\r\n this.setCacheValue(this.validationCache, cacheKey, false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a value in the cache, implementing LRU eviction when cache is full.\r\n * @param cache - The cache Map to update\r\n * @param key - The cache key\r\n * @param value - The value to cache\r\n */\r\n private setCacheValue<T>(cache: Map<string, T>, key: string, value: T): void {\r\n if (cache.size >= this.CACHE_SIZE_LIMIT) {\r\n const firstKey = cache.keys().next().value;\r\n if (firstKey) cache.delete(firstKey);\r\n }\r\n cache.set(key, value);\r\n }\r\n\r\n /**\r\n * Clears all caches. Useful for memory management or testing.\r\n */\r\n clearCache(): void {\r\n this.parseCache.clear();\r\n this.parseWithInvalidCache.clear();\r\n this.validationCache.clear();\r\n }\r\n\r\n /**\r\n * Checks if the input appears to be an international number with an invalid country code.\r\n * This helps detect cases like \"1123456789\" where \"11\" is not a valid country code.\r\n * \r\n * @param input - The phone number string to check\r\n * @returns true if the input appears to be an invalid international number\r\n * @private\r\n */\r\n private isInvalidInternationalNumber(input: string): boolean {\r\n if (!input || input.length < 3) return false;\r\n \r\n const digits = input.replace(/\\D/g, '');\r\n if (digits.length < 3) return false;\r\n \r\n for (let i = 1; i <= 3 && i <= digits.length; i++) {\r\n const potentialCountryCode = digits.substring(0, i);\r\n const remainingDigits = digits.substring(i);\r\n \r\n if (remainingDigits.length >= 3) {\r\n try {\r\n const internationalNumber = `+${potentialCountryCode}${remainingDigits}`;\r\n const phone = parsePhoneNumberFromString(internationalNumber);\r\n \r\n if (!phone) {\r\n if (input.startsWith('+') || (potentialCountryCode.length >= 1 && potentialCountryCode.length <= 3)) {\r\n return true;\r\n }\r\n }\r\n } catch {\r\n return true;\r\n }\r\n }\r\n }\r\n \r\n return false;\r\n }\r\n\r\n /**\r\n * Enhanced parse method that detects invalid international numbers.\r\n * This is useful for providing better error messages to users.\r\n * Results are cached for performance.\r\n * \r\n * @param input - The phone number string to parse\r\n * @param iso2 - ISO 3166-1 alpha-2 country code\r\n * @returns ParseWithInvalidResult with additional invalid country code detection\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = service.parseWithInvalidDetection('1123456789', 'US');\r\n * // result.isInvalidInternational = true (because \"11\" is not a valid country code)\r\n * // result.isValid = false\r\n * ```\r\n */\r\n parseWithInvalidDetection(input: string, iso2: CountryCode): ParseWithInvalidResult {\r\n const cacheKey = `${input || ''}|${iso2}`;\r\n \r\n if (this.parseWithInvalidCache.has(cacheKey)) {\r\n return this.parseWithInvalidCache.get(cacheKey)!;\r\n }\r\n\r\n try {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n const isInvalidInternational = this.isInvalidInternationalNumber(input);\r\n \r\n if (!phone) {\r\n const result = { \r\n e164: null, \r\n national: null, \r\n isValid: false,\r\n isInvalidInternational \r\n };\r\n this.setCacheValue(this.parseWithInvalidCache, cacheKey, result);\r\n return result;\r\n }\r\n \r\n const isValid = phone.isValid();\r\n const result = { \r\n e164: isValid ? phone.number : null, \r\n national: phone.formatNational(), \r\n isValid,\r\n isInvalidInternational \r\n };\r\n \r\n this.setCacheValue(this.parseWithInvalidCache, cacheKey, result);\r\n return result;\r\n } catch {\r\n const isInvalidInternational = this.isInvalidInternationalNumber(input);\r\n const result = { \r\n e164: null, \r\n national: null, \r\n isValid: false,\r\n isInvalidInternational \r\n };\r\n this.setCacheValue(this.parseWithInvalidCache, cacheKey, result);\r\n return result;\r\n }\r\n }\r\n}\r\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Optional,\n Output,\n PLATFORM_ID,\n SimpleChanges,\n ViewChild,\n ChangeDetectionStrategy,\n signal,\n computed,\n output,\n input,\n Signal,\n WritableSignal,\n effect,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\nimport { AsYouType, CountryCode, validatePhoneNumberLength } from 'libphonenumber-js';\nimport { NgxsmkTelInputService, ParseResult, ParseWithInvalidResult } from './ngxsmk-tel-input.service';\nimport { CountryMap, IntlTelI18n } from './types';\nimport { createPhoneInputState, createFormattedValueSignal, createValidationStatusSignal, createPhoneMetadataSignal, PhoneInputState } from './signals';\nimport { PhoneIntelligenceService, CarrierInfo, FormatSuggestion } from './phone-intelligence.service';\n\n/**\n * Interface for custom theme colors.\n */\nexport interface ColorPalette {\n background?: string;\n foreground?: string;\n border?: string;\n borderHover?: string;\n ring?: string;\n placeholder?: string;\n}\n\n/**\n * Type definition for intl-tel-input instance.\n * Matches the actual implementation of the Iti class.\n */\ntype IntlTelInstance = {\n destroy(): void;\n setNumber(aNumber: string): void;\n setCountry(countryCode: string): void;\n getSelectedCountryData(): { iso2?: string; dialCode?: string };\n promise?: Promise<unknown>;\n};\n\n/**\n * Type for intl-tel-input configuration options.\n */\ninterface IntlTelInputConfig {\n initialCountry: string;\n preferredCountries: string[];\n onlyCountries?: string[];\n nationalMode: boolean;\n allowDropdown: boolean;\n separateDialCode: boolean;\n geoIpLookup: (callback: (iso2: string) => void) => void;\n autoPlaceholder: 'off' | 'polite' | 'aggressive';\n utilsScript?: string;\n customPlaceholder?: (example: string, country: unknown) => string;\n i18n?: IntlTelI18n;\n localizedCountries?: Record<string, string>;\n dropdownContainer?: HTMLElement;\n}\n\n/**\n * Type for clipboard event with data property.\n */\ninterface ClipboardEventWithData extends ClipboardEvent {\n clipboardData: DataTransfer | null;\n}\n\n/**\n * Type for beforeinput event with data and inputType properties.\n */\ninterface BeforeInputEvent extends Event {\n data: string | null;\n inputType: string;\n}\n\n/**\n * Angular telephone input component with country dropdown, flags, and robust validation/formatting.\n * Wraps intl-tel-input for the UI and libphonenumber-js for parsing/validation.\n * Implements ControlValueAccessor for seamless integration with Angular Forms.\n * \n * **Compatibility**: Works with Angular 17+ and supports both:\n * - Zone.js (traditional Angular change detection)\n * - Zoneless Angular (Angular 18+ without Zone.js)\n * - All data binding types (property, event, two-way)\n * - Reactive Forms and Template-driven Forms\n * - Signals (Angular 16+)\n * \n * **Mobile Responsive**: Fully optimized for mobile devices with:\n * - Touch-friendly tap targets (44x44px minimum)\n * - Prevents iOS zoom (16px font size)\n * - Responsive dropdown that adapts to viewport\n * - Safe area insets support for notched devices\n * - Optimized touch interactions\n * \n * @example\n * ```html\n * <ngxsmk-tel-input\n * formControlName=\"phone\"\n * label=\"Phone Number\"\n * [initialCountry]=\"'US'\"\n * [preferredCountries]=\"['US','GB']\">\n * </ngxsmk-tel-input>\n * ```\n */\n@Component({\n selector: 'ngxsmk-tel-input',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ngxsmk-tel\"\n [class.disabled]=\"disabledSignal() || disabled\"\n [attr.data-size]=\"sizeSignal() || size\"\n [attr.data-variant]=\"variantSignal() || variant\"\n [attr.dir]=\"dir\"\n [attr.aria-label]=\"label || 'Phone number input'\">\n @if (label) {\n <label class=\"ngxsmk-tel__label\" [for]=\"resolvedId\">{{ label }}</label>\n }\n\n <div class=\"ngxsmk-tel__wrap\" \n [class.has-error]=\"showError()\"\n [attr.aria-describedby]=\"getAriaDescribedBy()\">\n <div class=\"ngxsmk-tel-input__wrapper\">\n <input\n #telInput\n type=\"tel\"\n class=\"ngxsmk-tel-input__control\"\n [id]=\"resolvedId\"\n [attr.name]=\"name || null\"\n [attr.placeholder]=\"placeholder || null\"\n [attr.autocomplete]=\"autocomplete\"\n [attr.inputmode]=\"digitsOnly ? 'numeric' : 'tel'\"\n [disabled]=\"disabledSignal() || disabled\"\n [attr.aria-invalid]=\"showError() ? 'true' : 'false'\"\n [attr.aria-required]=\"isRequired ? 'true' : null\"\n [attr.aria-describedby]=\"getAriaDescribedBy()\"\n [attr.aria-errormessage]=\"showError() && errorText ? resolvedId + '-error' : null\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n />\n </div>\n\n @if (showClear && (rawValue() || currentRaw())) {\n <button type=\"button\"\n class=\"ngxsmk-tel__clear\"\n (click)=\"clearInput()\"\n [attr.aria-label]=\"clearAriaLabel\"\n [attr.aria-describedby]=\"resolvedId\">\n ×\n </button>\n }\n </div>\n\n @if (hint && !showError()) {\n <div class=\"ngxsmk-tel__hint\" [id]=\"resolvedId + '-hint'\">{{ hint }}</div>\n }\n @if (showError() && errorText) {\n <div class=\"ngxsmk-tel__error\" \n [id]=\"resolvedId + '-error'\"\n role=\"alert\"\n [attr.aria-live]=\"'polite'\">{{ errorText }}</div>\n }\n <div [id]=\"resolvedId + '-status'\" \n class=\"sr-only\" \n role=\"status\" \n [attr.aria-live]=\"'polite'\"\n [attr.aria-atomic]=\"true\">{{ getAriaStatusMessage() }}</div>\n </div>\n `,\n styleUrls: ['./ngxsmk-tel-input.component.scss'],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }\n ]\n})\nexport class NgxsmkTelInputComponent implements AfterViewInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\n @ViewChild('telInput', { static: true }) inputRef!: ElementRef<HTMLInputElement>;\n\n // ========== Signal-based API (Angular 17+) ==========\n\n /** Signal-based input: Initial country to select. Use 'auto' for geo-location detection. */\n initialCountrySignal = input<CountryCode | 'auto'>('US');\n\n /** Signal-based input: Countries to show at the top of the dropdown list. */\n preferredCountriesSignal = input<CountryCode[]>(['US', 'GB']);\n\n /** Signal-based input: Restrict selectable countries to this list. */\n onlyCountriesSignal = input<CountryCode[] | undefined>(undefined);\n\n /** Signal-based input: When true, shows dial code outside the input field. */\n separateDialCodeSignal = input<boolean>(true);\n\n /** Signal-based input: Enable or disable the country dropdown. */\n allowDropdownSignal = input<boolean>(true);\n\n /** Signal-based input: Display format - 'formatted' => national with spaces; 'digits' => digits only */\n nationalDisplaySignal = input<'formatted' | 'digits'>('formatted');\n\n /** Signal-based input: Format timing - 'typing' (live), 'blur', or 'off' */\n formatWhenValidSignal = input<'off' | 'blur' | 'typing'>('typing');\n\n /** Signal-based input: Size variant */\n sizeSignal = input<'sm' | 'md' | 'lg'>('md');\n\n /** Signal-based input: Style variant */\n variantSignal = input<'outline' | 'filled' | 'underline'>('outline');\n\n /** Signal-based input: Theme preference */\n themeSignal = input<'light' | 'dark' | 'auto'>('auto');\n\n /** Signal-based input: Disabled state */\n disabledSignal = input<boolean>(false);\n\n /** Signal-based output: Emitted when country selection changes */\n countryChangeSignal = output<{ iso2: CountryCode }>();\n\n /** Signal-based output: Emitted when validity changes */\n validityChangeSignal = output<boolean>();\n\n /** Signal-based output: Emitted on every input change */\n inputChangeSignal = output<{ raw: string; e164: string | null; iso2: CountryCode }>();\n\n /** Internal state signal for reactive state management */\n private stateSignal: WritableSignal<PhoneInputState> = createPhoneInputState();\n\n /** Computed signal: Current phone input state */\n readonly state = this.stateSignal.asReadonly();\n\n /** Computed signal: Formatted display value */\n readonly formattedValue = createFormattedValueSignal(this.stateSignal, this.nationalDisplaySignal);\n\n /** Computed signal: Validation status */\n readonly validationStatus = createValidationStatusSignal(this.stateSignal);\n\n /** Computed signal: Phone number metadata */\n readonly phoneMetadata = createPhoneMetadataSignal(this.stateSignal);\n\n /** Computed signal: Whether the input is valid */\n readonly isValid = computed(() => this.stateSignal().isValid);\n\n /** Computed signal: Whether the input has errors */\n readonly hasErrors = computed(() => {\n const errors = this.stateSignal().errors;\n return errors !== null && Object.keys(errors).length > 0;\n });\n\n /** Computed signal: Whether to show error message */\n readonly showError = computed(() => {\n if (this.isDestroyed) return false;\n const state = this.stateSignal();\n const hasErrors = state.errors !== null && Object.keys(state.errors).length > 0;\n return this.showErrorWhenTouched ? (state.touched && hasErrors) : hasErrors;\n });\n\n /** Computed signal: Current E.164 value */\n readonly e164Value = computed(() => this.stateSignal().e164);\n\n /** Computed signal: Current raw input value */\n readonly rawValue = computed(() => this.stateSignal().raw);\n\n /** Computed signal: Current country ISO2 code */\n readonly currentCountry = computed(() => this.stateSignal().iso2);\n\n // ========== Traditional @Input/@Output API (backward compatibility) ==========\n\n /** Initial country to select. Use 'auto' for geo-location detection (defaults to 'US'). */\n @Input() initialCountry: CountryCode | 'auto' = 'US';\n /** Countries to show at the top of the dropdown list. */\n @Input() preferredCountries: CountryCode[] = ['US', 'GB'];\n /** Restrict selectable countries to this list. If not provided, all countries are available. */\n @Input() onlyCountries?: CountryCode[];\n /** When true, shows dial code outside the input field (after the flag). */\n @Input() separateDialCode: boolean = true;\n /** Enable or disable the country dropdown. */\n @Input() allowDropdown: boolean = true;\n\n /** 'formatted' => national with spaces; 'digits' => digits only */\n @Input() nationalDisplay: 'formatted' | 'digits' = 'formatted';\n /** 'typing' (live), 'blur', or 'off' */\n @Input() formatWhenValid: 'off' | 'blur' | 'typing' = 'typing';\n\n @Input() placeholder?: string;\n @Input() autocomplete = 'tel';\n @Input() name?: string;\n @Input() inputId?: string;\n @Input() disabled: boolean = false;\n\n @Input() label?: string;\n @Input() hint?: string;\n @Input() errorText?: string;\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() variant: 'outline' | 'filled' | 'underline' = 'outline';\n @Input() showClear = true;\n @Input() autoFocus = false;\n @Input() selectOnFocus = false;\n @Input() showErrorWhenTouched = true;\n\n @Input() dropdownAttachToBody = true;\n @Input() dropdownZIndex = 2000;\n\n @Input('i18n') i18n?: IntlTelI18n;\n @Input('telI18n') set telI18n(v: IntlTelI18n | undefined) { this.i18n = v; }\n @Input('localizedCountries') localizedCountries?: CountryMap;\n @Input('telLocalizedCountries') set telLocalizedCountries(v: CountryMap | undefined) { this.localizedCountries = v; }\n\n @Input() clearAriaLabel = 'Clear phone number';\n @Input() dir: 'ltr' | 'rtl' = 'ltr';\n\n @Input() autoPlaceholder: 'off' | 'polite' | 'aggressive' = 'off';\n @Input() utilsScript?: string;\n @Input() customPlaceholder?: (example: string, country: unknown) => string;\n\n @Input() digitsOnly = true;\n @Input() lockWhenValid = true;\n\n @Input() theme: 'light' | 'dark' | 'auto' = 'auto';\n\n /**\n * Custom colors for fine-grained theme control.\n */\n @Input() customColors?: {\n light?: ColorPalette;\n dark?: ColorPalette;\n };\n\n /** Enable carrier and number type detection */\n @Input() enableIntelligence = false;\n\n /** Enable format suggestions */\n @Input() enableFormatSuggestions = false;\n\n @Output() countryChange = new EventEmitter<{ iso2: CountryCode }>();\n @Output() validityChange = new EventEmitter<boolean>();\n @Output() inputChange = new EventEmitter<{ raw: string; e164: string | null; iso2: CountryCode }>();\n @Output() intelligenceChange = new EventEmitter<CarrierInfo | null>();\n @Output() formatSuggestion = new EventEmitter<FormatSuggestion | null>();\n\n private iti: IntlTelInstance | null = null;\n private onChange: (val: string | null) => void = () => { };\n private onTouchedCb: () => void = () => { };\n private validatorChange?: () => void;\n private lastEmittedValid = false;\n private pendingWrite: string | null = null;\n private touched = false;\n private isDestroyed = false;\n private eventListeners: Array<{ element: HTMLElement; event: string; handler: (event: Event) => void }> = [];\n private searchInputCleanupFunctions: Array<() => void> = [];\n\n private allowDropdownWasTrue = false;\n private suppressEvents = false;\n private themeObserver: MutationObserver | null = null;\n private globalThemeObserver: MutationObserver | null = null;\n\n readonly resolvedId: string = this.inputId || ('tel-' + Math.random().toString(36).slice(2));\n private readonly platformId = inject(PLATFORM_ID);\n private currentTheme: 'light' | 'dark' = 'light';\n private lastThemeConfig: 'light' | 'dark' | 'auto' | null = null;\n\n isRequired = false;\n\n private readonly intelligence: PhoneIntelligenceService | null = inject(PhoneIntelligenceService, { optional: true });\n\n private readonly hostElementRef = inject(ElementRef);\n\n constructor(\n @Optional() private readonly zone: NgZone | null,\n private readonly tel: NgxsmkTelInputService,\n private readonly cdr: ChangeDetectorRef\n ) {\n // Watch for theme signal changes\n effect(() => {\n if (!isPlatformBrowser(this.platformId) || this.isDestroyed) return;\n // Check both signal and traditional input\n const theme = this.themeSignal() || this.theme;\n if (theme !== undefined && theme !== this.lastThemeConfig) {\n this.lastThemeConfig = theme;\n // Apply theme immediately (works even before plugin is initialized)\n this.detectAndApplyTheme();\n }\n });\n }\n\n /**\n * Helper method to run code inside Angular zone if available, otherwise just run it.\n * Works with both Zone.js and zoneless Angular.\n */\n private runInZone(fn: () => void): void {\n if (this.zone) {\n this.zone.run(fn);\n } else {\n fn();\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Helper method to run code outside Angular zone if available, otherwise just run it.\n * Works with both Zone.js and zoneless Angular.\n */\n private runOutsideZone(fn: () => void): void {\n if (this.zone) {\n this.zone.runOutsideAngular(fn);\n } else {\n fn();\n }\n }\n\n /**\n * Helper method for requestAnimationFrame with fallback for older browsers.\n */\n private requestAnimationFrame(fn: () => void): void {\n if (typeof window !== 'undefined') {\n const raf = window.requestAnimationFrame ||\n (window as any).webkitRequestAnimationFrame ||\n (window as any).mozRequestAnimationFrame ||\n (window as any).msRequestAnimationFrame ||\n ((callback: () => void) => setTimeout(callback, 16));\n raf(fn);\n } else {\n fn();\n }\n }\n\n /**\n * Determines if dropdown should be attached to body.\n * On mobile screens (<=768px), returns false to show dropdown inline instead of as modal.\n */\n private shouldAttachToBody(): boolean {\n if (!this.dropdownAttachToBody) return false;\n if (typeof window === 'undefined') return false;\n // On mobile, don't attach to body to avoid modal popup behavior\n // Use fallback for older browsers\n const width = window.innerWidth || (window as any).clientWidth || 1024;\n return width > 768;\n }\n\n /**\n * Angular lifecycle hook called after the view is initialized.\n * Initializes the intl-tel-input plugin and sets up event listeners.\n */\n ngAfterViewInit(): void {\n if (!isPlatformBrowser(this.platformId) || this.isDestroyed) return;\n // Ensure theme is applied on initial render\n // Use setTimeout to ensure host element is fully available\n setTimeout(() => {\n if (!this.isDestroyed) {\n this.detectAndApplyTheme();\n }\n }, 0);\n this.setupDropdownThemeObserver();\n this.setupGlobalThemeObserver();\n void this.initAndWire();\n }\n\n private async initAndWire(): Promise<void> {\n if (this.isDestroyed) return;\n\n await this.initIntlTelInput();\n if (this.isDestroyed) return;\n\n this.bindDomListeners();\n\n if (this.pendingWrite !== null && !this.isDestroyed) {\n const v = this.pendingWrite;\n this.pendingWrite = null;\n this.writeValue(v);\n }\n\n if (this.autoFocus && !this.isDestroyed) {\n this.requestAnimationFrame(() => {\n if (!this.isDestroyed) this.focus();\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!isPlatformBrowser(this.platformId) || this.isDestroyed) return;\n\n // Check for signal changes or traditional input changes\n const configChanged = [\n 'initialCountry', 'preferredCountries', 'onlyCountries',\n 'separateDialCode', 'allowDropdown',\n 'i18n', 'localizedCountries', 'dir',\n 'autoPlaceholder', 'utilsScript', 'customPlaceholder'\n ].some(k => k in changes && !changes[k]?.firstChange);\n\n // Also check if any signal inputs have changed (signals trigger change detection automatically)\n if (configChanged && this.iti && !this.isDestroyed) {\n this.reinitPlugin();\n this.validatorChange?.();\n }\n\n // Handle theme changes from traditional @Input\n if ('theme' in changes && !changes['theme'].firstChange) {\n const theme = this.theme;\n if (theme !== this.lastThemeConfig) {\n this.lastThemeConfig = theme;\n this.detectAndApplyTheme();\n // Mark for check to ensure view updates with OnPush\n this.cdr.markForCheck();\n }\n }\n }\n\n ngOnDestroy(): void {\n this.isDestroyed = true;\n this.destroyPlugin();\n this.cleanupEventListeners();\n this.cleanupSearchInputListeners();\n if (this.themeObserver) {\n this.themeObserver.disconnect();\n this.themeObserver = null;\n }\n if (this.globalThemeObserver) {\n this.globalThemeObserver.disconnect();\n this.globalThemeObserver = null;\n }\n }\n\n /**\n * Writes a new value to the form control.\n * Called by Angular Forms when the control value changes programmatically.\n * @param val - The new value (E.164 format string or null)\n */\n writeValue(val: string | null): void {\n if (!this.inputRef || this.isDestroyed) return;\n\n if (!this.iti) {\n this.pendingWrite = val ?? '';\n return;\n }\n\n // Get current state for comparison (will be checked after setNumber with correct country)\n const currentE164 = this.stateSignal().e164;\n\n this.suppressEvents = true;\n try {\n // Call setNumber() FIRST to let intl-tel-input detect and set the correct country\n // This is critical when the incoming value has a different country code\n this.iti.setNumber(val || '');\n\n // Now get the country code AFTER setNumber has potentially changed it\n const iso2 = this.currentIso2();\n\n // Parse with the correct country code\n const parsed = this.tel.parseWithInvalidDetection(val ?? '', iso2);\n const incomingE164 = parsed.e164;\n\n // Avoid unnecessary updates if E.164 value hasn't changed\n if (currentE164 === incomingE164) {\n // Even if E.164 is the same, update if the display value would be different\n // (e.g., user changed format settings or country changed)\n const currentRaw = this.stateSignal().raw;\n const currentIso2 = this.stateSignal().iso2;\n\n // If country changed, we need to update\n if (currentIso2 !== iso2) {\n // Country changed, proceed with update\n } else {\n // Same country, check if display value is different\n const nsn = incomingE164\n ? this.nsnFromE164(incomingE164, iso2)\n : this.stripLeadingZero(this.toNSN(parsed.national ?? (val ?? '')));\n const display = this.displayValue(nsn, iso2);\n if (currentRaw === display) {\n return; // Nothing to update\n }\n }\n }\n\n const nsn = incomingE164\n ? this.nsnFromE164(incomingE164, iso2)\n : this.stripLeadingZero(this.toNSN(parsed.national ?? (val ?? '')));\n\n const display = this.displayValue(nsn, iso2);\n this.setInputValue(display);\n\n // Update state signal without triggering Angular Forms onChange\n // (writeValue is called BY Angular Forms, so we shouldn't notify it back)\n this.stateSignal.update(state => ({\n ...state,\n raw: display,\n e164: incomingE164,\n iso2,\n isValid: parsed.isValid && !parsed.isInvalidInternational,\n errors: (parsed.isValid && !parsed.isInvalidInternational) ? null : (parsed.isInvalidInternational ? { phoneInvalidCountryCode: true, phoneInvalid: false } : { phoneInvalid: true, phoneInvalidCountryCode: false })\n }));\n\n // Emit inputChange for external listeners (but NOT onChange to avoid loop)\n this.runInZone(() => {\n this.inputChange.emit({ raw: display, e164: incomingE164, iso2 });\n this.inputChangeSignal.emit({ raw: display, e164: incomingE164, iso2 });\n });\n // Mark for check to ensure view updates (works in both zone and zoneless)\n this.cdr.markForCheck();\n } finally {\n this.suppressEvents = false;\n }\n }\n\n /**\n * Registers a callback function that is called when the control's value changes.\n * @param fn - Callback function that receives the new value (string | null)\n */\n registerOnChange(fn: (val: string | null) => void): void { this.onChange = fn; }\n\n /**\n * Registers a callback function that is called when the control is touched.\n * @param fn - Callback function to be called on touch\n */\n registerOnTouched(fn: () => void): void { this.onTouchedCb = fn; }\n\n /**\n * Sets the disabled state of the control.\n * Called by Angular Forms when the control's disabled state changes.\n * @param isDisabled - Whether the control should be disabled\n */\n setDisabledState(isDisabled: boolean): void {\n if (this.isDestroyed) return;\n\n this.disabled = isDisabled;\n\n if (this.inputRef) this.inputRef.nativeElement.disabled = isDisabled;\n\n if (this.iti) {\n if (isDisabled && this.allowDropdown) {\n this.allowDropdownWasTrue = true;\n this.allowDropdown = false;\n this.reinitPlugin(); // closes popup & removes handlers\n } else if (!isDisabled && this.allowDropdownWasTrue) {\n this.allowDropdown = true;\n this.allowDropdownWasTrue = false;\n this.reinitPlugin();\n } else {\n this.applyDisabledUi(isDisabled);\n }\n } else {\n this.applyDisabledUi(isDisabled);\n }\n }\n\n /**\n * Validates the phone number input.\n * Returns validation errors if the number is invalid, null if valid.\n * @param _ - The form control (unused, but required by Validator interface)\n * @returns ValidationErrors object with error keys, or null if valid\n */\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.isDestroyed) return null;\n\n // Update isRequired based on control validators\n // Check if control has required validator by testing with null value\n try {\n if (control.validator) {\n const testControl = { value: null } as AbstractControl;\n const errors = control.validator(testControl);\n this.isRequired = !!(errors && errors['required']);\n } else {\n this.isRequired = false;\n }\n } catch (e) {\n // Fallback to not required if validator check fails\n this.isRequired = false;\n }\n\n const raw = this.currentRaw();\n if (!raw) return null;\n\n const parsed = this.tel.parseWithInvalidDetection(raw, this.currentIso2());\n const valid = parsed.isValid && !parsed.isInvalidInternational;\n\n if (valid !== this.lastEmittedValid) {\n this.lastEmittedValid = valid;\n\n // Update state signal\n this.stateSignal.update(state => ({\n ...state,\n isValid: valid,\n errors: valid ? null : (parsed.isInvalidInternational ? { phoneInvalidCountryCode: true, phoneInvalid: false } : { phoneInvalid: true, phoneInvalidCountryCode: false })\n }));\n\n // Emit both traditional and signal-based outputs\n this.validityChange.emit(valid);\n this.validityChangeSignal.emit(valid);\n\n // Mark for check when validity changes\n this.cdr.markForCheck();\n }\n\n if (!valid) {\n if (parsed.isInvalidInternational) {\n return { phoneInvalidCountryCode: true };\n }\n return { phoneInvalid: true };\n }\n\n return null;\n }\n\n /**\n * Registers a callback function that is called when validator inputs change.\n * @param fn - Callback function to be called when validation should be re-run\n */\n registerOnValidatorChange(fn: () => void): void { this.validatorChange = fn; }\n\n /**\n * Programmatically focuses the input field.\n * If selectOnFocus is enabled, also selects all text.\n */\n focus(): void {\n if (this.isDestroyed || !this.inputRef) return;\n\n this.inputRef.nativeElement.focus();\n if (this.selectOnFocus) {\n const el = this.inputRef.nativeElement;\n this.requestAnimationFrame(() => {\n if (!this.isDestroyed) {\n try {\n el.setSelectionRange(0, el.value.length);\n } catch (e) {\n // Fallback for browsers that don't support setSelectionRange\n if (el.select) {\n el.select();\n }\n }\n }\n });\n }\n }\n\n /**\n * Programmatically selects a country.\n * @param iso2 - ISO 3166-1 alpha-2 country code (e.g., 'US', 'GB')\n */\n selectCountry(iso2: CountryCode): void {\n if (this.iti && !this.isDestroyed) {\n this.iti.setCountry(iso2.toLowerCase());\n this.handleInput();\n }\n }\n\n /**\n * Clears the input field and refocuses it.\n */\n clearInput(): void {\n if (this.isDestroyed) return;\n\n this.setInputValue('');\n this.handleInput();\n this.inputRef.nativeElement.focus();\n }\n\n private async initIntlTelInput() {\n if (this.isDestroyed) return;\n\n const [{ default: intlTelInput }] = await Promise.all([import('intl-tel-input')]);\n\n const toLowerKeys = (m?: CountryMap) => {\n if (!m) return undefined;\n const out: Record<string, string> = {};\n for (const k in m) if (Object.prototype.hasOwnProperty.call(m, k)) {\n const v = (m as Record<string, string | undefined>)[k];\n if (v != null) out[k.toLowerCase()] = v;\n }\n return out;\n };\n\n // Use signal values if available, fallback to traditional inputs\n const initialCountry = this.initialCountrySignal() || this.initialCountry;\n const preferredCountries = this.preferredCountriesSignal() || this.preferredCountries;\n const onlyCountries = this.onlyCountriesSignal() ?? this.onlyCountries;\n const allowDropdown = this.allowDropdownSignal() ?? this.allowDropdown;\n const separateDialCode = this.separateDialCodeSignal() ?? this.separateDialCode;\n\n const config: IntlTelInputConfig = {\n initialCountry: initialCountry === 'auto' ? 'auto' : (initialCountry?.toLowerCase() || 'us'),\n preferredCountries: (preferredCountries ?? []).map(c => c.toLowerCase()),\n onlyCountries: (onlyCountries ?? []).map(c => c.toLowerCase()),\n nationalMode: true,\n allowDropdown,\n separateDialCode,\n geoIpLookup: (cb: (iso2: string) => void) => cb('us'),\n\n autoPlaceholder: this.autoPlaceholder,\n utilsScript: this.utilsScript,\n customPlaceholder: this.customPlaceholder,\n\n i18n: this.i18n,\n localizedCountries: toLowerKeys(this.localizedCountries),\n // On mobile, don't attach to body to avoid modal behavior\n dropdownContainer: this.shouldAttachToBody() ? (typeof document !== 'undefined' ? document.body : undefined) : undefined\n };\n\n this.runOutsideZone(() => {\n if (!this.isDestroyed) {\n this.iti = intlTelInput(this.inputRef.nativeElement, config);\n }\n });\n\n if (!this.isDestroyed) {\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\n this.applyDisabledUi(this.disabled);\n }\n }\n\n private async reinitPlugin() {\n if (this.isDestroyed) return;\n\n const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();\n const prevValue = this.currentRaw();\n\n this.destroyPlugin();\n await this.initIntlTelInput();\n this.bindDomListeners();\n\n if (!this.isDestroyed) {\n try {\n this.iti?.setCountry(prevIso2);\n } catch (e) {\n // Ignore errors when setting country (e.g., invalid country code)\n }\n if (prevValue) {\n this.setInputValue(prevValue);\n this.handleInput();\n }\n this.applyDisabledUi(this.disabled);\n }\n }\n\n private destroyPlugin() {\n if (this.iti) {\n this.iti.destroy();\n this.iti = null;\n }\n }\n\n // ---------- Input listeners ----------\n private bindDomListeners() {\n if (this.isDestroyed || !this.inputRef) return;\n\n const el = this.inputRef.nativeElement;\n\n this.runOutsideZone(() => {\n const beforeInputHandler = (ev: Event) => {\n if (this.isDestroyed || !this.digitsOnly) return;\n const inputEvent = ev as BeforeInputEvent;\n const data = inputEvent.data;\n\n if (this.lockWhenValid && this.isCurrentlyValid()) {\n const selStart = el.selectionStart ?? 0;\n const selEnd = el.selectionEnd ?? 0;\n const selCollapsed = selStart === selEnd;\n const isDigit = !!data && inputEvent.inputType === 'insertText' && data >= '0' && data <= '9';\n if (selCollapsed && isDigit) { ev.preventDefault(); return; }\n }\n\n if (!data || inputEvent.inputType !== 'insertText') return;\n const isDigit = data >= '0' && data <= '9';\n if (!isDigit) { ev.preventDefault(); return; }\n\n const start = el.selectionStart ?? el.value.length;\n const end = el.selectionEnd ?? el.value.length;\n const prospective = el.value.slice(0, start) + data + el.value.slice(end);\n const nsn = this.stripLeadingZero(this.toNSN(prospective));\n const iso2 = this.currentIso2();\n\n if (this.wouldExceedMax(nsn, iso2)) {\n ev.preventDefault();\n return;\n }\n };\n\n const pasteHandler = (e: Event) => {\n if (this.isDestroyed) return;\n\n const clipboardEvent = e as ClipboardEventWithData;\n // Support both standard ClipboardEvent and IE11 fallback\n const clipboardData = clipboardEvent.clipboardData ||\n ((window as Window & { clipboardData?: DataTransfer }).clipboardData) ||\n null;\n let text = '';\n if (clipboardData) {\n try {\n text = clipboardData.getData('text') || '';\n } catch (err) {\n // Fallback for browsers without clipboardData support\n text = '';\n }\n }\n e.preventDefault();\n\n const iso2 = this.currentIso2();\n let digits = this.stripLeadingZero(this.toNSN(text));\n\n while (this.wouldExceedMax(digits, iso2)) {\n digits = digits.slice(0, -1);\n if (!digits) break;\n }\n\n const start = el.selectionStart ?? el.value.length;\n const end = el.selectionEnd ?? el.value.length;\n\n // Use setRangeText with fallback for older browsers\n if (el.setRangeText) {\n try {\n el.setRangeText(digits, start, end, 'end');\n } catch (e) {\n // Fallback for browsers without setRangeText support\n el.value = el.value.substring(0, start) + digits + el.value.substring(end);\n }\n } else {\n el.value = el.value.substring(0, start) + digits + el.value.substring(end);\n }\n\n this.requestAnimationFrame(() => {\n if (!this.isDestroyed) this.handleInput();\n });\n };\n\n const inputHandler = () => {\n if (!this.isDestroyed) this.handleInput();\n };\n\n const countryChangeHandler = () => {\n if (this.isDestroyed || this.suppressEvents) return;\n\n const iso2 = this.currentIso2();\n\n // Update state signal\n this.stateSignal.update(state => ({\n ...state,\n iso2\n }));\n\n this.runInZone(() => {\n const changeEvent = { iso2 };\n\n // Emit both traditional and signal-based outputs\n this.countryChange.emit(changeEvent);\n this.countryChangeSignal.emit(changeEvent);\n\n this.validatorChange?.();\n });\n this.handleInput();\n };\n\n const blurHandler = () => {\n if (!this.isDestroyed) this.onBlur();\n };\n\n // Store listeners for cleanup\n this.eventListeners = [\n { element: el, event: 'beforeinput', handler: beforeInputHandler },\n { element: el, event: 'paste', handler: pasteHandler },\n { element: el, event: 'input', handler: inputHandler },\n { element: el, event: 'countrychange', handler: countryChangeHandler },\n { element: el, event: 'blur', handler: blurHandler }\n ];\n\n this.eventListeners.forEach(({ element, event, handler }) => {\n element.addEventListener(event, handler);\n });\n });\n }\n\n onBlur() {\n if (this.isDestroyed) return;\n\n this.touched = true;\n\n // Update state signal\n this.stateSignal.update(state => ({\n ...state,\n touched: true\n }));\n\n this.runInZone(() => {\n this.onTouchedCb();\n // Trigger validation on blur\n this.validatorChange?.();\n });\n // Mark for check to update view with OnPush (works in both zone and zoneless)\n this.cdr.markForCheck();\n\n const formatWhenValidBlur = this.formatWhenValidSignal() || this.formatWhenValid;\n if (formatWhenValidBlur === 'off') return;\n\n const iso2 = this.currentIso2();\n const digits = this.stripLeadingZero(this.toNSN(this.currentRaw()));\n\n const parsed = this.tel.parseWithInvalidDetection(digits, iso2);\n if (!parsed.e164 && !parsed.isValid) return;\n\n const nsn = parsed.e164 ? this.nsnFromE164(parsed.e164, iso2) : digits;\n if (formatWhenValidBlur !== 'typing') {\n this.setInputValue(this.displayValue(nsn, iso2));\n }\n }\n\n onFocus() {\n if (this.isDestroyed || !this.selectOnFocus || !this.inputRef) return;\n\n const el = this.inputRef.nativeElement;\n this.requestAnimationFrame(() => {\n if (!this.isDestroyed) {\n try {\n if (el.setSelectionRange) {\n el.setSelectionRange(0, el.value.length);\n } else if (el.select) {\n // Fallback for browsers that don't support setSelectionRange\n el.select();\n }\n } catch (e) {\n // Ignore errors in older browsers\n }\n }\n });\n }\n\n private handleInput() {\n if (this.suppressEvents || this.isDestroyed) return;\n\n // Cache currentRaw() to avoid multiple DOM reads\n const rawValue = this.currentRaw();\n const iso2 = this.currentIso2();\n const digits = this.stripLeadingZero(this.toNSN(rawValue));\n\n const parsed = this.tel.parseWithInvalidDetection(digits, iso2);\n const isValid = parsed.isValid && !parsed.isInvalidInternational;\n\n // Batch state signal update\n this.stateSignal.update(state => ({\n ...state,\n raw: rawValue,\n e164: parsed.e164,\n iso2,\n isValid,\n errors: isValid ? null : (parsed.isInvalidInternational ? { phoneInvalidCountryCode: true, phoneInvalid: false } : { phoneInvalid: true, phoneInvalidCountryCode: false })\n }));\n\n // Intelligence features\n if (this.enableIntelligence && this.intelligence && parsed.e164) {\n const carrierInfo = this.intelligence.detectCarrierAndType(parsed.e164, iso2);\n if (carrierInfo) {\n this.intelligenceChange.emit(carrierInfo);\n }\n }\n\n // Format suggestions\n if (this.enableFormatSuggestions && this.intelligence && !parsed.isValid) {\n const suggestion = this.intelligence.suggestFormatCorrection(rawValue, iso2);\n if (suggestion) {\n this.formatSuggestion.emit(suggestion);\n }\n }\n\n // Batch zone operations and emissions\n this.runInZone(() => {\n this.onChange(parsed.e164);\n\n const changeEvent = { raw: rawValue, e164: parsed.e164, iso2 };\n\n // Emit both traditional and signal-based outputs\n this.inputChange.emit(changeEvent);\n this.inputChangeSignal.emit(changeEvent);\n\n // Trigger validation when input changes\n this.validatorChange?.();\n });\n // Mark for check to update view with OnPush (works in both zone and zoneless)\n this.cdr.markForCheck();\n\n const nsn = parsed.e164 ? this.nsnFromE164(parsed.e164, iso2) : digits;\n const formatWhenValid = this.formatWhenValidSignal() || this.formatWhenValid;\n const display = formatWhenValid === 'typing' ? this.displayValue(nsn, iso2) : nsn;\n\n if (display !== rawValue) this.setInputValue(display);\n }\n /** Convert any string to digits only (NSN basis). */\n private toNSN(v: string | null | undefined): string {\n return (v ?? '').replace(/\\D/g, '');\n }\n\n /** Strip exactly one leading trunk '0' from national input. */\n private stripLeadingZero(nsn: string): string {\n return nsn.replace(/^0/, '');\n }\n\n /** Current country calling code (e.g. \"44\", \"94\"). */\n private currentDialCode(): string {\n try {\n return (this.iti?.getSelectedCountryData?.()?.dialCode ?? '').toString();\n } catch (e) {\n // Return empty string if country data is unavailable\n return '';\n }\n }\n\n /** Convert E.164 (+<cc><nsn>) to NSN (never includes trunk '0'). */\n private nsnFromE164(e164: string, iso2: CountryCode): string {\n const dial = this.currentDialCode();\n if (!e164 || !dial) return this.toNSN(e164);\n if (e164.startsWith('+' + dial)) return e164.slice(dial.length + 1);\n return this.toNSN(e164);\n }\n\n /** Format NSN for a region (adds spaces but NEVER a trunk '0'). */\n private formatNSN(nsn: string, iso2: CountryCode): string {\n try {\n const fmt = new AsYouType(iso2);\n return fmt.input(nsn);\n } catch (e) {\n // Return unformatted NSN if formatting fails\n return nsn;\n }\n }\n\n /** Compose visible value based on settings. */\n private displayValue(nsn: string, iso2: CountryCode): string {\n const nationalDisplay = this.nationalDisplaySignal() || this.nationalDisplay;\n return nationalDisplay === 'formatted' ? this.formatNSN(nsn, iso2) : nsn;\n }\n\n /**\n * Gets the current raw input value (as displayed, with formatting).\n * @returns The current input value as a string\n */\n currentRaw(): string {\n return this.isDestroyed ? '' : (this.inputRef?.nativeElement.value ?? '').trim();\n }\n\n /**\n * Gets the aria-describedby attribute value for accessibility.\n * @returns Space-separated list of element IDs that describe this input\n */\n getAriaDescribedBy(): string | null {\n const ids: string[] = [];\n const hasError = this.showError();\n if (this.hint && !hasError) {\n ids.push(this.resolvedId + '-hint');\n }\n if (hasError && this.errorText) {\n ids.push(this.resolvedId + '-error');\n }\n ids.push(this.resolvedId + '-status');\n return ids.length > 0 ? ids.join(' ') : null;\n }\n\n /**\n * Gets the ARIA status message for screen readers.\n * @returns Status message describing the current state\n */\n getAriaStatusMessage(): string {\n if (this.isDestroyed) return '';\n const raw = this.currentRaw();\n if (!raw) return '';\n\n const iso2 = this.currentIso2();\n const parsed = this.tel.parseWithInvalidDetection(raw, iso2);\n\n if (parsed.isValid && parsed.e164) {\n return `Valid phone number: ${parsed.e164}`;\n } else if (parsed.isInvalidInternational) {\n return 'Invalid country code';\n } else {\n return 'Invalid phone number';\n }\n }\n\n private currentIso2(): CountryCode {\n if (this.isDestroyed) return 'US';\n\n try {\n const iso2 = (this.iti?.getSelectedCountryData?.()?.iso2 ?? this.initialCountry ?? 'US')\n .toString().toUpperCase();\n return iso2 as CountryCode;\n } catch (e) {\n // Fallback to initial country or default if country data is unavailable\n return (this.initialCountry ?? 'US') as CountryCode;\n }\n }\n\n private setInputValue(v: string) {\n if (!this.isDestroyed && this.inputRef) {\n this.inputRef.nativeElement.value = v ?? '';\n }\n }\n\n\n private isCurrentlyValid(): boolean {\n return this.isDestroyed ? false : this.tel.isValid(this.currentRaw(), this.currentIso2());\n }\n\n /** Make flag/dropdown non-interactive when disabled */\n private applyDisabledUi(disabled: boolean) {\n if (this.isDestroyed) return;\n\n const input = this.inputRef?.nativeElement;\n if (!input) return;\n const flag = input.parentElement?.querySelector('.iti__selected-flag') as HTMLElement | null;\n if (flag) {\n flag.tabIndex = disabled ? -1 : 0;\n flag.setAttribute('aria-disabled', String(disabled));\n }\n }\n\n /** Returns true if nsn would be TOO_LONG for the current country. */\n private wouldExceedMax(nsn: string, iso2: CountryCode): boolean {\n if (this.isDestroyed) return false;\n\n try {\n const res = validatePhoneNumberLength(nsn, iso2);\n return res === 'TOO_LONG';\n } catch (e) {\n // Return false if validation fails (assume not too long)\n return false;\n }\n }\n\n /** Clean up event listeners to prevent memory leaks */\n private cleanupEventListeners(): void {\n this.eventListeners.forEach(({ element, event, handler }) => {\n element.removeEventListener(event, handler);\n });\n this.eventListeners = [];\n }\n\n /** Detect and apply theme based on user preference and system settings */\n private detectAndApplyTheme(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n let detectedTheme: 'light' | 'dark' = 'light';\n\n // Fix precedence: Check signal first, but if it's 'auto' (default), fallback to legacy input\n // This allows [theme]=\"'light'\" to work even if signal defaults to 'auto'\n const signalTheme = this.themeSignal();\n const theme = signalTheme !== 'auto' ? signalTheme : this.theme;\n\n if (theme === 'auto') {\n // Check for matchMedia support (not available in older browsers)\n try {\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\n detectedTheme = 'dark';\n }\n } catch (e) {\n // Fallback for browsers without matchMedia support\n }\n\n // Check for dark class on document element\n if (document.documentElement?.classList?.contains('dark')) {\n detectedTheme = 'dark';\n }\n // Check for data-theme attribute\n else if (document.documentElement?.getAttribute('data-theme') === 'dark') {\n detectedTheme = 'dark';\n }\n } else {\n detectedTheme = theme;\n }\n\n // Always apply theme (even if same) to ensure it's set on the element\n console.log(`[NgxsmkTelInput] Applying theme: ${detectedTheme} (Config: ${theme}, System Dark: ${typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches})`);\n\n this.currentTheme = detectedTheme;\n this.applyTheme(detectedTheme);\n }\n\n /** Apply theme to the component */\n private applyTheme(theme: 'light' | 'dark'): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const hostElement = this.hostElementRef?.nativeElement as HTMLElement;\n if (hostElement) {\n // Set the theme attribute - this is the primary way CSS selects the theme\n hostElement.setAttribute('data-theme', theme);\n\n // Also add/remove dark class for additional CSS selector support\n if (theme === 'dark') {\n hostElement.classList.add('dark');\n hostElement.classList.remove('light');\n } else {\n hostElement.classList.add('light');\n hostElement.classList.remove('dark');\n }\n\n // Force style recalculation to ensure CSS is applied\n void hostElement.offsetHeight; // Trigger reflow\n\n // Mark for check to update view with OnPush strategy\n this.cdr.markForCheck();\n } else {\n // Retry if host element not available yet\n this.requestAnimationFrame(() => {\n if (!this.isDestroyed) {\n this.applyTheme(theme);\n }\n });\n return;\n }\n\n this.applyCustomColors(theme);\n\n this.applyThemeToDropdown(theme);\n }\n\n private applyCustomColors(theme: 'light' | 'dark') {\n if (!this.customColors || !this.customColors[theme]) return;\n const p = this.customColors[theme]!;\n // Use hostElementRef since we used it above\n const hostElement = this.hostElementRef?.nativeElement as HTMLElement;\n if (!hostElement) return;\n\n const style = hostElement.style;\n const set = (k: string, v?: string) => { if (v) style.setProperty(k, v, 'important'); };\n\n set('--tel-bg', p.background);\n set('--tel-fg', p.foreground);\n set('--tel-border', p.border);\n set('--tel-border-hover', p.borderHover);\n set('--tel-ring', p.ring);\n set('--tel-placeholder', p.placeholder);\n }\n\n /** Apply theme to the dropdown if it exists */\n private applyThemeToDropdown(theme: 'light' | 'dark'): void {\n if (!isPlatformBrowser(this.platformId)) return;\n if (typeof document === 'undefined' || !document.querySelector) return;\n\n try {\n const dropdown = document.querySelector('.iti__country-list') as HTMLElement;\n if (dropdown && dropdown.setAttribute) {\n dropdown.setAttribute('data-theme', theme);\n }\n } catch (e) {\n // Fallback for browsers without querySelector support\n }\n }\n\n /**\n * Gets the current resolved theme (light or dark).\n * @returns The current theme ('light' or 'dark')\n */\n getCurrentTheme(): 'light' | 'dark' {\n return this.currentTheme;\n }\n\n /**\n * Sets the theme programmatically.\n * @param theme - Theme to apply ('light' or 'dark')\n */\n setTheme(theme: 'light' | 'dark'): void {\n this.theme = theme;\n this.detectAndApplyTheme();\n }\n\n /** Update dropdown theme when it's opened */\n private updateDropdownTheme(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n setTimeout(() => {\n const dropdown = document.querySelector('.iti__country-list') as HTMLElement;\n if (dropdown) {\n dropdown.setAttribute('data-theme', this.currentTheme);\n\n if (this.currentTheme === 'dark') {\n dropdown.classList.add('dark-theme');\n document.documentElement.classList.add('dark');\n document.body.classList.add('dark');\n } else {\n dropdown.classList.remove('dark-theme');\n document.documentElement.classList.remove('dark');\n document.body.classList.remove('dark');\n }\n\n const searchInput = dropdown.querySelector('.iti__search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.setAttribute('data-theme', this.currentTheme);\n if (this.currentTheme === 'dark') {\n searchInput.classList.add('dark-theme');\n } else {\n searchInput.classList.remove('dark-theme');\n }\n\n searchInput.style.pointerEvents = 'auto';\n searchInput.style.opacity = '1';\n searchInput.disabled = false;\n\n // Add clear button functionality\n this.setupSearchInputClearButton(searchInput);\n }\n }\n }, 10);\n }\n\n /** Setup clear button for search input */\n private setupSearchInputClearButton(searchInput: HTMLInputElement): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n // Clean up any existing listeners first\n this.cleanupSearchInputListeners();\n\n // Find the search container (could be parent or a wrapper)\n let searchContainer = searchInput.parentElement;\n if (!searchContainer) return;\n\n // Remove existing clear button if any\n const existingClear = searchContainer.querySelector('.iti__search-clear');\n if (existingClear) {\n existingClear.remove();\n }\n\n // Create clear button\n const clearButton = document.createElement('button');\n clearButton.type = 'button';\n clearButton.className = 'iti__search-clear';\n clearButton.setAttribute('aria-label', 'Clear search');\n clearButton.innerHTML = '×';\n clearButton.setAttribute('tabindex', '-1');\n\n // Make search input container relative if needed\n const containerStyle = window.getComputedStyle(searchContainer);\n if (containerStyle.position === 'static') {\n searchContainer.style.position = 'relative';\n }\n\n // Append clear button to container\n searchContainer.appendChild(clearButton);\n\n // Show/hide clear button based on input value\n const updateClearButton = () => {\n if (searchInput.value && searchInput.value.trim()) {\n clearButton.style.display = 'flex';\n } else {\n clearButton.style.display = 'none';\n }\n };\n\n // Clear input when button is clicked\n const handleClear = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n searchInput.value = '';\n // Trigger input event to update the country list\n searchInput.dispatchEvent(new Event('input', { bubbles: true }));\n searchInput.dispatchEvent(new Event('keyup', { bubbles: true }));\n searchInput.focus();\n updateClearButton();\n };\n\n const handleMousedown = (e: Event) => e.preventDefault();\n const handlePaste = () => {\n setTimeout(updateClearButton, 0);\n };\n\n // Add event listeners and track cleanup functions\n clearButton.addEventListener('click', handleClear);\n this.searchInputCleanupFunctions.push(() => clearButton.removeEventListener('click', handleClear));\n\n clearButton.addEventListener('mousedown', handleMousedown);\n this.searchInputCleanupFunctions.push(() => clearButton.removeEventListener('mousedown', handleMousedown));\n\n // Update button visibility on input\n searchInput.addEventListener('input', updateClearButton);\n this.searchInputCleanupFunctions.push(() => searchInput.removeEventListener('input', updateClearButton));\n\n searchInput.addEventListener('keyup', updateClearButton);\n this.searchInputCleanupFunctions.push(() => searchInput.removeEventListener('keyup', updateClearButton));\n\n searchInput.addEventListener('focus', updateClearButton);\n this.searchInputCleanupFunctions.push(() => searchInput.removeEventListener('focus', updateClearButton));\n\n searchInput.addEventListener('paste', handlePaste);\n this.searchInputCleanupFunctions.push(() => searchInput.removeEventListener('paste', handlePaste));\n\n // Initial state\n updateClearButton();\n }\n\n /** Clean up search input event listeners to prevent memory leaks */\n private cleanupSearchInputListeners(): void {\n this.searchInputCleanupFunctions.forEach(cleanup => cleanup());\n this.searchInputCleanupFunctions = [];\n }\n\n /** Setup observer to watch for dropdown changes and apply theme */\n private setupDropdownThemeObserver(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n if (typeof window === 'undefined' || !window.MutationObserver) return;\n\n // Only create observer if it doesn't already exist\n if (this.themeObserver) return;\n\n try {\n this.themeObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'childList' && mutation.addedNodes) {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === 1) {\n const element = node as HTMLElement;\n if (element.classList && element.classList.contains('iti__country-list')) {\n this.updateDropdownTheme();\n }\n }\n });\n }\n });\n });\n\n if (this.themeObserver && document.body) {\n this.themeObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n } catch (e) {\n // Fallback for browsers without MutationObserver support\n this.themeObserver = null;\n }\n }\n\n /** Setup observer to watch for global theme changes on html/body */\n private setupGlobalThemeObserver(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n // Watch for class changes on document.documentElement (html tag)\n // This supports Tailwind and other class-based theming systems\n const target = document.documentElement;\n if (!target || !window.MutationObserver) return;\n\n this.globalThemeObserver = new MutationObserver((mutations) => {\n // Only re-check if we are in auto mode\n const themeConfig = this.themeSignal() || this.theme;\n if (themeConfig === 'auto') {\n this.detectAndApplyTheme();\n }\n });\n\n this.globalThemeObserver.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'data-theme']\n });\n }\n}\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nexport type Theme = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly themeSubject = new BehaviorSubject<Theme>('auto');\r\n private readonly currentThemeSubject = new BehaviorSubject<'light' | 'dark'>('light');\r\n \r\n public readonly theme$ = this.themeSubject.asObservable();\r\n public readonly currentTheme$ = this.currentThemeSubject.asObservable();\r\n\r\n constructor() {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.initializeTheme();\r\n this.setupSystemThemeListener();\r\n }\r\n }\r\n\r\n /** Get current theme preference */\r\n getTheme(): Theme {\r\n return this.themeSubject.value;\r\n }\r\n\r\n /** Get current resolved theme (light or dark) */\r\n getCurrentTheme(): 'light' | 'dark' {\r\n return this.currentThemeSubject.value;\r\n }\r\n\r\n /** Set theme preference */\r\n setTheme(theme: Theme): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n this.themeSubject.next(theme);\r\n this.applyTheme(theme);\r\n this.saveThemePreference(theme);\r\n }\r\n\r\n /** Toggle between light and dark themes */\r\n toggleTheme(): void {\r\n const current = this.getCurrentTheme();\r\n this.setTheme(current === 'light' ? 'dark' : 'light');\r\n }\r\n\r\n /** Initialize theme from saved preference or system */\r\n private initializeTheme(): void {\r\n const savedTheme = this.getSavedThemePreference();\r\n const theme = savedTheme || 'auto';\r\n this.setTheme(theme);\r\n }\r\n\r\n /** Apply theme to document and components */\r\n private applyTheme(theme: Theme): void {\r\n const resolvedTheme = this.resolveTheme(theme);\r\n this.currentThemeSubject.next(resolvedTheme);\r\n\r\n // Apply to document\r\n document.documentElement.setAttribute('data-theme', resolvedTheme);\r\n \r\n if (resolvedTheme === 'dark') {\r\n document.documentElement.classList.add('dark');\r\n } else {\r\n document.documentElement.classList.remove('dark');\r\n }\r\n\r\n // Update CSS custom properties\r\n this.updateCSSVariables(resolvedTheme);\r\n\r\n // Force update of all tel-input components\r\n this.updateTelInputComponents(resolvedTheme);\r\n }\r\n\r\n /** Update all tel-input components with the new theme */\r\n private updateTelInputComponents(theme: 'light' | 'dark'): void {\r\n const telInputComponents = document.querySelectorAll('ngxsmk-tel-input');\r\n telInputComponents.forEach(component => {\r\n const element = component as HTMLElement;\r\n element.setAttribute('data-theme', theme);\r\n });\r\n }\r\n\r\n /** Resolve theme to light or dark */\r\n private resolveTheme(theme: Theme): 'light' | 'dark' {\r\n if (theme === 'auto') {\r\n return this.detectSystemTheme();\r\n }\r\n return theme;\r\n }\r\n\r\n /** Detect system theme preference */\r\n private detectSystemTheme(): 'light' | 'dark' {\r\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n return 'light';\r\n }\r\n\r\n /** Setup listener for system theme changes */\r\n private setupSystemThemeListener(): void {\r\n if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n mediaQuery.addEventListener('change', () => {\r\n if (this.getTheme() === 'auto') {\r\n this.applyTheme('auto');\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Update CSS custom properties for theme */\r\n private updateCSSVariables(theme: 'light' | 'dark'): void {\r\n const root = document.documentElement;\r\n \r\n if (theme === 'dark') {\r\n root.style.setProperty('--tel-bg', '#212121');\r\n root.style.setProperty('--tel-fg', '#ffffff');\r\n root.style.setProperty('--tel-border', '#334155');\r\n root.style.setProperty('--tel-border-hover', '#475569');\r\n root.style.setProperty('--tel-ring', '#60a5fa');\r\n root.style.setProperty('--tel-placeholder', '#ffffff');\r\n root.style.setProperty('--tel-error', '#f87171');\r\n root.style.setProperty('--tel-success', '#34d399');\r\n root.style.setProperty('--tel-warning', '#fbbf24');\r\n root.style.setProperty('--tel-dd-bg', '#212121');\r\n root.style.setProperty('--tel-dd-border', '#324056');\r\n root.style.setProperty('--tel-dd-shadow', '0 24px 60px rgba(0, 0, 0, .4)');\r\n root.style.setProperty('--tel-dd-search-bg', 'rgba(148, 163, 184, .12)');\r\n } else {\r\n root.style.setProperty('--tel-bg', '#fff');\r\n root.style.setProperty('--tel-fg', '#0f172a');\r\n root.style.setProperty('--tel-border', '#c0c0c0');\r\n root.style.setProperty('--tel-border-hover', '#9aa0a6');\r\n root.style.setProperty('--tel-ring', '#2563eb');\r\n root.style.setProperty('--tel-placeholder', '#9ca3af');\r\n root.style.setProperty('--tel-error', '#ef4444');\r\n root.style.setProperty('--tel-success', '#10b981');\r\n root.style.setProperty('--tel-warning', '#f59e0b');\r\n root.style.setProperty('--tel-dd-bg', '#fff');\r\n root.style.setProperty('--tel-dd-border', '#c0c0c0');\r\n root.style.setProperty('--tel-dd-shadow', '0 24px 60px rgba(0, 0, 0, .18)');\r\n root.style.setProperty('--tel-dd-search-bg', 'rgba(148, 163, 184, .08)');\r\n }\r\n }\r\n\r\n /** Save theme preference to localStorage */\r\n private saveThemePreference(theme: Theme): void {\r\n try {\r\n localStorage.setItem('ngxsmk-tel-input-theme', theme);\r\n } catch (error) {\r\n console.warn('Failed to save theme preference:', error);\r\n }\r\n }\r\n\r\n /** Get saved theme preference from localStorage */\r\n private getSavedThemePreference(): Theme | null {\r\n try {\r\n const saved = localStorage.getItem('ngxsmk-tel-input-theme');\r\n return saved as Theme | null;\r\n } catch (error) {\r\n console.warn('Failed to load theme preference:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /** Check if dark theme is active */\r\n isDarkTheme(): boolean {\r\n return this.getCurrentTheme() === 'dark';\r\n }\r\n\r\n /** Check if light theme is active */\r\n isLightTheme(): boolean {\r\n return this.getCurrentTheme() === 'light';\r\n }\r\n\r\n /** Check if auto theme is set */\r\n isAutoTheme(): boolean {\r\n return this.getTheme() === 'auto';\r\n }\r\n}\r\n","import { CountryCode } from 'libphonenumber-js';\r\n\r\n/**\r\n * Utility functions for phone number input optimization and performance.\r\n * Provides helper methods for common operations like debouncing, throttling, and DOM manipulation.\r\n */\r\nexport class PhoneInputUtils {\r\n /**\r\n * Converts any string to digits only (NSN - National Significant Number basis).\r\n * Removes all non-digit characters.\r\n * \r\n * @param v - Input string that may contain formatting characters\r\n * @returns String containing only digits\r\n * \r\n * @example\r\n * ```typescript\r\n * PhoneInputUtils.toNSN('(202) 555-1234'); // Returns '2025551234'\r\n * PhoneInputUtils.toNSN('+1 202-555-1234'); // Returns '12025551234'\r\n * ```\r\n */\r\n static toNSN(v: string | null | undefined): string {\r\n return (v ?? '').replace(/\\D/g, '');\r\n }\r\n\r\n /**\r\n * Strips exactly one leading trunk '0' from national input.\r\n * Used for countries like Sri Lanka where national format includes a leading 0.\r\n * \r\n * @param nsn - National Significant Number string\r\n * @returns NSN with leading zero removed (if present)\r\n * \r\n * @example\r\n * ```typescript\r\n * PhoneInputUtils.stripLeadingZero('0712345678'); // Returns '712345678'\r\n * PhoneInputUtils.stripLeadingZero('712345678'); // Returns '712345678'\r\n * ```\r\n */\r\n static stripLeadingZero(nsn: string): string {\r\n return nsn.replace(/^0/, '');\r\n }\r\n\r\n /**\r\n * Creates a cache key for phone number operations.\r\n * Combines input and country code into a unique key string.\r\n * \r\n * @param input - Phone number input string\r\n * @param iso2 - ISO 3166-1 alpha-2 country code\r\n * @returns Cache key string in format \"input|iso2\"\r\n * \r\n * @example\r\n * ```typescript\r\n * PhoneInputUtils.createCacheKey('2025551234', 'US'); // Returns '2025551234|US'\r\n * ```\r\n */\r\n static createCacheKey(input: string, iso2: CountryCode): string {\r\n return `${input || ''}|${iso2}`;\r\n }\r\n\r\n /**\r\n * Creates a debounced version of a function.\r\n * The debounced function delays execution until after wait milliseconds have elapsed\r\n * since the last time it was invoked.\r\n * \r\n * @param func - Function to debounce\r\n * @param wait - Number of milliseconds to wait\r\n * @returns Debounced function\r\n * \r\n * @example\r\n * ```typescript\r\n * const debouncedHandler = PhoneInputUtils.debounce((value: string) => {\r\n * console.log(value);\r\n * }, 300);\r\n * \r\n * debouncedHandler('a'); // Waits 300ms\r\n * debouncedHandler('ab'); // Cancels previous, waits 300ms\r\n * debouncedHandler('abc'); // Cancels previous, waits 300ms, then logs 'abc'\r\n * ```\r\n */\r\n static debounce<T extends (...args: unknown[]) => unknown>(\r\n func: T,\r\n wait: number\r\n ): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(() => func.apply(this, args), wait);\r\n };\r\n }\r\n\r\n /**\r\n * Creates a throttled version of a function.\r\n * The throttled function will only execute once per limit milliseconds.\r\n * \r\n * @param func - Function to throttle\r\n * @param limit - Number of milliseconds between executions\r\n * @returns Throttled function\r\n * \r\n * @example\r\n * ```typescript\r\n * const throttledHandler = PhoneInputUtils.throttle((value: string) => {\r\n * console.log(value);\r\n * }, 100);\r\n * \r\n * throttledHandler('a'); // Executes immediately\r\n * throttledHandler('b'); // Ignored (within 100ms)\r\n * throttledHandler('c'); // Ignored (within 100ms)\r\n * // After 100ms, next call will execute\r\n * ```\r\n */\r\n static throttle<T extends (...args: unknown[]) => unknown>(\r\n func: T,\r\n limit: number\r\n ): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n func.apply(this, args);\r\n inThrottle = true;\r\n setTimeout(() => inThrottle = false, limit);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Checks if a string contains only digits.\r\n * \r\n * @param str - String to check\r\n * @returns true if string contains only digits, false otherwise\r\n * \r\n * @example\r\n * ```typescript\r\n * PhoneInputUtils.isDigitsOnly('12345'); // Returns true\r\n * PhoneInputUtils.isDigitsOnly('123-45'); // Returns false\r\n * ```\r\n */\r\n static isDigitsOnly(str: string): boolean {\r\n return /^\\d+$/.test(str);\r\n }\r\n\r\n /**\r\n * Safely gets an element's value with fallback to empty string.\r\n * \r\n * @param element - HTML input element (may be null)\r\n * @returns Element value or empty string if element is null/undefined\r\n * \r\n * @example\r\n * ```typescript\r\n * const value = PhoneInputUtils.getElementValue(inputElement); // Returns value or ''\r\n * ```\r\n */\r\n static getElementValue(element: HTMLInputElement | null): string {\r\n return element?.value?.trim() || '';\r\n }\r\n\r\n /**\r\n * Checks if an element is currently visible in the viewport.\r\n * Useful for performance optimization (e.g., lazy loading).\r\n * \r\n * @param element - HTML element to check\r\n * @returns true if element is in viewport, false otherwise\r\n */\r\n static isInViewport(element: HTMLElement): boolean {\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n }\r\n\r\n /**\r\n * Creates an optimized event listener with cleanup function.\r\n * Returns a function that removes the event listener when called.\r\n * \r\n * @param element - HTML element to attach listener to\r\n * @param event - Event name (e.g., 'click', 'input')\r\n * @param handler - Event handler function\r\n * @param options - Optional AddEventListenerOptions\r\n * @returns Cleanup function that removes the event listener\r\n * \r\n * @example\r\n * ```typescript\r\n * const cleanup = PhoneInputUtils.addEventListener(element, 'click', handler);\r\n * // Later...\r\n * cleanup(); // Removes the event listener\r\n * ```\r\n */\r\n static createEventListener(\r\n element: HTMLElement,\r\n event: string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions\r\n ): () => void {\r\n element.addEventListener(event, handler, options);\r\n return () => element.removeEventListener(event, handler, options);\r\n }\r\n\r\n /**\r\n * Batches DOM operations for better performance.\r\n * Executes all operations in a single requestAnimationFrame callback.\r\n * \r\n * @param operations - Array of functions that perform DOM operations\r\n * \r\n * @example\r\n * ```typescript\r\n * PhoneInputUtils.batchDOMOperations([\r\n * () => element1.style.display = 'none',\r\n * () => element2.classList.add('active'),\r\n * () => element3.textContent = 'Updated'\r\n * ]);\r\n * ```\r\n */\r\n static batchDOMOperations(operations: (() => void)[]): void {\r\n requestAnimationFrame(() => {\r\n operations.forEach(op => op());\r\n });\r\n }\r\n}\r\n","/**\r\n * Angular Material theme configuration helper\r\n */\r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nexport interface MaterialThemeConfig {\r\n primaryColor?: string;\r\n accentColor?: string;\r\n warnColor?: string;\r\n density?: 'comfortable' | 'compact' | 'cosy';\r\n}\r\n\r\nexport const MATERIAL_THEME_CONFIG = new InjectionToken<MaterialThemeConfig>(\r\n 'MATERIAL_THEME_CONFIG'\r\n);\r\n\r\n/**\r\n * Provides Material theme configuration\r\n */\r\nexport function provideMaterialTheme(config: MaterialThemeConfig = {}) {\r\n return {\r\n provide: MATERIAL_THEME_CONFIG,\r\n useValue: {\r\n primaryColor: '#3f51b5',\r\n accentColor: '#ff4081',\r\n warnColor: '#f44336',\r\n density: 'comfortable',\r\n ...config\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * PrimeNG theme configuration helper\r\n */\r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nexport interface PrimeNGThemeConfig {\r\n theme?: 'lara-light' | 'lara-dark' | 'aura-light' | 'aura-dark' | 'saga-blue' | 'vela-blue' | 'arya-blue';\r\n ripple?: boolean;\r\n inputStyle?: 'outlined' | 'filled';\r\n}\r\n\r\nexport const PRIMENG_THEME_CONFIG = new InjectionToken<PrimeNGThemeConfig>(\r\n 'PRIMENG_THEME_CONFIG'\r\n);\r\n\r\n/**\r\n * Provides PrimeNG theme configuration\r\n */\r\nexport function providePrimeNGTheme(config: PrimeNGThemeConfig = {}) {\r\n return {\r\n provide: PRIMENG_THEME_CONFIG,\r\n useValue: {\r\n theme: 'lara-light',\r\n ripple: true,\r\n inputStyle: 'outlined',\r\n ...config\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * Mock phone service for testing\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { CountryCode } from 'libphonenumber-js';\r\nimport { NgxsmkTelInputService, ParseResult, ParseWithInvalidResult } from '../ngxsmk-tel-input.service';\r\n\r\n/**\r\n * Mock implementation of NgxsmkTelInputService for testing\r\n */\r\n@Injectable()\r\nexport class MockNgxsmkTelInputService extends NgxsmkTelInputService {\r\n private mockValidNumbers: Set<string> = new Set();\r\n private mockInvalidNumbers: Set<string> = new Set();\r\n private mockParseResults: Map<string, ParseResult> = new Map();\r\n private shouldThrowError = false;\r\n private errorMessage = 'Mock error';\r\n\r\n /**\r\n * Add a valid phone number for testing\r\n */\r\n addValidNumber(number: string, country: CountryCode = 'US'): void {\r\n this.mockValidNumbers.add(`${number}|${country}`);\r\n }\r\n\r\n /**\r\n * Add an invalid phone number for testing\r\n */\r\n addInvalidNumber(number: string, country: CountryCode = 'US'): void {\r\n this.mockInvalidNumbers.add(`${number}|${country}`);\r\n }\r\n\r\n /**\r\n * Set a custom parse result for a specific input\r\n */\r\n setParseResult(input: string, country: CountryCode, result: ParseResult): void {\r\n const key = `${input}|${country}`;\r\n this.mockParseResults.set(key, result);\r\n }\r\n\r\n /**\r\n * Configure the service to throw an error\r\n */\r\n setShouldThrowError(shouldThrow: boolean, message: string = 'Mock error'): void {\r\n this.shouldThrowError = shouldThrow;\r\n this.errorMessage = message;\r\n }\r\n\r\n /**\r\n * Clear all mock data\r\n */\r\n clearMocks(): void {\r\n this.mockValidNumbers.clear();\r\n this.mockInvalidNumbers.clear();\r\n this.mockParseResults.clear();\r\n this.shouldThrowError = false;\r\n this.clearCache();\r\n }\r\n\r\n override parse(input: string, iso2: CountryCode): ParseResult {\r\n if (this.shouldThrowError) {\r\n throw new Error(this.errorMessage);\r\n }\r\n\r\n const key = `${input || ''}|${iso2}`;\r\n \r\n // Check for custom parse result\r\n if (this.mockParseResults.has(key)) {\r\n return this.mockParseResults.get(key)!;\r\n }\r\n\r\n // Check if it's a known valid/invalid number\r\n const isValid = this.mockValidNumbers.has(key);\r\n const isInvalid = this.mockInvalidNumbers.has(key);\r\n\r\n if (isValid) {\r\n return {\r\n e164: input.startsWith('+') ? input : `+1${input}`,\r\n national: input,\r\n isValid: true\r\n };\r\n }\r\n\r\n if (isInvalid) {\r\n return {\r\n e164: null,\r\n national: null,\r\n isValid: false\r\n };\r\n }\r\n\r\n // Fallback to parent implementation\r\n return super.parse(input, iso2);\r\n }\r\n\r\n override isValid(input: string, iso2: CountryCode): boolean {\r\n if (this.shouldThrowError) {\r\n throw new Error(this.errorMessage);\r\n }\r\n\r\n const key = `${input || ''}|${iso2}`;\r\n \r\n if (this.mockValidNumbers.has(key)) {\r\n return true;\r\n }\r\n\r\n if (this.mockInvalidNumbers.has(key)) {\r\n return false;\r\n }\r\n\r\n // Fallback to parent implementation\r\n return super.isValid(input, iso2);\r\n }\r\n\r\n override parseWithInvalidDetection(input: string, iso2: CountryCode): ParseWithInvalidResult {\r\n if (this.shouldThrowError) {\r\n throw new Error(this.errorMessage);\r\n }\r\n\r\n const parseResult = this.parse(input, iso2);\r\n \r\n return {\r\n ...parseResult,\r\n isInvalidInternational: !parseResult.isValid && input.length > 3\r\n };\r\n }\r\n}\r\n\r\n","/**\r\n * Test fixtures for ngxsmk-tel-input\r\n */\r\n\r\nimport { ComponentFixture } from '@angular/core/testing';\r\nimport { CountryCode } from 'libphonenumber-js';\r\nimport { NgxsmkTelInputComponent } from '../ngxsmk-tel-input.component';\r\n\r\n/**\r\n * Test data fixtures\r\n */\r\nexport const TEST_PHONE_NUMBERS = {\r\n valid: {\r\n US: '+12025551234',\r\n US_NATIONAL: '2025551234',\r\n GB: '+442071234567',\r\n GB_NATIONAL: '02071234567',\r\n AU: '+61234567890',\r\n AU_NATIONAL: '0234567890',\r\n CA: '+14165551234',\r\n CA_NATIONAL: '4165551234'\r\n },\r\n invalid: {\r\n TOO_SHORT: '123',\r\n TOO_LONG: '12345678901234567890',\r\n INVALID_COUNTRY_CODE: '1123456789',\r\n INVALID_FORMAT: 'abc123def'\r\n }\r\n};\r\n\r\nexport const TEST_COUNTRIES: CountryCode[] = ['US', 'GB', 'AU', 'CA', 'DE', 'FR', 'JP', 'CN'];\r\n\r\n/**\r\n * Helper to create a test component fixture\r\n */\r\nexport function createTestComponentFixture<T>(\r\n fixture: ComponentFixture<T>\r\n): ComponentFixture<T> {\r\n fixture.detectChanges();\r\n return fixture;\r\n}\r\n\r\n/**\r\n * Helper to get phone input component from fixture\r\n */\r\nexport function getPhoneInputComponent(\r\n fixture: ComponentFixture<any>\r\n): NgxsmkTelInputComponent {\r\n const component = fixture.componentInstance;\r\n const phoneInput = component.phoneInput || component.telInput;\r\n if (!phoneInput) {\r\n throw new Error('Phone input component not found. Use ViewChild with reference name \"phoneInput\" or \"telInput\"');\r\n }\r\n return phoneInput;\r\n}\r\n\r\n/**\r\n * Helper to set phone input value\r\n */\r\nexport function setPhoneInputValue(\r\n component: NgxsmkTelInputComponent,\r\n value: string\r\n): void {\r\n component.writeValue(value);\r\n}\r\n\r\n/**\r\n * Helper to select country\r\n */\r\nexport function selectCountry(\r\n component: NgxsmkTelInputComponent,\r\n country: CountryCode\r\n): void {\r\n component.selectCountry(country);\r\n}\r\n\r\n/**\r\n * Helper to trigger input event\r\n */\r\nexport function triggerInputEvent(\r\n fixture: ComponentFixture<any>,\r\n value: string\r\n): void {\r\n const input = fixture.nativeElement.querySelector('input[type=\"tel\"]');\r\n if (input) {\r\n input.value = value;\r\n input.dispatchEvent(new Event('input'));\r\n fixture.detectChanges();\r\n }\r\n}\r\n\r\n/**\r\n * Helper to trigger blur event\r\n */\r\nexport function triggerBlurEvent(fixture: ComponentFixture<any>): void {\r\n const input = fixture.nativeElement.querySelector('input[type=\"tel\"]');\r\n if (input) {\r\n input.dispatchEvent(new Event('blur'));\r\n fixture.detectChanges();\r\n }\r\n}\r\n\r\n/**\r\n * Helper to trigger focus event\r\n */\r\nexport function triggerFocusEvent(fixture: ComponentFixture<any>): void {\r\n const input = fixture.nativeElement.querySelector('input[type=\"tel\"]');\r\n if (input) {\r\n input.dispatchEvent(new Event('focus'));\r\n fixture.detectChanges();\r\n }\r\n}\r\n\r\n/**\r\n * Helper to get current input value\r\n */\r\nexport function getInputValue(fixture: ComponentFixture<any>): string {\r\n const input = fixture.nativeElement.querySelector('input[type=\"tel\"]');\r\n return input ? input.value : '';\r\n}\r\n\r\n/**\r\n * Helper to check if input is valid\r\n */\r\nexport function isInputValid(component: NgxsmkTelInputComponent): boolean {\r\n return component.isValid();\r\n}\r\n\r\n/**\r\n * Helper to check if input has errors\r\n */\r\nexport function hasInputErrors(component: NgxsmkTelInputComponent): boolean {\r\n return component.hasErrors();\r\n}\r\n\r\n/**\r\n * Helper to get validation errors\r\n */\r\nexport function getValidationErrors(component: NgxsmkTelInputComponent): string[] {\r\n return component.validationStatus().errorKeys;\r\n}\r\n\r\n/**\r\n * Helper to wait for async operations\r\n */\r\nexport function waitForAsync(fn: () => void): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n fn();\r\n resolve();\r\n }, 0);\r\n });\r\n}\r\n\r\n/**\r\n * Test form control interface\r\n */\r\nexport interface TestFormControl {\r\n value: string | null;\r\n setValue: (val: string | null) => void;\r\n patchValue: (val: string | null) => void;\r\n reset: (val?: string | null) => void;\r\n}\r\n\r\n/**\r\n * Helper to create test form control\r\n */\r\nexport function createTestFormControl(value: string | null = null): TestFormControl {\r\n const control: TestFormControl = {\r\n value,\r\n setValue: function(val: string | null) {\r\n control.value = val;\r\n },\r\n patchValue: function(val: string | null) {\r\n control.value = val;\r\n },\r\n reset: function(val: string | null = null) {\r\n control.value = val;\r\n }\r\n };\r\n return control;\r\n}\r\n\r\n/**\r\n * Test scenarios\r\n */\r\nexport const TEST_SCENARIOS = {\r\n validUSNumber: {\r\n input: TEST_PHONE_NUMBERS.valid.US_NATIONAL,\r\n country: 'US' as CountryCode,\r\n expectedE164: TEST_PHONE_NUMBERS.valid.US,\r\n expectedValid: true\r\n },\r\n validUKNumber: {\r\n input: TEST_PHONE_NUMBERS.valid.GB_NATIONAL,\r\n country: 'GB' as CountryCode,\r\n expectedE164: TEST_PHONE_NUMBERS.valid.GB,\r\n expectedValid: true\r\n },\r\n invalidNumber: {\r\n input: TEST_PHONE_NUMBERS.invalid.TOO_SHORT,\r\n country: 'US' as CountryCode,\r\n expectedE164: null,\r\n expectedValid: false\r\n },\r\n invalidCountryCode: {\r\n input: TEST_PHONE_NUMBERS.invalid.INVALID_COUNTRY_CODE,\r\n country: 'US' as CountryCode,\r\n expectedE164: null,\r\n expectedValid: false,\r\n expectedError: 'phoneInvalidCountryCode'\r\n }\r\n};\r\n\r\n","/**\r\n * E2E testing helpers for ngxsmk-tel-input\r\n */\r\n\r\n// Protractor types are optional - only needed for E2E tests\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype ElementFinder = any;\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst by = { css: (selector: string) => ({ selector }) } as any;\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst element = (selector: any) => selector as any;\r\n\r\n/**\r\n * E2E selectors\r\n */\r\nexport const E2E_SELECTORS = {\r\n phoneInput: 'ngxsmk-tel-input input[type=\"tel\"]',\r\n phoneInputWrapper: 'ngxsmk-tel-input',\r\n countryDropdown: '.iti__selected-flag',\r\n countryList: '.iti__country-list',\r\n clearButton: '.ngxsmk-tel__clear',\r\n errorMessage: '.ngxsmk-tel__error',\r\n hint: '.ngxsmk-tel__hint',\r\n label: '.ngxsmk-tel__label'\r\n};\r\n\r\n/**\r\n * Get phone input element\r\n */\r\nexport function getPhoneInput(): ElementFinder {\r\n return element(by.css(E2E_SELECTORS.phoneInput));\r\n}\r\n\r\n/**\r\n * Get phone input wrapper\r\n */\r\nexport function getPhoneInputWrapper(): ElementFinder {\r\n return element(by.css(E2E_SELECTORS.phoneInputWrapper));\r\n}\r\n\r\n/**\r\n * Type phone number\r\n */\r\nexport async function typePhoneNumber(value: string): Promise<void> {\r\n const input = getPhoneInput();\r\n await input.clear();\r\n await input.sendKeys(value);\r\n}\r\n\r\n/**\r\n * Clear phone input\r\n */\r\nexport async function clearPhoneInput(): Promise<void> {\r\n const input = getPhoneInput();\r\n await input.clear();\r\n}\r\n\r\n/**\r\n * Get phone input value\r\n */\r\nexport async function getPhoneInputValue(): Promise<string> {\r\n const input = getPhoneInput();\r\n return await input.getAttribute('value');\r\n}\r\n\r\n/**\r\n * Click country dropdown\r\n */\r\nexport async function clickCountryDropdown(): Promise<void> {\r\n const dropdown = element(by.css(E2E_SELECTORS.countryDropdown));\r\n await dropdown.click();\r\n}\r\n\r\n/**\r\n * Select country from dropdown\r\n */\r\nexport async function selectCountryFromDropdown(countryCode: string): Promise<void> {\r\n await clickCountryDropdown();\r\n const countryItem = element(by.css(`.iti__country[data-country-code=\"${countryCode.toLowerCase()}\"]`));\r\n await countryItem.click();\r\n}\r\n\r\n/**\r\n * Click clear button\r\n */\r\nexport async function clickClearButton(): Promise<void> {\r\n const clearBtn = element(by.css(E2E_SELECTORS.clearButton));\r\n if (await clearBtn.isPresent()) {\r\n await clearBtn.click();\r\n }\r\n}\r\n\r\n/**\r\n * Get error message\r\n */\r\nexport async function getErrorMessage(): Promise<string> {\r\n const errorEl = element(by.css(E2E_SELECTORS.errorMessage));\r\n if (await errorEl.isPresent()) {\r\n return await errorEl.getText();\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Check if error is displayed\r\n */\r\nexport async function isErrorDisplayed(): Promise<boolean> {\r\n const errorEl = element(by.css(E2E_SELECTORS.errorMessage));\r\n return await errorEl.isPresent();\r\n}\r\n\r\n/**\r\n * Get hint text\r\n */\r\nexport async function getHintText(): Promise<string> {\r\n const hintEl = element(by.css(E2E_SELECTORS.hint));\r\n if (await hintEl.isPresent()) {\r\n return await hintEl.getText();\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Get label text\r\n */\r\nexport async function getLabelText(): Promise<string> {\r\n const labelEl = element(by.css(E2E_SELECTORS.label));\r\n if (await labelEl.isPresent()) {\r\n return await labelEl.getText();\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Check if input is disabled\r\n */\r\nexport async function isInputDisabled(): Promise<boolean> {\r\n const input = getPhoneInput();\r\n return await input.getAttribute('disabled').then(\r\n (value: string | null) => value !== null,\r\n () => false\r\n );\r\n}\r\n\r\n/**\r\n * Focus phone input\r\n */\r\nexport async function focusPhoneInput(): Promise<void> {\r\n const input = getPhoneInput();\r\n await input.click();\r\n}\r\n\r\n/**\r\n * Blur phone input\r\n */\r\nexport async function blurPhoneInput(): Promise<void> {\r\n // Click outside the input\r\n const body = element(by.tagName('body'));\r\n await body.click();\r\n}\r\n\r\n/**\r\n * Wait for validation\r\n */\r\nexport async function waitForValidation(timeout: number = 1000): Promise<void> {\r\n await new Promise(resolve => setTimeout(resolve, timeout));\r\n}\r\n\r\n/**\r\n * Check if country dropdown is open\r\n */\r\nexport async function isCountryDropdownOpen(): Promise<boolean> {\r\n const countryList = element(by.css(E2E_SELECTORS.countryList));\r\n return await countryList.isPresent() && await countryList.isDisplayed();\r\n}\r\n\r\n/**\r\n * Search for country in dropdown\r\n */\r\nexport async function searchCountryInDropdown(searchTerm: string): Promise<void> {\r\n await clickCountryDropdown();\r\n const searchInput = element(by.css('.iti__search-input'));\r\n if (await searchInput.isPresent()) {\r\n await searchInput.clear();\r\n await searchInput.sendKeys(searchTerm);\r\n }\r\n}\r\n\r\n/**\r\n * Get selected country code\r\n */\r\nexport async function getSelectedCountryCode(): Promise<string> {\r\n const flag = element(by.css(E2E_SELECTORS.countryDropdown));\r\n if (await flag.isPresent()) {\r\n const countryCode = await flag.getAttribute('data-country-code');\r\n return countryCode ? countryCode.toUpperCase() : '';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * E2E test scenarios\r\n */\r\nexport const E2E_SCENARIOS = {\r\n /**\r\n * Test valid phone number input\r\n */\r\n async testValidPhoneInput(phoneNumber: string, countryCode: string = 'US'): Promise<void> {\r\n await selectCountryFromDropdown(countryCode);\r\n await typePhoneNumber(phoneNumber);\r\n await waitForValidation();\r\n const errorDisplayed = await isErrorDisplayed();\r\n if (errorDisplayed) {\r\n throw new Error(`Expected valid input but error was displayed: ${await getErrorMessage()}`);\r\n }\r\n },\r\n\r\n /**\r\n * Test invalid phone number input\r\n */\r\n async testInvalidPhoneInput(phoneNumber: string, countryCode: string = 'US'): Promise<void> {\r\n await selectCountryFromDropdown(countryCode);\r\n await typePhoneNumber(phoneNumber);\r\n await waitForValidation();\r\n const errorDisplayed = await isErrorDisplayed();\r\n if (!errorDisplayed) {\r\n throw new Error('Expected error to be displayed for invalid input');\r\n }\r\n },\r\n\r\n /**\r\n * Test country selection\r\n */\r\n async testCountrySelection(countryCode: string): Promise<void> {\r\n await selectCountryFromDropdown(countryCode);\r\n await waitForValidation();\r\n const selectedCode = await getSelectedCountryCode();\r\n if (selectedCode !== countryCode.toUpperCase()) {\r\n throw new Error(`Expected country ${countryCode} but got ${selectedCode}`);\r\n }\r\n },\r\n\r\n /**\r\n * Test clear button\r\n */\r\n async testClearButton(): Promise<void> {\r\n await typePhoneNumber('1234567890');\r\n await clickClearButton();\r\n await waitForValidation();\r\n const value = await getPhoneInputValue();\r\n if (value !== '') {\r\n throw new Error(`Expected empty value after clear but got: ${value}`);\r\n }\r\n }\r\n};\r\n\r\n","/**\r\n * Testing module for ngxsmk-tel-input\r\n */\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { NgxsmkTelInputService } from '../ngxsmk-tel-input.service';\r\nimport { MockNgxsmkTelInputService } from './mock-phone-service';\r\n\r\n/**\r\n * Testing module that provides mock services\r\n * Note: NgxsmkTelInputComponent is standalone and should be imported directly in test components\r\n */\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [],\r\n providers: [\r\n {\r\n provide: NgxsmkTelInputService,\r\n useClass: MockNgxsmkTelInputService\r\n }\r\n ]\r\n})\r\nexport class NgxsmkTelInputTestingModule {}\r\n\r\n","/**\r\n * Base verification service interface\r\n */\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { CountryCode } from 'libphonenumber-js';\r\n\r\nexport interface VerificationRequest {\r\n phoneNumber: string;\r\n country: CountryCode;\r\n method: 'sms' | 'voice' | 'whatsapp';\r\n}\r\n\r\nexport interface VerificationResponse {\r\n success: boolean;\r\n sid?: string;\r\n error?: string;\r\n expiresAt?: Date;\r\n}\r\n\r\nexport interface VerificationCheck {\r\n code: string;\r\n sid: string;\r\n}\r\n\r\nexport interface VerificationCheckResponse {\r\n success: boolean;\r\n verified: boolean;\r\n error?: string;\r\n}\r\n\r\nexport abstract class VerificationService {\r\n abstract verify(request: VerificationRequest): Observable<VerificationResponse>;\r\n abstract check(request: VerificationCheck): Observable<VerificationCheckResponse>;\r\n}\r\n\r\n","/**\r\n * Twilio verification service integration\r\n */\r\n\r\nimport { Injectable, Inject, Optional } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable, from } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { VerificationService, VerificationRequest, VerificationResponse, VerificationCheck, VerificationCheckResponse } from './verification.service';\r\n\r\nexport interface TwilioConfig {\r\n accountSid: string;\r\n authToken: string;\r\n serviceSid?: string;\r\n apiUrl?: string;\r\n}\r\n\r\nexport const TWILIO_CONFIG = 'TWILIO_CONFIG';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TwilioVerificationService extends VerificationService {\r\n private readonly apiUrl = 'https://verify.twilio.com/v2/Services';\r\n private config: TwilioConfig | null = null;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Optional() @Inject(TWILIO_CONFIG) config?: TwilioConfig\r\n ) {\r\n super();\r\n this.config = config || null;\r\n }\r\n\r\n setConfig(config: TwilioConfig): void {\r\n this.config = config;\r\n }\r\n\r\n verify(request: VerificationRequest): Observable<VerificationResponse> {\r\n if (!this.config) {\r\n throw new Error('Twilio configuration not provided');\r\n }\r\n\r\n const serviceSid = this.config.serviceSid;\r\n if (!serviceSid) {\r\n throw new Error('Twilio Service SID not configured');\r\n }\r\n\r\n const url = `${this.apiUrl}/${serviceSid}/Verifications`;\r\n const headers = this.getAuthHeaders();\r\n const body = {\r\n To: request.phoneNumber,\r\n Channel: request.method === 'whatsapp' ? 'whatsapp' : request.method\r\n };\r\n\r\n return this.http.post<any>(url, body, { headers }).pipe(\r\n map(response => ({\r\n success: true,\r\n sid: response.sid,\r\n expiresAt: new Date(Date.now() + 600000) // 10 minutes default\r\n })),\r\n catchError(error => {\r\n return from([{\r\n success: false,\r\n error: error.error?.message || 'Verification failed'\r\n }]);\r\n })\r\n );\r\n }\r\n\r\n check(request: VerificationCheck): Observable<VerificationCheckResponse> {\r\n if (!this.config) {\r\n throw new Error('Twilio configuration not provided');\r\n }\r\n\r\n const serviceSid = this.config.serviceSid;\r\n if (!serviceSid) {\r\n throw new Error('Twilio Service SID not configured');\r\n }\r\n\r\n const url = `${this.apiUrl}/${serviceSid}/VerificationCheck`;\r\n const headers = this.getAuthHeaders();\r\n const body = {\r\n To: request.code,\r\n Code: request.code\r\n };\r\n\r\n return this.http.post<any>(url, body, { headers }).pipe(\r\n map(response => ({\r\n success: true,\r\n verified: response.status === 'approved'\r\n })),\r\n catchError(error => {\r\n return from([{\r\n success: false,\r\n verified: false,\r\n error: error.error?.message || 'Verification check failed'\r\n }]);\r\n })\r\n );\r\n }\r\n\r\n private getAuthHeaders(): HttpHeaders {\r\n if (!this.config) {\r\n throw new Error('Twilio configuration not provided');\r\n }\r\n\r\n const auth = btoa(`${this.config.accountSid}:${this.config.authToken}`);\r\n return new HttpHeaders({\r\n 'Authorization': `Basic ${auth}`,\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Provide Twilio verification service\r\n */\r\nexport function provideTwilioVerification(config: TwilioConfig) {\r\n return [\r\n TwilioVerificationService,\r\n {\r\n provide: TWILIO_CONFIG,\r\n useValue: config\r\n }\r\n ];\r\n}\r\n\r\n","/**\r\n * Vonage (Nexmo) verification service integration\r\n */\r\n\r\nimport { Injectable, Inject, Optional } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable, from } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { VerificationService, VerificationRequest, VerificationResponse, VerificationCheck, VerificationCheckResponse } from './verification.service';\r\n\r\nexport interface VonageConfig {\r\n apiKey: string;\r\n apiSecret: string;\r\n brand?: string;\r\n apiUrl?: string;\r\n}\r\n\r\nexport const VONAGE_CONFIG = 'VONAGE_CONFIG';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class VonageVerificationService extends VerificationService {\r\n private readonly apiUrl = 'https://api.nexmo.com/verify';\r\n private config: VonageConfig | null = null;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Optional() @Inject(VONAGE_CONFIG) config?: VonageConfig\r\n ) {\r\n super();\r\n this.config = config || null;\r\n }\r\n\r\n setConfig(config: VonageConfig): void {\r\n this.config = config;\r\n }\r\n\r\n verify(request: VerificationRequest): Observable<VerificationResponse> {\r\n if (!this.config) {\r\n throw new Error('Vonage configuration not provided');\r\n }\r\n\r\n const url = `${this.apiUrl}/json`;\r\n const body = new URLSearchParams({\r\n api_key: this.config.apiKey,\r\n api_secret: this.config.apiSecret,\r\n number: request.phoneNumber,\r\n brand: this.config.brand || 'App',\r\n workflow_id: request.method === 'voice' ? '6' : '1'\r\n });\r\n\r\n const headers = new HttpHeaders({\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n });\r\n\r\n return this.http.post<any>(url, body.toString(), { headers }).pipe(\r\n map(response => {\r\n if (response.status === '0') {\r\n return {\r\n success: true,\r\n sid: response.request_id,\r\n expiresAt: new Date(Date.now() + 300000) // 5 minutes default\r\n };\r\n } else {\r\n return {\r\n success: false,\r\n error: response.error_text || 'Verification failed'\r\n };\r\n }\r\n }),\r\n catchError(error => {\r\n return from([{\r\n success: false,\r\n error: error.error?.message || 'Verification failed'\r\n }]);\r\n })\r\n );\r\n }\r\n\r\n check(request: VerificationCheck): Observable<VerificationCheckResponse> {\r\n if (!this.config) {\r\n throw new Error('Vonage configuration not provided');\r\n }\r\n\r\n const url = `${this.apiUrl}/check/json`;\r\n const body = new URLSearchParams({\r\n api_key: this.config.apiKey,\r\n api_secret: this.config.apiSecret,\r\n request_id: request.sid,\r\n code: request.code\r\n });\r\n\r\n const headers = new HttpHeaders({\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n });\r\n\r\n return this.http.post<any>(url, body.toString(), { headers }).pipe(\r\n map(response => {\r\n if (response.status === '0') {\r\n return {\r\n success: true,\r\n verified: true\r\n };\r\n } else {\r\n return {\r\n success: false,\r\n verified: false,\r\n error: response.error_text || 'Verification check failed'\r\n };\r\n }\r\n }),\r\n catchError(error => {\r\n return from([{\r\n success: false,\r\n verified: false,\r\n error: error.error?.message || 'Verification check failed'\r\n }]);\r\n })\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Provide Vonage verification service\r\n */\r\nexport function provideVonageVerification(config: VonageConfig) {\r\n return [\r\n VonageVerificationService,\r\n {\r\n provide: VONAGE_CONFIG,\r\n useValue: config\r\n }\r\n ];\r\n}\r\n\r\n","/**\r\n * AWS SNS verification service integration\r\n */\r\n\r\nimport { Injectable, Inject, Optional } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable, from } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { VerificationService, VerificationRequest, VerificationResponse, VerificationCheck, VerificationCheckResponse } from './verification.service';\r\n\r\nexport interface AwsSnsConfig {\r\n accessKeyId: string;\r\n secretAccessKey: string;\r\n region: string;\r\n apiUrl?: string;\r\n}\r\n\r\nexport const AWS_SNS_CONFIG = 'AWS_SNS_CONFIG';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AwsSnsVerificationService extends VerificationService {\r\n private config: AwsSnsConfig | null = null;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Optional() @Inject(AWS_SNS_CONFIG) config?: AwsSnsConfig\r\n ) {\r\n super();\r\n this.config = config || null;\r\n }\r\n\r\n setConfig(config: AwsSnsConfig): void {\r\n this.config = config;\r\n }\r\n\r\n verify(request: VerificationRequest): Observable<VerificationResponse> {\r\n if (!this.config) {\r\n throw new Error('AWS SNS configuration not provided');\r\n }\r\n\r\n // Generate OTP code (6 digits)\r\n const code = Math.floor(100000 + Math.random() * 900000).toString();\r\n \r\n // In a real implementation, you would:\r\n // 1. Store the code in a database/cache with the phone number\r\n // 2. Send SMS via AWS SNS\r\n // 3. Return the verification ID\r\n\r\n // For now, we'll simulate the API call\r\n const message = `Your verification code is: ${code}`;\r\n \r\n // Note: Actual AWS SNS integration requires AWS SDK and proper authentication\r\n // This is a simplified example\r\n return from(this.sendSmsViaSns(request.phoneNumber, message)).pipe(\r\n map(() => ({\r\n success: true,\r\n sid: `aws-sns-${Date.now()}`,\r\n expiresAt: new Date(Date.now() + 600000) // 10 minutes\r\n })),\r\n catchError(error => {\r\n return from([{\r\n success: false,\r\n error: error.message || 'SMS sending failed'\r\n }]);\r\n })\r\n );\r\n }\r\n\r\n check(request: VerificationCheck): Observable<VerificationCheckResponse> {\r\n // In a real implementation, you would:\r\n // 1. Retrieve the stored code for the verification ID\r\n // 2. Compare with the provided code\r\n // 3. Return verification result\r\n\r\n // This is a simplified example\r\n return from([{\r\n success: true,\r\n verified: true // In real implementation, check against stored code\r\n }]);\r\n }\r\n\r\n private async sendSmsViaSns(phoneNumber: string, message: string): Promise<void> {\r\n // Actual AWS SNS implementation would use AWS SDK\r\n // This is a placeholder\r\n if (!this.config) {\r\n throw new Error('AWS SNS configuration not provided');\r\n }\r\n\r\n // Example AWS SNS API call (simplified)\r\n // const sns = new AWS.SNS({\r\n // accessKeyId: this.config.accessKeyId,\r\n // secretAccessKey: this.config.secretAccessKey,\r\n // region: this.config.region\r\n // });\r\n // \r\n // await sns.publish({\r\n // PhoneNumber: phoneNumber,\r\n // Message: message\r\n // }).promise();\r\n\r\n // For now, just simulate success\r\n return Promise.resolve();\r\n }\r\n}\r\n\r\n/**\r\n * Provide AWS SNS verification service\r\n */\r\nexport function provideAwsSnsVerification(config: AwsSnsConfig) {\r\n return [\r\n AwsSnsVerificationService,\r\n {\r\n provide: AWS_SNS_CONFIG,\r\n useValue: config\r\n }\r\n ];\r\n}\r\n\r\n","/**\r\n * Enhanced TypeScript types and type guards for ngxsmk-tel-input\r\n */\r\n\r\nimport { CountryCode } from 'libphonenumber-js';\r\nimport { ParseResult, ParseWithInvalidResult } from './ngxsmk-tel-input.service';\r\nimport { CarrierInfo, FormatSuggestion } from './phone-intelligence.service';\r\n\r\n/**\r\n * Type guard to check if a value is a valid CountryCode\r\n */\r\nexport function isCountryCode(value: unknown): value is CountryCode {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n \r\n // Basic validation - ISO 3166-1 alpha-2 codes are 2 uppercase letters\r\n return /^[A-Z]{2}$/.test(value);\r\n}\r\n\r\n/**\r\n * Type guard to check if a value is a valid phone number string\r\n */\r\nexport function isPhoneNumberString(value: unknown): value is string {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n \r\n // Basic validation - contains digits and optionally + or spaces/dashes\r\n return /^[\\d\\s\\-+()]+$/.test(value) && value.replace(/\\D/g, '').length >= 3;\r\n}\r\n\r\n/**\r\n * Type guard to check if ParseResult is valid\r\n */\r\nexport function isValidParseResult(result: ParseResult | ParseWithInvalidResult): result is ParseResult & { e164: string } {\r\n return result.isValid === true && result.e164 !== null;\r\n}\r\n\r\n/**\r\n * Type guard to check if value is E.164 format\r\n */\r\nexport function isE164Format(value: unknown): value is string {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n \r\n // E.164 format: + followed by 1-15 digits\r\n return /^\\+[1-9]\\d{1,14}$/.test(value);\r\n}\r\n\r\n/**\r\n * Type guard to check if CarrierInfo is complete\r\n */\r\nexport function isCompleteCarrierInfo(info: CarrierInfo | null): info is CarrierInfo {\r\n return info !== null && info.type !== 'UNKNOWN';\r\n}\r\n\r\n/**\r\n * Type guard to check if FormatSuggestion has high confidence\r\n */\r\nexport function isHighConfidenceSuggestion(suggestion: FormatSuggestion | null): suggestion is FormatSuggestion {\r\n return suggestion !== null && suggestion.confidence >= 0.7;\r\n}\r\n\r\n/**\r\n * Strict type for phone input configuration\r\n */\r\nexport interface StrictPhoneInputConfig {\r\n readonly initialCountry: CountryCode | 'auto';\r\n readonly preferredCountries: readonly CountryCode[];\r\n readonly onlyCountries?: readonly CountryCode[];\r\n readonly separateDialCode: boolean;\r\n readonly allowDropdown: boolean;\r\n readonly nationalDisplay: 'formatted' | 'digits';\r\n readonly formatWhenValid: 'off' | 'blur' | 'typing';\r\n readonly size: 'sm' | 'md' | 'lg';\r\n readonly variant: 'outline' | 'filled' | 'underline';\r\n readonly theme: 'light' | 'dark' | 'auto';\r\n readonly disabled: boolean;\r\n readonly enableIntelligence: boolean;\r\n readonly enableFormatSuggestions: boolean;\r\n}\r\n\r\n/**\r\n * Type-safe phone input event\r\n */\r\nexport interface PhoneInputEvent {\r\n readonly raw: string;\r\n readonly e164: string | null;\r\n readonly iso2: CountryCode;\r\n readonly isValid: boolean;\r\n readonly timestamp: number;\r\n}\r\n\r\n/**\r\n * Type-safe country change event\r\n */\r\nexport interface CountryChangeEvent {\r\n readonly iso2: CountryCode;\r\n readonly previousIso2?: CountryCode;\r\n readonly timestamp: number;\r\n}\r\n\r\n/**\r\n * Type-safe validation event\r\n */\r\nexport interface ValidationEvent {\r\n readonly isValid: boolean;\r\n readonly errors: readonly string[];\r\n readonly timestamp: number;\r\n}\r\n\r\n/**\r\n * Utility type to extract input signal types\r\n */\r\nexport type InputSignalType<T> = T extends import('@angular/core').InputSignal<infer U> ? U : never;\r\n\r\n/**\r\n * Utility type to extract output signal types\r\n */\r\nexport type OutputSignalType<T> = T extends import('@angular/core').OutputEmitterRef<infer U> ? U : never;\r\n\r\n/**\r\n * Branded type for E.164 phone numbers\r\n */\r\nexport type E164PhoneNumber = string & { readonly __brand: 'E164PhoneNumber' };\r\n\r\n/**\r\n * Create a branded E.164 phone number\r\n */\r\nexport function createE164PhoneNumber(value: string): E164PhoneNumber | null {\r\n if (isE164Format(value)) {\r\n return value as E164PhoneNumber;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Branded type for national phone numbers\r\n */\r\nexport type NationalPhoneNumber = string & { readonly __brand: 'NationalPhoneNumber' };\r\n\r\n/**\r\n * Create a branded national phone number\r\n */\r\nexport function createNationalPhoneNumber(value: string, country: CountryCode): NationalPhoneNumber | null {\r\n if (isPhoneNumberString(value)) {\r\n return value as NationalPhoneNumber;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Type-safe phone number validation result\r\n */\r\nexport interface TypedValidationResult {\r\n readonly isValid: boolean;\r\n readonly e164: E164PhoneNumber | null;\r\n readonly national: NationalPhoneNumber | null;\r\n readonly country: CountryCode;\r\n readonly errors: readonly ValidationError[];\r\n}\r\n\r\n/**\r\n * Validation error with type information\r\n */\r\nexport interface ValidationError {\r\n readonly code: 'REQUIRED' | 'INVALID' | 'INVALID_COUNTRY_CODE' | 'TOO_SHORT' | 'TOO_LONG';\r\n readonly message: string;\r\n readonly field?: string;\r\n}\r\n\r\n/**\r\n * Create a typed validation result\r\n */\r\nexport function createTypedValidationResult(\r\n parseResult: ParseResult,\r\n country: CountryCode\r\n): TypedValidationResult {\r\n const errors: ValidationError[] = [];\r\n \r\n if (!parseResult.isValid) {\r\n if (parseResult.e164 === null) {\r\n errors.push({\r\n code: 'INVALID',\r\n message: 'Invalid phone number format'\r\n });\r\n }\r\n }\r\n\r\n return {\r\n isValid: parseResult.isValid,\r\n e164: parseResult.e164 ? (parseResult.e164 as E164PhoneNumber) : null,\r\n national: parseResult.national ? (parseResult.national as NationalPhoneNumber) : null,\r\n country,\r\n errors: errors as readonly ValidationError[]\r\n };\r\n}\r\n\r\n/**\r\n * Assert that a value is a CountryCode (throws if not)\r\n */\r\nexport function assertCountryCode(value: unknown): asserts value is CountryCode {\r\n if (!isCountryCode(value)) {\r\n throw new TypeError(`Expected CountryCode, got ${typeof value}: ${value}`);\r\n }\r\n}\r\n\r\n/**\r\n * Assert that a value is E.164 format (throws if not)\r\n */\r\nexport function assertE164Format(value: unknown): asserts value is E164PhoneNumber {\r\n if (!isE164Format(value)) {\r\n throw new TypeError(`Expected E.164 format phone number, got: ${value}`);\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":"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"}