@input-kit/phone 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/countries.ts","../src/labels.ts","../src/utils.ts","../src/usePhoneInput.ts","../src/PhoneInput.tsx"],"names":["PRIORITY_COUNTRIES","supportedCountries","getCountries","worldCountryMap","worldCountries","country","FALLBACK_COUNTRIES","normalizeDialCode","root","suffix","normalizedRoot","digitsOnlySuffix","codeToFlag","code","char","buildDialCodes","fallbackDialCode","dialCodes","dialCode","getCountryFormat","example","getExampleNumber","examples","getCountryPriority","index","generatedCountries","fallback","getCountryCallingCode","left","right","priorityDelta","countries","countryMap","countriesByDialCode","map","matches","dialCodeMatchers","displayNameCache","normalizeLocales","locale","getDisplayNames","locales","cacheKey","cached","displayNames","normalizeLookupDialCode","digits","getCountryByCode","getLocalizedCountryName","localizeCountry","displayName","localizeCountries","list","getCountriesByDialCode","getCountryByDialCode","getCountryOptions","params","allowed","excluded","preferred","leftIndex","rightIndex","detectCountryFromPhone","phone","trimmed","normalized","parsedPhone","parsePhoneNumberFromString","entry","DEFAULT_PHONE_INPUT_LABELS","LABELS_BY_LANGUAGE","getPrimaryLanguage","firstLocale","resolvePhoneInputLabels","overrides","language","localizedDefaults","normalizePhoneInput","cleanPhone","getCountryCode","getMaxNationalDigits","formatPhone","AsYouType","unformatPhone","formattedPhone","validatePhoneLength","validateLength","validatePhone","customValidator","countryCode","isValidPhoneNumber","isPossiblePhoneNumber","addDialCode","removeDialCode","primaryDialDigits","dialDigits","filterCountries","query","preferredCountries","lowerQuery","a","b","aPreferred","bPreferred","getCountryDisplayName","getPlaceholder","stripNonDigits","isInternationalFormat","extractDialCode","match","detectCountry","formatPhoneNumber","format","nationalNumber","formattedNational","parseToE164","getNationalNumber","detectedCountry","validationFailure","reason","message","validationSuccess","validatePhoneNumber","required","maxDigits","nationalDigits","parsePhoneValue","parsed","isPhoneNumberComplete","formatAsYouType","normalizePhoneNumber","phoneNumbersEqual","getCountryDisplayLabel","includeDialCode","label","limitInputLength","isInternational","maxLength","limited","countDigitsBeforePosition","value","position","getCaretPositionFromDigitCount","digitCount","seenDigits","usePhoneInput","options","controlledValue","defaultValue","onChange","onCountryChange","onBlur","onFocus","defaultCountry","excludeCountries","excludedCountries","onlyCountries","allowedCountries","autoDetect","autoDetectCountry","formatOnType","validator","onValidationChange","labels","resolvedOnlyCountries","resolvedExcludeCountries","resolvedAutoDetect","isControlled","inputRef","useRef","pendingCaretDigitIndexRef","previousDefaultCountryRef","availableCountries","useMemo","filtered","c","localizedCountries","resolvedLabels","initialCountry","candidate","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","getOutputCountry","useCallback","nextCountry","useEffect","defaultCountryChanged","countryStillAvailable","detected","fullPhone","validation","localizedCountry","filteredCountries","useLayoutEffect","nextDigitIndex","input","caretPosition","setPhone","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","rawCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur","getCountryOptionId","getCountryOptionProps","optionCountry","ChevronUpIcon","size","jsx","ChevronDownIcon","PhoneInput","forwardRef","props","ref","inputClassName","selectorClassName","containerClassName","searchable","placeholder","disabled","readOnly","name","id","ariaLabel","ariaLabelledBy","containerRef","optionRefs","highlightedIndex","setHighlightedIndex","listboxId","useId","inputProps","countryButtonProps","dropdownProps","isValid","hookInputRef","mergedInputRef","element","focus","blur","handleCountryClick","handleCountryKeyDown","e","nextIndex","handlePointerDown","target","handleFocusIn","useImperativeHandle","activeCountry","activeDescendantId","jsxs","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import { getCountries, getCountryCallingCode, getExampleNumber, parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\nimport examples from 'libphonenumber-js/mobile/examples';\r\nimport worldCountries from 'world-countries';\r\n\r\nexport interface Country {\r\n code: string;\r\n name: string;\r\n dialCode: string;\r\n dialCodes: string[];\r\n flag: string;\r\n format?: string;\r\n displayName?: string;\r\n}\r\n\r\nconst PRIORITY_COUNTRIES = [\r\n 'US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT', 'ES', 'JP', 'CN', 'IN', 'BR', 'MX', 'KR', 'NL',\r\n 'CH', 'SE', 'AE', 'SG', 'ZA', 'NG', 'SA', 'TR', 'ID', 'PH', 'TH', 'VN', 'MY', 'NZ', 'AR'\r\n];\r\n\r\nconst supportedCountries = new Set(getCountries());\r\nconst worldCountryMap = new Map(worldCountries.map((country) => [country.cca2, country]));\r\nconst FALLBACK_COUNTRIES: Record<string, { name: string; dialCode?: string; flag?: string }> = {\r\n AC: { name: 'Ascension Island', dialCode: '+247' },\r\n TA: { name: 'Tristan da Cunha', dialCode: '+290' },\r\n BQ: { name: 'Caribbean Netherlands', dialCode: '+599' },\r\n};\r\n\r\nfunction normalizeDialCode(root: string, suffix: string) {\r\n const normalizedRoot = root.startsWith('+') ? root : `+${root}`;\r\n const digitsOnlySuffix = suffix.replace(/\\D/g, '');\r\n return `${normalizedRoot}${digitsOnlySuffix}`;\r\n}\r\n\r\nfunction codeToFlag(code: string): string {\r\n return code\r\n .toUpperCase()\r\n .replace(/./g, (char) => String.fromCodePoint(127397 + char.charCodeAt(0)));\r\n}\r\n\r\nfunction buildDialCodes(country: (typeof worldCountries)[number] | undefined, fallbackDialCode: string) {\r\n const root = country?.idd?.root;\r\n if (!root) {\r\n return [fallbackDialCode];\r\n }\r\n\r\n const suffixes = country.idd?.suffixes?.length ? country.idd.suffixes : [''];\r\n const dialCodes = suffixes\r\n .map((suffix) => normalizeDialCode(root, suffix))\r\n .filter((dialCode) => /^\\+\\d+$/.test(dialCode));\r\n\r\n return Array.from(new Set([fallbackDialCode, ...(dialCodes.length ? dialCodes : [])]));\r\n}\r\n\r\nfunction getCountryFormat(code: CountryCode) {\r\n const example = getExampleNumber(code, examples);\r\n return example ? example.formatNational().replace(/\\d/g, '#') : undefined;\r\n}\r\n\r\nfunction getCountryPriority(code: string) {\r\n const index = PRIORITY_COUNTRIES.indexOf(code);\r\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\r\n}\r\n\r\nconst generatedCountries = Array.from(supportedCountries)\r\n .map<Country>((code) => {\r\n const country = worldCountryMap.get(code);\r\n const fallback = FALLBACK_COUNTRIES[code];\r\n const dialCode = fallback?.dialCode ?? `+${getCountryCallingCode(code as CountryCode)}`;\r\n const dialCodes = buildDialCodes(country, dialCode);\r\n\r\n return {\r\n code,\r\n name: country?.name.common ?? fallback?.name ?? code,\r\n dialCode,\r\n dialCodes,\r\n flag: country?.flag || fallback?.flag || codeToFlag(code),\r\n format: getCountryFormat(code as CountryCode),\r\n } satisfies Country;\r\n })\r\n .sort((left, right) => {\r\n const priorityDelta = getCountryPriority(left.code) - getCountryPriority(right.code);\r\n return priorityDelta !== 0 ? priorityDelta : left.name.localeCompare(right.name);\r\n });\r\n\r\nexport const countries: Country[] = generatedCountries;\r\n\r\nexport const countryMap = new Map(countries.map((country) => [country.code, country]));\r\n\r\nconst countriesByDialCode = countries.reduce((map, country) => {\r\n for (const dialCode of country.dialCodes) {\r\n const matches = map.get(dialCode) ?? [];\r\n matches.push(country);\r\n map.set(dialCode, matches);\r\n }\r\n\r\n return map;\r\n}, new Map<string, Country[]>());\r\n\r\nconst dialCodeMatchers = countries\r\n .flatMap((country) => country.dialCodes.map((dialCode) => ({ dialCode, country })))\r\n .sort((left, right) => right.dialCode.length - left.dialCode.length);\r\n\r\nconst displayNameCache = new Map<string, Intl.DisplayNames>();\r\n\r\nfunction normalizeLocales(locale?: string | readonly string[]) {\r\n return Array.isArray(locale) ? [...locale] : locale ? [locale] : [];\r\n}\r\n\r\nfunction getDisplayNames(locale?: string | readonly string[]) {\r\n const locales = normalizeLocales(locale);\r\n if (locales.length === 0 || typeof Intl === 'undefined' || typeof Intl.DisplayNames === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n const cacheKey = locales.join('|');\r\n const cached = displayNameCache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n try {\r\n const displayNames = new Intl.DisplayNames(locales, { type: 'region' });\r\n displayNameCache.set(cacheKey, displayNames);\r\n return displayNames;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction normalizeLookupDialCode(dialCode: string) {\r\n const digits = dialCode.replace(/\\D/g, '');\r\n return digits ? `+${digits}` : '';\r\n}\r\n\r\nexport function getCountryByCode(code: string): Country | undefined {\r\n return countryMap.get(code.toUpperCase());\r\n}\r\n\r\nexport function getLocalizedCountryName(\r\n country: Country | undefined,\r\n locale?: string | readonly string[]\r\n): string | undefined {\r\n if (!country) {\r\n return undefined;\r\n }\r\n\r\n const displayNames = getDisplayNames(locale);\r\n return displayNames?.of(country.code) ?? country.displayName ?? country.name;\r\n}\r\n\r\nexport function localizeCountry(\r\n country: Country | undefined,\r\n locale?: string | readonly string[]\r\n): Country | undefined {\r\n if (!country) {\r\n return undefined;\r\n }\r\n\r\n const displayName = getLocalizedCountryName(country, locale);\r\n return displayName ? { ...country, displayName } : country;\r\n}\r\n\r\nexport function localizeCountries(\r\n list: Country[],\r\n locale?: string | readonly string[]\r\n): Country[] {\r\n if (!locale) {\r\n return list;\r\n }\r\n\r\n return list.map((country) => localizeCountry(country, locale) ?? country);\r\n}\r\n\r\nexport function getCountriesByDialCode(dialCode: string): Country[] {\r\n return countriesByDialCode.get(normalizeLookupDialCode(dialCode)) ?? [];\r\n}\r\n\r\nexport function getCountryByDialCode(dialCode: string): Country | undefined {\r\n return getCountriesByDialCode(dialCode)[0];\r\n}\r\n\r\nexport interface CountryOption {\r\n value: string;\r\n label: string;\r\n dialCode: string;\r\n flag: string;\r\n}\r\n\r\nexport interface GetCountryOptionsParams {\r\n locale?: string | readonly string[];\r\n preferredCountries?: string[];\r\n excludeCountries?: string[];\r\n onlyCountries?: string[];\r\n}\r\n\r\nexport function getCountryOptions(params: GetCountryOptionsParams = {}): CountryOption[] {\r\n let list = countries;\r\n\r\n if (params.onlyCountries?.length) {\r\n const allowed = new Set(params.onlyCountries.map((code) => code.toUpperCase()));\r\n list = list.filter((country) => allowed.has(country.code));\r\n }\r\n\r\n if (params.excludeCountries?.length) {\r\n const excluded = new Set(params.excludeCountries.map((code) => code.toUpperCase()));\r\n list = list.filter((country) => !excluded.has(country.code));\r\n }\r\n\r\n list = localizeCountries(list, params.locale);\r\n\r\n if (params.preferredCountries?.length) {\r\n const preferred = params.preferredCountries.map((code) => code.toUpperCase());\r\n list = [...list].sort((left, right) => {\r\n const leftIndex = preferred.indexOf(left.code);\r\n const rightIndex = preferred.indexOf(right.code);\r\n if (leftIndex !== -1 && rightIndex !== -1) {\r\n return leftIndex - rightIndex;\r\n }\r\n if (leftIndex !== -1) {\r\n return -1;\r\n }\r\n if (rightIndex !== -1) {\r\n return 1;\r\n }\r\n return (left.displayName ?? left.name).localeCompare(right.displayName ?? right.name);\r\n });\r\n }\r\n\r\n return list.map((country) => ({\r\n value: country.code,\r\n label: `${country.displayName ?? country.name} (${country.dialCode})`,\r\n dialCode: country.dialCode,\r\n flag: country.flag,\r\n }));\r\n}\r\n\r\nexport function detectCountryFromPhone(phone: string): Country | undefined {\r\n const trimmed = phone.trim();\r\n\r\n if (!trimmed) {\r\n return undefined;\r\n }\r\n\r\n const normalized = trimmed.startsWith('+')\r\n ? `+${trimmed.replace(/\\D/g, '')}`\r\n : trimmed.startsWith('00')\r\n ? `+${trimmed.slice(2).replace(/\\D/g, '')}`\r\n : '';\r\n\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n\r\n const parsedPhone = parsePhoneNumberFromString(normalized);\r\n if (parsedPhone?.country) {\r\n return getCountryByCode(parsedPhone.country);\r\n }\r\n\r\n return dialCodeMatchers.find((entry) => normalized.startsWith(entry.dialCode))?.country;\r\n}\r\n","import type { PhoneInputLabels } from './types';\r\n\r\nexport const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels = {\r\n selectCountry: 'Select country',\r\n countrySearchPlaceholder: 'Search countries...',\r\n noCountriesFound: 'No countries found',\r\n searchCountriesAriaLabel: 'Search countries',\r\n countryOptionsAriaLabel: 'Country options',\r\n countryButtonAriaLabel: 'Open country selector',\r\n};\r\n\r\nconst LABELS_BY_LANGUAGE: Record<string, Partial<PhoneInputLabels>> = {\r\n en: DEFAULT_PHONE_INPUT_LABELS,\r\n fr: {\r\n selectCountry: 'Choisir un pays',\r\n countrySearchPlaceholder: 'Rechercher un pays...',\r\n noCountriesFound: 'Aucun pays trouvé',\r\n searchCountriesAriaLabel: 'Rechercher des pays',\r\n countryOptionsAriaLabel: 'Options de pays',\r\n countryButtonAriaLabel: 'Ouvrir le sélecteur de pays',\r\n },\r\n de: {\r\n selectCountry: 'Land auswählen',\r\n countrySearchPlaceholder: 'Land suchen...',\r\n noCountriesFound: 'Keine Länder gefunden',\r\n searchCountriesAriaLabel: 'Länder suchen',\r\n countryOptionsAriaLabel: 'Länderoptionen',\r\n countryButtonAriaLabel: 'Länderauswahl öffnen',\r\n },\r\n es: {\r\n selectCountry: 'Seleccionar país',\r\n countrySearchPlaceholder: 'Buscar país...',\r\n noCountriesFound: 'No se encontraron países',\r\n searchCountriesAriaLabel: 'Buscar países',\r\n countryOptionsAriaLabel: 'Opciones de país',\r\n countryButtonAriaLabel: 'Abrir selector de país',\r\n },\r\n pt: {\r\n selectCountry: 'Selecionar país',\r\n countrySearchPlaceholder: 'Pesquisar país...',\r\n noCountriesFound: 'Nenhum país encontrado',\r\n searchCountriesAriaLabel: 'Pesquisar países',\r\n countryOptionsAriaLabel: 'Opções de país',\r\n countryButtonAriaLabel: 'Abrir seletor de país',\r\n },\r\n it: {\r\n selectCountry: 'Seleziona paese',\r\n countrySearchPlaceholder: 'Cerca paese...',\r\n noCountriesFound: 'Nessun paese trovato',\r\n searchCountriesAriaLabel: 'Cerca paesi',\r\n countryOptionsAriaLabel: 'Opzioni paese',\r\n countryButtonAriaLabel: 'Apri selettore paese',\r\n },\r\n ja: {\r\n selectCountry: '国を選択',\r\n countrySearchPlaceholder: '国を検索...',\r\n noCountriesFound: '国が見つかりません',\r\n searchCountriesAriaLabel: '国を検索',\r\n countryOptionsAriaLabel: '国の候補',\r\n countryButtonAriaLabel: '国のセレクターを開く',\r\n },\r\n ko: {\r\n selectCountry: '국가 선택',\r\n countrySearchPlaceholder: '국가 검색...',\r\n noCountriesFound: '국가를 찾을 수 없습니다',\r\n searchCountriesAriaLabel: '국가 검색',\r\n countryOptionsAriaLabel: '국가 옵션',\r\n countryButtonAriaLabel: '국가 선택기 열기',\r\n },\r\n zh: {\r\n selectCountry: '选择国家',\r\n countrySearchPlaceholder: '搜索国家...',\r\n noCountriesFound: '未找到国家',\r\n searchCountriesAriaLabel: '搜索国家',\r\n countryOptionsAriaLabel: '国家选项',\r\n countryButtonAriaLabel: '打开国家选择器',\r\n },\r\n ar: {\r\n selectCountry: 'اختر الدولة',\r\n countrySearchPlaceholder: 'ابحث عن دولة...',\r\n noCountriesFound: 'لم يتم العثور على دول',\r\n searchCountriesAriaLabel: 'ابحث عن الدول',\r\n countryOptionsAriaLabel: 'خيارات الدول',\r\n countryButtonAriaLabel: 'افتح محدد الدولة',\r\n },\r\n hi: {\r\n selectCountry: 'देश चुनें',\r\n countrySearchPlaceholder: 'देश खोजें...',\r\n noCountriesFound: 'कोई देश नहीं मिला',\r\n searchCountriesAriaLabel: 'देश खोजें',\r\n countryOptionsAriaLabel: 'देश विकल्प',\r\n countryButtonAriaLabel: 'देश चयन खोलें',\r\n },\r\n};\r\n\r\nfunction getPrimaryLanguage(locale?: string | readonly string[]): string | undefined {\r\n const locales = Array.isArray(locale) ? locale : locale ? [locale] : [];\r\n const firstLocale = locales.find(Boolean);\r\n return firstLocale ? firstLocale.toLowerCase().split('-')[0] : undefined;\r\n}\r\n\r\nexport function resolvePhoneInputLabels(\r\n locale?: string | readonly string[],\r\n overrides?: Partial<PhoneInputLabels>\r\n): PhoneInputLabels {\r\n const language = getPrimaryLanguage(locale);\r\n const localizedDefaults = language ? LABELS_BY_LANGUAGE[language] : undefined;\r\n\r\n return {\r\n ...DEFAULT_PHONE_INPUT_LABELS,\r\n ...localizedDefaults,\r\n ...overrides,\r\n };\r\n}","import type { Country } from './countries';\r\nimport { countries, detectCountryFromPhone, getCountryByCode } from './countries';\r\nimport {\r\n AsYouType,\r\n isPossiblePhoneNumber,\r\n isValidPhoneNumber,\r\n parsePhoneNumberFromString,\r\n validatePhoneNumberLength as validateLength,\r\n type CountryCode,\r\n} from 'libphonenumber-js';\r\n\r\ntype MaybeCountry = Country | null | undefined;\r\n\r\nexport type ValidationReason = 'required' | 'too_short' | 'too_long' | 'invalid' | null;\r\n\r\nexport interface ValidationResult {\r\n isValid: boolean;\r\n reason: ValidationReason;\r\n message: string | null;\r\n /** Alias for `message` (compatibility) */\r\n error: string | null;\r\n}\r\n\r\nexport interface ParsedPhoneValue {\r\n country: Country | undefined;\r\n nationalNumber: string;\r\n e164: string | undefined;\r\n isValid: boolean;\r\n}\r\n\r\nfunction normalizePhoneInput(phone: string): string {\r\n const trimmed = phone.trim();\r\n const digits = cleanPhone(trimmed);\r\n\r\n if (trimmed.startsWith('+') && !digits) {\r\n return '+';\r\n }\r\n\r\n if (!digits) {\r\n return '';\r\n }\r\n\r\n return trimmed.startsWith('+') ? `+${digits}` : digits;\r\n}\r\n\r\nfunction getCountryCode(country: MaybeCountry): CountryCode | undefined {\r\n return country?.code as CountryCode | undefined;\r\n}\r\n\r\nfunction getMaxNationalDigits(country: MaybeCountry): number | undefined {\r\n return country?.format?.replace(/[^#]/g, '').length;\r\n}\r\n\r\n/**\r\n * Remove all non-digit characters from phone number\r\n */\r\nexport function cleanPhone(phone: string): string {\r\n return phone.replace(/\\D/g, '');\r\n}\r\n\r\n/**\r\n * Format phone number according to country format\r\n */\r\nexport function formatPhone(phone: string, country: MaybeCountry): string {\r\n if (!phone) return phone;\r\n\r\n const formatter = new AsYouType(getCountryCode(country));\r\n return formatter.input(normalizePhoneInput(phone));\r\n}\r\n\r\n/**\r\n * Get raw phone number without formatting\r\n */\r\nexport function unformatPhone(formattedPhone: string): string {\r\n return normalizePhoneInput(formattedPhone);\r\n}\r\n\r\n/**\r\n * Validate phone number length based on country\r\n */\r\nexport function validatePhoneLength(phone: string, country: MaybeCountry): boolean {\r\n if (!phone || !country) return false;\r\n\r\n if (phone.trim().startsWith('+')) {\r\n return validateLength(normalizePhoneInput(phone)) === undefined;\r\n }\r\n\r\n return validateLength(cleanPhone(phone), getCountryCode(country)) === undefined;\r\n}\r\n\r\n/**\r\n * Validate phone number format\r\n */\r\nexport function validatePhone(\r\n phone: string,\r\n country: MaybeCountry,\r\n customValidator?: (phone: string, country: Country | undefined) => boolean\r\n): boolean {\r\n if (!phone) return false;\r\n \r\n if (customValidator) {\r\n return customValidator(phone, country ?? undefined);\r\n }\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n const countryCode = getCountryCode(country);\r\n\r\n if (!countryCode) {\r\n return isPossiblePhoneNumber(normalized.startsWith('+') ? normalized : `+${cleanPhone(normalized)}`);\r\n }\r\n\r\n if (normalized.startsWith('+')) {\r\n return isValidPhoneNumber(normalized);\r\n }\r\n\r\n return isValidPhoneNumber(cleanPhone(normalized), countryCode);\r\n}\r\n\r\n/**\r\n * Add dial code to phone number\r\n */\r\nexport function addDialCode(phone: string, country: MaybeCountry): string {\r\n if (!country) return phone;\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n if (!normalized) return '';\r\n if (normalized === '+') return '';\r\n if (normalized.startsWith('+')) return normalized;\r\n\r\n const digits = cleanPhone(normalized);\r\n const matchingDialCode = country.dialCodes.find((dialCode) => digits.startsWith(dialCode.replace('+', '')));\r\n return matchingDialCode ? `+${digits}` : `${country.dialCode}${digits}`;\r\n}\r\n\r\n/**\r\n * Remove dial code from phone number\r\n */\r\nexport function removeDialCode(phone: string, country: MaybeCountry): string {\r\n if (!country) return phone;\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n const digits = cleanPhone(normalized);\r\n const primaryDialDigits = cleanPhone(country.dialCode);\r\n\r\n if (digits.startsWith(primaryDialDigits)) {\r\n return digits.slice(primaryDialDigits.length);\r\n }\r\n\r\n for (const dialCode of country.dialCodes) {\r\n const dialDigits = dialCode.replace('+', '');\r\n if (digits.startsWith(dialDigits)) {\r\n return digits.slice(dialDigits.length);\r\n }\r\n }\r\n\r\n return digits;\r\n}\r\n\r\n/**\r\n * Filter countries by search query\r\n */\r\nexport function filterCountries(\r\n countries: Country[],\r\n query: string,\r\n preferredCountries?: string[]\r\n): Country[] {\r\n const lowerQuery = query.toLowerCase().trim();\r\n \r\n if (!lowerQuery) {\r\n // Sort by preferred countries first\r\n if (preferredCountries?.length) {\r\n return [...countries].sort((a, b) => {\r\n const aPreferred = preferredCountries.indexOf(a.code);\r\n const bPreferred = preferredCountries.indexOf(b.code);\r\n if (aPreferred !== -1 && bPreferred !== -1) return aPreferred - bPreferred;\r\n if (aPreferred !== -1) return -1;\r\n if (bPreferred !== -1) return 1;\r\n return (a.displayName ?? a.name).localeCompare(b.displayName ?? b.name);\r\n });\r\n }\r\n return countries;\r\n }\r\n \r\n return countries.filter(\r\n country =>\r\n country.name.toLowerCase().includes(lowerQuery) ||\r\n (country.displayName ?? '').toLowerCase().includes(lowerQuery) ||\r\n country.code.toLowerCase().includes(lowerQuery) ||\r\n country.dialCodes.some((dialCode) => dialCode.includes(lowerQuery))\r\n );\r\n}\r\n\r\nexport function getCountryDisplayName(country: Country | undefined): string {\r\n return country?.displayName ?? country?.name ?? '';\r\n}\r\n\r\n/**\r\n * Get placeholder based on country format\r\n */\r\nexport function getPlaceholder(country: MaybeCountry): string {\r\n if (!country?.format) return country?.dialCode ? `${country.dialCode} 000 000 0000` : 'Phone number';\r\n return country.format.replace(/#/g, '0');\r\n}\r\n\r\nexport const stripNonDigits = cleanPhone;\r\n\r\nexport function isInternationalFormat(phone: string): boolean {\r\n return phone.trim().startsWith('+') || phone.trim().startsWith('00');\r\n}\r\n\r\nexport function extractDialCode(phone: string): { dialCode: string | null; nationalNumber: string } {\r\n const digits = cleanPhone(phone);\r\n if (!isInternationalFormat(phone)) {\r\n return { dialCode: null, nationalNumber: digits };\r\n }\r\n\r\n const match = countries\r\n .map((country) => country.dialCode)\r\n .sort((left, right) => right.length - left.length)\r\n .find((dialCode) => digits.startsWith(cleanPhone(dialCode)));\r\n\r\n if (!match) {\r\n return { dialCode: null, nationalNumber: digits };\r\n }\r\n\r\n const dialDigits = cleanPhone(match);\r\n return {\r\n dialCode: dialDigits,\r\n nationalNumber: digits.slice(dialDigits.length),\r\n };\r\n}\r\n\r\nexport function detectCountry(phone: string): Country | null {\r\n return detectCountryFromPhone(phone) ?? null;\r\n}\r\n\r\nexport function formatPhoneNumber(\r\n phone: string,\r\n country: MaybeCountry,\r\n format: 'national' | 'international' | 'e164' = 'national'\r\n): string {\r\n if (!phone) return '';\r\n if (format === 'e164') {\r\n return addDialCode(phone, country);\r\n }\r\n\r\n const nationalNumber = isInternationalFormat(phone) ? removeDialCode(phone, country) : phone;\r\n if (!country && format === 'national') {\r\n return cleanPhone(nationalNumber).slice(0, 9).replace(/(\\d{3})(?=\\d)/g, '$1 ').trim();\r\n }\r\n\r\n const formattedNational = formatPhone(nationalNumber, country);\r\n\r\n if (format === 'international') {\r\n return country ? `${country.dialCode} ${formattedNational}` : addDialCode(phone, country);\r\n }\r\n\r\n return formattedNational;\r\n}\r\n\r\nexport function parseToE164(phone: string, country: MaybeCountry): string {\r\n return addDialCode(phone, country);\r\n}\r\n\r\nexport function getNationalNumber(phone: string, country?: MaybeCountry): string {\r\n if (country) {\r\n return removeDialCode(phone, country);\r\n }\r\n\r\n const detectedCountry = detectCountryFromPhone(phone);\r\n return detectedCountry ? removeDialCode(phone, detectedCountry) : cleanPhone(phone);\r\n}\r\n\r\nfunction validationFailure(\r\n reason: Exclude<ValidationReason, null>,\r\n message: string\r\n): ValidationResult {\r\n return { isValid: false, reason, message, error: message };\r\n}\r\n\r\nfunction validationSuccess(): ValidationResult {\r\n return { isValid: true, reason: null, message: null, error: null };\r\n}\r\n\r\nexport function validatePhoneNumber(\r\n phone: string,\r\n country?: MaybeCountry,\r\n required = false,\r\n customValidator?: (phone: string, country: Country | undefined) => boolean\r\n): ValidationResult {\r\n const digits = cleanPhone(phone);\r\n if (!digits) {\r\n return required\r\n ? validationFailure('required', 'Phone number is required')\r\n : validationSuccess();\r\n }\r\n\r\n const maxDigits = getMaxNationalDigits(country);\r\n const nationalDigits = country ? cleanPhone(removeDialCode(phone, country)) : digits;\r\n\r\n if (nationalDigits.length < 7) {\r\n return validationFailure('too_short', 'Phone number is too short');\r\n }\r\n\r\n if (maxDigits && nationalDigits.length > maxDigits) {\r\n return validationFailure(\r\n 'too_long',\r\n `Phone number is too long (max ${maxDigits} digits)`\r\n );\r\n }\r\n\r\n const isValid = customValidator\r\n ? customValidator(phone, country ?? undefined)\r\n : validatePhone(phone, country);\r\n\r\n return isValid ? validationSuccess() : validationFailure('invalid', 'Invalid phone number');\r\n}\r\n\r\nexport function parsePhoneValue(phone: string, country?: MaybeCountry): ParsedPhoneValue {\r\n const countryCode = getCountryCode(country);\r\n const normalized = normalizePhoneInput(phone);\r\n const parsed = normalized.startsWith('+')\r\n ? parsePhoneNumberFromString(normalized)\r\n : parsePhoneNumberFromString(cleanPhone(normalized), countryCode);\r\n\r\n if (!parsed) {\r\n const nationalNumber = country ? removeDialCode(phone, country) : cleanPhone(phone);\r\n return {\r\n country: country ?? undefined,\r\n nationalNumber,\r\n e164: undefined,\r\n isValid: false,\r\n };\r\n }\r\n\r\n const parsedCountry = parsed.country ? getCountryByCode(parsed.country) : country ?? undefined;\r\n\r\n return {\r\n country: parsedCountry,\r\n nationalNumber: parsed.nationalNumber,\r\n e164: parsed.isValid() ? parsed.number : undefined,\r\n isValid: parsed.isValid(),\r\n };\r\n}\r\n\r\nexport function isPhoneNumberComplete(phone: string, country?: MaybeCountry): boolean {\r\n if (!country) {\r\n return cleanPhone(phone).length >= 7;\r\n }\r\n\r\n return validatePhoneLength(phone, country);\r\n}\r\n\r\nexport function formatAsYouType(phone: string, country: MaybeCountry): string {\r\n if (isInternationalFormat(phone) && country) {\r\n return `${country.dialCode} ${formatPhone(removeDialCode(phone, country), country)}`;\r\n }\r\n\r\n return formatPhone(phone, country);\r\n}\r\n\r\nexport const normalizePhoneNumber = cleanPhone;\r\n\r\nexport function phoneNumbersEqual(left: string, right: string): boolean {\r\n return normalizePhoneNumber(left) === normalizePhoneNumber(right);\r\n}\r\n\r\nexport function getCountryDisplayLabel(country: Country, includeDialCode = true): string {\r\n const label = `${country.flag} ${getCountryDisplayName(country)}`;\r\n return includeDialCode ? `${label} (${country.dialCode})` : label;\r\n}\r\n\r\nexport function limitInputLength(phone: string, country?: MaybeCountry): string {\r\n const maxDigits = getMaxNationalDigits(country);\r\n if (!maxDigits) {\r\n return phone;\r\n }\r\n\r\n const isInternational = isInternationalFormat(phone);\r\n const digits = cleanPhone(phone);\r\n const dialDigits = country ? cleanPhone(country.dialCode) : '';\r\n const maxLength = isInternational ? dialDigits.length + maxDigits : maxDigits;\r\n const limited = digits.slice(0, maxLength);\r\n\r\n return isInternational ? `+${limited}` : limited;\r\n}\r\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\r\nimport type { PhoneInputOptions, UsePhoneInputReturn } from './types';\r\nimport type { Country } from './countries';\r\nimport { countries, detectCountryFromPhone, getCountryByCode, localizeCountries, localizeCountry } from './countries';\r\nimport { resolvePhoneInputLabels } from './labels';\r\nimport {\r\n formatPhone,\r\n unformatPhone,\r\n addDialCode,\r\n removeDialCode,\r\n filterCountries,\r\n getPlaceholder,\r\n validatePhoneNumber,\r\n} from './utils';\r\n\r\nfunction countDigitsBeforePosition(value: string, position: number) {\r\n return value.slice(0, position).replace(/\\D/g, '').length;\r\n}\r\n\r\nfunction getCaretPositionFromDigitCount(value: string, digitCount: number) {\r\n if (digitCount <= 0) {\r\n return value.startsWith('+') ? 1 : 0;\r\n }\r\n\r\n let seenDigits = 0;\r\n\r\n for (let index = 0; index < value.length; index += 1) {\r\n if (/\\d/.test(value[index])) {\r\n seenDigits += 1;\r\n if (seenDigits === digitCount) {\r\n return index + 1;\r\n }\r\n }\r\n }\r\n\r\n return value.length;\r\n}\r\n\r\nexport function usePhoneInput(\r\n options: PhoneInputOptions & {\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (phone: string, country: Country | undefined) => void;\r\n onCountryChange?: (country: Country | undefined) => void;\r\n onBlur?: () => void;\r\n onFocus?: () => void;\r\n } = {}\r\n): UsePhoneInputReturn {\r\n const {\r\n value: controlledValue,\r\n defaultValue = '',\r\n onChange,\r\n onCountryChange,\r\n onBlur,\r\n onFocus,\r\n defaultCountry = 'US',\r\n preferredCountries,\r\n excludeCountries,\r\n excludedCountries,\r\n onlyCountries,\r\n allowedCountries,\r\n autoDetect,\r\n autoDetectCountry,\r\n formatOnType = true,\r\n includeDialCode = false,\r\n required = false,\r\n validator,\r\n onValidationChange,\r\n locale,\r\n labels,\r\n } = options;\r\n const resolvedOnlyCountries = onlyCountries ?? allowedCountries;\r\n const resolvedExcludeCountries = excludeCountries ?? excludedCountries;\r\n const resolvedAutoDetect = autoDetect ?? autoDetectCountry ?? true;\r\n\r\n const isControlled = controlledValue !== undefined;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const pendingCaretDigitIndexRef = useRef<number | null>(null);\r\n const previousDefaultCountryRef = useRef(defaultCountry);\r\n\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (resolvedOnlyCountries?.length) {\r\n filtered = filtered.filter(c => resolvedOnlyCountries.includes(c.code));\r\n }\r\n \r\n if (resolvedExcludeCountries?.length) {\r\n filtered = filtered.filter(c => !resolvedExcludeCountries.includes(c.code));\r\n }\r\n \r\n return filtered;\r\n }, [resolvedOnlyCountries, resolvedExcludeCountries]);\r\n\r\n const localizedCountries = useMemo(\r\n () => localizeCountries(availableCountries, locale),\r\n [availableCountries, locale]\r\n );\r\n\r\n const resolvedLabels = useMemo(\r\n () => resolvePhoneInputLabels(locale, labels),\r\n [locale, labels]\r\n );\r\n\r\n // Initialize state\r\n const initialCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\r\n const [internalPhone, setInternalPhone] = useState(defaultValue);\r\n const [country, setCountry] = useState<Country | undefined>(initialCountry);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n\r\n // Current phone value\r\n const phone = isControlled ? controlledValue : internalPhone;\r\n\r\n const getOutputCountry = useCallback(\r\n (nextCountry: Country | undefined) => localizeCountry(nextCountry, locale),\r\n [locale]\r\n );\r\n\r\n useEffect(() => {\r\n const defaultCountryChanged = previousDefaultCountryRef.current !== defaultCountry;\r\n previousDefaultCountryRef.current = defaultCountry;\r\n const nextCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\r\n const countryStillAvailable = country\r\n ? availableCountries.some((candidate) => candidate.code === country.code)\r\n : false;\r\n\r\n if (nextCountry && (defaultCountryChanged || !countryStillAvailable)) {\r\n setCountry(nextCountry);\r\n }\r\n }, [defaultCountry, availableCountries, country]);\r\n\r\n // Auto-detect country from phone\r\n useEffect(() => {\r\n if (resolvedAutoDetect && phone) {\r\n const detected = detectCountryFromPhone(phone);\r\n if (detected && availableCountries.some((candidate) => candidate.code === detected.code) && detected.code !== country?.code) {\r\n setCountry(detected);\r\n onCountryChange?.(getOutputCountry(detected));\r\n }\r\n }\r\n }, [availableCountries, resolvedAutoDetect, phone, country?.code, onCountryChange, getOutputCountry]);\r\n\r\n // Format phone number\r\n const formattedPhone = useMemo(() => {\r\n if (formatOnType) {\r\n return formatPhone(includeDialCode && phone.startsWith('+') ? removeDialCode(phone, country) : phone, country);\r\n }\r\n return includeDialCode && phone.startsWith('+') ? removeDialCode(phone, country) : phone;\r\n }, [formatOnType, includeDialCode, phone, country]);\r\n\r\n // Full phone with dial code\r\n const fullPhone = useMemo(() => {\r\n if (includeDialCode && country) {\r\n return addDialCode(phone, country);\r\n }\r\n return phone;\r\n }, [phone, country, includeDialCode]);\r\n\r\n const validation = useMemo(\r\n () => validatePhoneNumber(phone, country, required, validator),\r\n [phone, country, required, validator]\r\n );\r\n\r\n useEffect(() => {\r\n onValidationChange?.(validation);\r\n }, [validation, onValidationChange]);\r\n\r\n const localizedCountry = useMemo(\r\n () => localizeCountry(country, locale),\r\n [country, locale]\r\n );\r\n\r\n // Filtered countries for dropdown\r\n const filteredCountries = useMemo(\r\n () => filterCountries(localizedCountries, searchQuery, preferredCountries),\r\n [localizedCountries, searchQuery, preferredCountries]\r\n );\r\n\r\n useLayoutEffect(() => {\r\n const nextDigitIndex = pendingCaretDigitIndexRef.current;\r\n const input = inputRef.current;\r\n\r\n if (nextDigitIndex === null || !input || typeof input.setSelectionRange !== 'function') {\r\n return;\r\n }\r\n\r\n if (typeof document !== 'undefined' && document.activeElement !== input) {\r\n return;\r\n }\r\n\r\n const caretPosition = getCaretPositionFromDigitCount(formattedPhone, nextDigitIndex);\r\n input.setSelectionRange(caretPosition, caretPosition);\r\n pendingCaretDigitIndexRef.current = null;\r\n }, [formattedPhone]);\r\n\r\n // Set phone handler\r\n const setPhone = useCallback(\r\n (newPhone: string) => {\r\n const unformatted = unformatPhone(newPhone);\r\n if (!isControlled) {\r\n setInternalPhone(unformatted);\r\n }\r\n onChange?.(\r\n includeDialCode ? addDialCode(unformatted, country) : unformatted,\r\n getOutputCountry(country)\r\n );\r\n },\r\n [isControlled, onChange, country, includeDialCode, getOutputCountry]\r\n );\r\n\r\n // Set country handler\r\n const setCountryByCode = useCallback(\r\n (code: string) => {\r\n const newCountry = getCountryByCode(code);\r\n if (newCountry) {\r\n setCountry(newCountry);\r\n onCountryChange?.(getOutputCountry(newCountry));\r\n onChange?.(\r\n includeDialCode ? addDialCode(phone, newCountry) : phone,\r\n getOutputCountry(newCountry)\r\n );\r\n }\r\n },\r\n [phone, onChange, onCountryChange, includeDialCode, getOutputCountry]\r\n );\r\n\r\n // Select country from dropdown\r\n const selectCountry = useCallback(\r\n (selectedCountry: Country) => {\r\n const rawCountry = getCountryByCode(selectedCountry.code) ?? selectedCountry;\r\n setCountry(rawCountry);\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n onCountryChange?.(getOutputCountry(rawCountry));\r\n onChange?.(\r\n includeDialCode ? addDialCode(phone, rawCountry) : phone,\r\n getOutputCountry(rawCountry)\r\n );\r\n },\r\n [phone, onChange, onCountryChange, includeDialCode, getOutputCountry]\r\n );\r\n\r\n // Toggle dropdown\r\n const toggleDropdown = useCallback(() => {\r\n setIsOpen(prev => !prev);\r\n if (isOpen) {\r\n setSearchQuery('');\r\n }\r\n }, [isOpen]);\r\n\r\n // Open dropdown\r\n const openDropdown = useCallback(() => {\r\n setIsOpen(true);\r\n }, []);\r\n\r\n // Close dropdown\r\n const closeDropdown = useCallback(() => {\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n }, []);\r\n\r\n // Clear input\r\n const clear = useCallback(() => {\r\n if (!isControlled) {\r\n setInternalPhone('');\r\n }\r\n onChange?.('', getOutputCountry(country));\r\n }, [isControlled, onChange, country, getOutputCountry]);\r\n\r\n // Handle input change\r\n const handleInputChange = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const rawValue = event.target.value;\r\n const caretPosition = event.target.selectionStart ?? rawValue.length;\r\n const unformatted = rawValue.trim().startsWith('+') ? `+${rawValue.replace(/\\D/g, '')}` : unformatPhone(rawValue);\r\n pendingCaretDigitIndexRef.current = countDigitsBeforePosition(rawValue, caretPosition);\r\n setPhone(unformatted);\r\n },\r\n [setPhone]\r\n );\r\n\r\n // Handle focus\r\n const handleFocus = useCallback(() => {\r\n onFocus?.();\r\n }, [onFocus]);\r\n\r\n // Handle blur\r\n const handleBlur = useCallback(() => {\r\n onBlur?.();\r\n }, [onBlur]);\r\n\r\n const getCountryOptionId = useCallback(\r\n (code: string) => `phone-input-country-${code}`,\r\n []\r\n );\r\n\r\n const getCountryOptionProps = useCallback(\r\n (optionCountry: Country, index: number) => ({\r\n id: getCountryOptionId(optionCountry.code),\r\n role: 'option' as const,\r\n 'aria-selected': optionCountry.code === country?.code,\r\n onClick: () => selectCountry(optionCountry),\r\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n selectCountry(optionCountry);\r\n }\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeDropdown();\r\n }\r\n },\r\n tabIndex: index === 0 ? 0 : -1,\r\n }),\r\n [closeDropdown, country?.code, getCountryOptionId, selectCountry]\r\n );\r\n\r\n return {\r\n // State\r\n phone,\r\n value: phone,\r\n fullPhone,\r\n country: localizedCountry,\r\n isValid: validation.isValid,\r\n validationReason: validation.reason,\r\n error: validation.error,\r\n isOpen,\r\n searchQuery,\r\n labels: resolvedLabels,\r\n formattedValue: formattedPhone,\r\n // Actions\r\n setPhone,\r\n setValue: setPhone,\r\n setCountry: setCountryByCode,\r\n toggleDropdown,\r\n toggle: toggleDropdown,\r\n openDropdown,\r\n open: openDropdown,\r\n closeDropdown,\r\n close: closeDropdown,\r\n setSearchQuery,\r\n clear,\r\n // Props\r\n inputProps: {\r\n ref: inputRef,\r\n value: formattedPhone,\r\n onChange: handleInputChange,\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n type: 'tel',\r\n inputMode: 'tel',\r\n autoComplete: 'tel',\r\n placeholder: getPlaceholder(country),\r\n 'aria-invalid': phone ? !validation.isValid : undefined,\r\n },\r\n countryButtonProps: {\r\n onClick: toggleDropdown,\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'listbox',\r\n 'aria-label': resolvedLabels.countryButtonAriaLabel,\r\n },\r\n countrySelectorProps: {\r\n onClick: toggleDropdown,\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'listbox',\r\n 'aria-label': resolvedLabels.countryButtonAriaLabel,\r\n },\r\n dropdownProps: {\r\n role: 'listbox',\r\n 'aria-label': resolvedLabels.countryOptionsAriaLabel,\r\n },\r\n getCountryOptionId,\r\n filteredCountries,\r\n countries: filteredCountries,\r\n selectCountry,\r\n getCountryOptionProps,\r\n };\r\n}\r\n","import { forwardRef, useCallback, useEffect, useId, useImperativeHandle, useRef, useState, type MutableRefObject, type Ref } from 'react';\nimport { usePhoneInput } from './usePhoneInput';\nimport type { PhoneInputProps } from './types';\nimport type { Country } from './countries';\nimport { getCountryDisplayName } from './utils';\n\n// SVG Icon Components (Lucide-style)\nconst ChevronUpIcon = ({ size = 12 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n);\n\nconst ChevronDownIcon = ({ size = 12 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n);\n\nexport interface PhoneInputRef {\n /** Focus the input */\n focus: () => void;\n /** Blur the input */\n blur: () => void;\n /** Clear the input */\n clear: () => void;\n /** Set country */\n setCountry: (countryCode: string) => void;\n /** Get current country */\n getCountry: () => Country | undefined;\n /** Open country selector */\n open: () => void;\n /** Close country selector */\n close: () => void;\n}\n\n/**\n * PhoneInput component - headless phone input with country selection\n * \n * @example\n * ```tsx\n * <PhoneInput\n * value={value}\n * onChange={setValue}\n * defaultCountry=\"US\"\n * />\n * ```\n * \n * @example\n * ```tsx\n * // With custom styling\n * <PhoneInput\n * value={value}\n * onChange={setValue}\n * defaultCountry=\"GB\"\n * containerClassName=\"phone-input-container\"\n * inputClassName=\"phone-input\"\n * selectorClassName=\"country-selector\"\n * />\n * ```\n */\nexport const PhoneInput = forwardRef<PhoneInputRef, PhoneInputProps>(\n function PhoneInput(props, ref) {\n const {\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n inputClassName,\n selectorClassName,\n containerClassName,\n searchable = true,\n placeholder,\n disabled,\n readOnly,\n name,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...options\n } = props;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const optionRefs = useRef<Array<HTMLLIElement | null>>([]);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const listboxId = useId();\n\n const {\n inputProps,\n countryButtonProps,\n dropdownProps,\n country,\n filteredCountries,\n isOpen,\n isValid,\n searchQuery,\n setSearchQuery,\n setCountry,\n selectCountry,\n clear,\n openDropdown,\n closeDropdown,\n getCountryOptionId,\n labels,\n } = usePhoneInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n ...options,\n });\n\n const hookInputRef = (inputProps as typeof inputProps & { ref?: Ref<HTMLInputElement> }).ref;\n const mergedInputRef = useCallback((element: HTMLInputElement | null) => {\n inputRef.current = element;\n\n if (typeof hookInputRef === 'function') {\n hookInputRef(element);\n } else if (hookInputRef && 'current' in hookInputRef) {\n (hookInputRef as MutableRefObject<HTMLInputElement | null>).current = element;\n }\n }, [hookInputRef]);\n\n // Focus the input\n const focus = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Blur the input\n const blur = useCallback(() => {\n inputRef.current?.blur();\n }, []);\n\n // Handle country option click\n const handleCountryClick = useCallback((c: Country) => {\n selectCountry(c);\n setHighlightedIndex(0);\n }, [selectCountry]);\n\n // Handle country option keyboard navigation\n const handleCountryKeyDown = useCallback((e: React.KeyboardEvent, c: Country, index: number) => {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n selectCountry(c);\n setHighlightedIndex(0);\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (index < filteredCountries.length - 1) {\n const nextIndex = index + 1;\n setHighlightedIndex(nextIndex);\n optionRefs.current[nextIndex]?.focus();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (index > 0) {\n const nextIndex = index - 1;\n setHighlightedIndex(nextIndex);\n optionRefs.current[nextIndex]?.focus();\n }\n break;\n case 'Escape':\n e.preventDefault();\n closeDropdown();\n break;\n }\n }, [selectCountry, filteredCountries.length, closeDropdown]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node | null;\n if (containerRef.current && target && !containerRef.current.contains(target)) {\n closeDropdown();\n }\n };\n\n const handleFocusIn = (event: FocusEvent) => {\n const target = event.target as Node | null;\n if (containerRef.current && target && !containerRef.current.contains(target)) {\n closeDropdown();\n }\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n document.addEventListener('focusin', handleFocusIn);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n document.removeEventListener('focusin', handleFocusIn);\n };\n }, [isOpen, closeDropdown]);\n\n useEffect(() => {\n if (filteredCountries.length === 0) {\n if (highlightedIndex !== 0) {\n setHighlightedIndex(0);\n }\n return;\n }\n\n if (highlightedIndex >= filteredCountries.length) {\n setHighlightedIndex(filteredCountries.length - 1);\n }\n }, [filteredCountries.length, highlightedIndex]);\n\n // Expose imperative methods\n useImperativeHandle(ref, () => ({\n focus,\n blur,\n clear,\n setCountry,\n getCountry: () => country,\n open: openDropdown,\n close: closeDropdown,\n }));\n\n const activeCountry = filteredCountries[highlightedIndex];\n const activeDescendantId = activeCountry ? getCountryOptionId(activeCountry.code) : undefined;\n\n // Render default UI\n return (\n <div ref={containerRef} className={containerClassName} data-valid={isValid}>\n {/* Country Selector Button */}\n <button\n {...countryButtonProps}\n type=\"button\"\n className={selectorClassName}\n disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n aria-controls={listboxId}\n >\n {country ? (\n <>\n <span className=\"phone-input-flag\">{country.flag}</span>\n <span className=\"phone-input-dial-code\">{country.dialCode}</span>\n </>\n ) : (\n <span className=\"phone-input-placeholder\">{labels.selectCountry}</span>\n )}\n <span className=\"phone-input-arrow\" aria-hidden=\"true\">\n {isOpen ? <ChevronUpIcon size={12} /> : <ChevronDownIcon size={12} />}\n </span>\n </button>\n\n {/* Phone Input */}\n <input\n {...inputProps}\n ref={mergedInputRef}\n id={id}\n name={name}\n className={inputClassName}\n placeholder={placeholder || inputProps.placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n />\n\n {/* Country Dropdown */}\n {isOpen && (\n <div className=\"phone-input-dropdown\">\n {/* Search Input */}\n {searchable && (\n <div className=\"phone-input-search\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={labels.countrySearchPlaceholder}\n autoFocus\n aria-controls={listboxId}\n aria-label={labels.searchCountriesAriaLabel}\n />\n </div>\n )}\n\n {/* Country List */}\n <ul\n {...dropdownProps}\n className=\"phone-input-country-list\"\n id={listboxId}\n aria-activedescendant={activeDescendantId}\n >\n {filteredCountries.map((c, index) => (\n <li\n key={c.code}\n id={getCountryOptionId(c.code)}\n ref={(element) => {\n optionRefs.current[index] = element;\n }}\n role=\"option\"\n aria-selected={c.code === country?.code}\n className={`phone-input-country-option ${\n c.code === country?.code ? 'selected' : ''\n } ${index === highlightedIndex ? 'highlighted' : ''}`}\n onClick={() => handleCountryClick(c)}\n onKeyDown={(e) => handleCountryKeyDown(e, c, index)}\n onMouseEnter={() => setHighlightedIndex(index)}\n tabIndex={index === highlightedIndex ? 0 : -1}\n >\n <span className=\"phone-input-flag\">{c.flag}</span>\n <span className=\"phone-input-country-name\">{getCountryDisplayName(c)}</span>\n <span className=\"phone-input-dial-code\">{c.dialCode}</span>\n </li>\n ))}\n {filteredCountries.length === 0 && (\n <li className=\"phone-input-no-results\">{labels.noCountriesFound}</li>\n )}\n </ul>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default PhoneInput;\n"]}
1
+ {"version":3,"sources":["../src/countries.ts","../src/labels.ts","../src/utils.ts","../src/usePhoneInput.ts","../src/PhoneInput.tsx"],"names":["validateLength","countries","parsePhoneNumberFromString","PhoneInput","useRef","useState","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { getCountries, getCountryCallingCode, getExampleNumber, parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\nimport examples from 'libphonenumber-js/mobile/examples';\r\nimport worldCountries from 'world-countries';\r\n\r\nexport interface Country {\r\n code: string;\r\n name: string;\r\n dialCode: string;\r\n dialCodes: string[];\r\n flag: string;\r\n format?: string;\r\n displayName?: string;\r\n}\r\n\r\nconst PRIORITY_COUNTRIES = [\r\n 'US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT', 'ES', 'JP', 'CN', 'IN', 'BR', 'MX', 'KR', 'NL',\r\n 'CH', 'SE', 'AE', 'SG', 'ZA', 'NG', 'SA', 'TR', 'ID', 'PH', 'TH', 'VN', 'MY', 'NZ', 'AR'\r\n];\r\n\r\nconst supportedCountries = new Set(getCountries());\r\nconst worldCountryMap = new Map(worldCountries.map((country) => [country.cca2, country]));\r\nconst FALLBACK_COUNTRIES: Record<string, { name: string; dialCode?: string; flag?: string }> = {\r\n AC: { name: 'Ascension Island', dialCode: '+247' },\r\n TA: { name: 'Tristan da Cunha', dialCode: '+290' },\r\n BQ: { name: 'Caribbean Netherlands', dialCode: '+599' },\r\n};\r\n\r\nfunction normalizeDialCode(root: string, suffix: string) {\r\n const normalizedRoot = root.startsWith('+') ? root : `+${root}`;\r\n const digitsOnlySuffix = suffix.replace(/\\D/g, '');\r\n return `${normalizedRoot}${digitsOnlySuffix}`;\r\n}\r\n\r\nfunction codeToFlag(code: string): string {\r\n return code\r\n .toUpperCase()\r\n .replace(/./g, (char) => String.fromCodePoint(127397 + char.charCodeAt(0)));\r\n}\r\n\r\nfunction buildDialCodes(country: (typeof worldCountries)[number] | undefined, fallbackDialCode: string) {\r\n const root = country?.idd?.root;\r\n if (!root) {\r\n return [fallbackDialCode];\r\n }\r\n\r\n const suffixes = country.idd?.suffixes?.length ? country.idd.suffixes : [''];\r\n const dialCodes = suffixes\r\n .map((suffix) => normalizeDialCode(root, suffix))\r\n .filter((dialCode) => /^\\+\\d+$/.test(dialCode));\r\n\r\n return Array.from(new Set([fallbackDialCode, ...(dialCodes.length ? dialCodes : [])]));\r\n}\r\n\r\nfunction getCountryFormat(code: CountryCode) {\r\n const example = getExampleNumber(code, examples);\r\n return example ? example.formatNational().replace(/\\d/g, '#') : undefined;\r\n}\r\n\r\nfunction getCountryPriority(code: string) {\r\n const index = PRIORITY_COUNTRIES.indexOf(code);\r\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\r\n}\r\n\r\nconst generatedCountries = Array.from(supportedCountries)\r\n .map<Country>((code) => {\r\n const country = worldCountryMap.get(code);\r\n const fallback = FALLBACK_COUNTRIES[code];\r\n const dialCode = fallback?.dialCode ?? `+${getCountryCallingCode(code as CountryCode)}`;\r\n const dialCodes = buildDialCodes(country, dialCode);\r\n\r\n return {\r\n code,\r\n name: country?.name.common ?? fallback?.name ?? code,\r\n dialCode,\r\n dialCodes,\r\n flag: country?.flag || fallback?.flag || codeToFlag(code),\r\n format: getCountryFormat(code as CountryCode),\r\n } satisfies Country;\r\n })\r\n .sort((left, right) => {\r\n const priorityDelta = getCountryPriority(left.code) - getCountryPriority(right.code);\r\n return priorityDelta !== 0 ? priorityDelta : left.name.localeCompare(right.name);\r\n });\r\n\r\nexport const countries: Country[] = generatedCountries;\r\n\r\nexport const countryMap = new Map(countries.map((country) => [country.code, country]));\r\n\r\nconst countriesByDialCode = countries.reduce((map, country) => {\r\n for (const dialCode of country.dialCodes) {\r\n const matches = map.get(dialCode) ?? [];\r\n matches.push(country);\r\n map.set(dialCode, matches);\r\n }\r\n\r\n return map;\r\n}, new Map<string, Country[]>());\r\n\r\nconst dialCodeMatchers = countries\r\n .flatMap((country) => country.dialCodes.map((dialCode) => ({ dialCode, country })))\r\n .sort((left, right) => right.dialCode.length - left.dialCode.length);\r\n\r\nconst displayNameCache = new Map<string, Intl.DisplayNames>();\r\n\r\nfunction normalizeLocales(locale?: string | readonly string[]) {\r\n return Array.isArray(locale) ? [...locale] : locale ? [locale] : [];\r\n}\r\n\r\nfunction getDisplayNames(locale?: string | readonly string[]) {\r\n const locales = normalizeLocales(locale);\r\n if (locales.length === 0 || typeof Intl === 'undefined' || typeof Intl.DisplayNames === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n const cacheKey = locales.join('|');\r\n const cached = displayNameCache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n try {\r\n const displayNames = new Intl.DisplayNames(locales, { type: 'region' });\r\n displayNameCache.set(cacheKey, displayNames);\r\n return displayNames;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction normalizeLookupDialCode(dialCode: string) {\r\n const digits = dialCode.replace(/\\D/g, '');\r\n return digits ? `+${digits}` : '';\r\n}\r\n\r\nexport function getCountryByCode(code: string): Country | undefined {\r\n return countryMap.get(code.toUpperCase());\r\n}\r\n\r\nexport function getLocalizedCountryName(\r\n country: Country | undefined,\r\n locale?: string | readonly string[]\r\n): string | undefined {\r\n if (!country) {\r\n return undefined;\r\n }\r\n\r\n const displayNames = getDisplayNames(locale);\r\n return displayNames?.of(country.code) ?? country.displayName ?? country.name;\r\n}\r\n\r\nexport function localizeCountry(\r\n country: Country | undefined,\r\n locale?: string | readonly string[]\r\n): Country | undefined {\r\n if (!country) {\r\n return undefined;\r\n }\r\n\r\n const displayName = getLocalizedCountryName(country, locale);\r\n return displayName ? { ...country, displayName } : country;\r\n}\r\n\r\nexport function localizeCountries(\r\n list: Country[],\r\n locale?: string | readonly string[]\r\n): Country[] {\r\n if (!locale) {\r\n return list;\r\n }\r\n\r\n return list.map((country) => localizeCountry(country, locale) ?? country);\r\n}\r\n\r\nexport function getCountriesByDialCode(dialCode: string): Country[] {\r\n return countriesByDialCode.get(normalizeLookupDialCode(dialCode)) ?? [];\r\n}\r\n\r\nexport function getCountryByDialCode(dialCode: string): Country | undefined {\r\n return getCountriesByDialCode(dialCode)[0];\r\n}\r\n\r\nexport interface CountryOption {\r\n value: string;\r\n label: string;\r\n dialCode: string;\r\n flag: string;\r\n}\r\n\r\nexport interface GetCountryOptionsParams {\r\n locale?: string | readonly string[];\r\n preferredCountries?: string[];\r\n excludeCountries?: string[];\r\n onlyCountries?: string[];\r\n}\r\n\r\nexport function getCountryOptions(params: GetCountryOptionsParams = {}): CountryOption[] {\r\n let list = countries;\r\n\r\n if (params.onlyCountries?.length) {\r\n const allowed = new Set(params.onlyCountries.map((code) => code.toUpperCase()));\r\n list = list.filter((country) => allowed.has(country.code));\r\n }\r\n\r\n if (params.excludeCountries?.length) {\r\n const excluded = new Set(params.excludeCountries.map((code) => code.toUpperCase()));\r\n list = list.filter((country) => !excluded.has(country.code));\r\n }\r\n\r\n list = localizeCountries(list, params.locale);\r\n\r\n if (params.preferredCountries?.length) {\r\n const preferred = params.preferredCountries.map((code) => code.toUpperCase());\r\n list = [...list].sort((left, right) => {\r\n const leftIndex = preferred.indexOf(left.code);\r\n const rightIndex = preferred.indexOf(right.code);\r\n if (leftIndex !== -1 && rightIndex !== -1) {\r\n return leftIndex - rightIndex;\r\n }\r\n if (leftIndex !== -1) {\r\n return -1;\r\n }\r\n if (rightIndex !== -1) {\r\n return 1;\r\n }\r\n return (left.displayName ?? left.name).localeCompare(right.displayName ?? right.name);\r\n });\r\n }\r\n\r\n return list.map((country) => ({\r\n value: country.code,\r\n label: `${country.displayName ?? country.name} (${country.dialCode})`,\r\n dialCode: country.dialCode,\r\n flag: country.flag,\r\n }));\r\n}\r\n\r\nexport function detectCountryFromPhone(phone: string): Country | undefined {\r\n const trimmed = phone.trim();\r\n\r\n if (!trimmed) {\r\n return undefined;\r\n }\r\n\r\n const normalized = trimmed.startsWith('+')\r\n ? `+${trimmed.replace(/\\D/g, '')}`\r\n : trimmed.startsWith('00')\r\n ? `+${trimmed.slice(2).replace(/\\D/g, '')}`\r\n : '';\r\n\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n\r\n const parsedPhone = parsePhoneNumberFromString(normalized);\r\n if (parsedPhone?.country) {\r\n return getCountryByCode(parsedPhone.country);\r\n }\r\n\r\n return dialCodeMatchers.find((entry) => normalized.startsWith(entry.dialCode))?.country;\r\n}\r\n","import type { PhoneInputLabels } from './types';\r\n\r\nexport const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels = {\r\n selectCountry: 'Select country',\r\n countrySearchPlaceholder: 'Search countries...',\r\n noCountriesFound: 'No countries found',\r\n searchCountriesAriaLabel: 'Search countries',\r\n countryOptionsAriaLabel: 'Country options',\r\n countryButtonAriaLabel: 'Open country selector',\r\n};\r\n\r\nconst LABELS_BY_LANGUAGE: Record<string, Partial<PhoneInputLabels>> = {\r\n en: DEFAULT_PHONE_INPUT_LABELS,\r\n fr: {\r\n selectCountry: 'Choisir un pays',\r\n countrySearchPlaceholder: 'Rechercher un pays...',\r\n noCountriesFound: 'Aucun pays trouvé',\r\n searchCountriesAriaLabel: 'Rechercher des pays',\r\n countryOptionsAriaLabel: 'Options de pays',\r\n countryButtonAriaLabel: 'Ouvrir le sélecteur de pays',\r\n },\r\n de: {\r\n selectCountry: 'Land auswählen',\r\n countrySearchPlaceholder: 'Land suchen...',\r\n noCountriesFound: 'Keine Länder gefunden',\r\n searchCountriesAriaLabel: 'Länder suchen',\r\n countryOptionsAriaLabel: 'Länderoptionen',\r\n countryButtonAriaLabel: 'Länderauswahl öffnen',\r\n },\r\n es: {\r\n selectCountry: 'Seleccionar país',\r\n countrySearchPlaceholder: 'Buscar país...',\r\n noCountriesFound: 'No se encontraron países',\r\n searchCountriesAriaLabel: 'Buscar países',\r\n countryOptionsAriaLabel: 'Opciones de país',\r\n countryButtonAriaLabel: 'Abrir selector de país',\r\n },\r\n pt: {\r\n selectCountry: 'Selecionar país',\r\n countrySearchPlaceholder: 'Pesquisar país...',\r\n noCountriesFound: 'Nenhum país encontrado',\r\n searchCountriesAriaLabel: 'Pesquisar países',\r\n countryOptionsAriaLabel: 'Opções de país',\r\n countryButtonAriaLabel: 'Abrir seletor de país',\r\n },\r\n it: {\r\n selectCountry: 'Seleziona paese',\r\n countrySearchPlaceholder: 'Cerca paese...',\r\n noCountriesFound: 'Nessun paese trovato',\r\n searchCountriesAriaLabel: 'Cerca paesi',\r\n countryOptionsAriaLabel: 'Opzioni paese',\r\n countryButtonAriaLabel: 'Apri selettore paese',\r\n },\r\n ja: {\r\n selectCountry: '国を選択',\r\n countrySearchPlaceholder: '国を検索...',\r\n noCountriesFound: '国が見つかりません',\r\n searchCountriesAriaLabel: '国を検索',\r\n countryOptionsAriaLabel: '国の候補',\r\n countryButtonAriaLabel: '国のセレクターを開く',\r\n },\r\n ko: {\r\n selectCountry: '국가 선택',\r\n countrySearchPlaceholder: '국가 검색...',\r\n noCountriesFound: '국가를 찾을 수 없습니다',\r\n searchCountriesAriaLabel: '국가 검색',\r\n countryOptionsAriaLabel: '국가 옵션',\r\n countryButtonAriaLabel: '국가 선택기 열기',\r\n },\r\n zh: {\r\n selectCountry: '选择国家',\r\n countrySearchPlaceholder: '搜索国家...',\r\n noCountriesFound: '未找到国家',\r\n searchCountriesAriaLabel: '搜索国家',\r\n countryOptionsAriaLabel: '国家选项',\r\n countryButtonAriaLabel: '打开国家选择器',\r\n },\r\n ar: {\r\n selectCountry: 'اختر الدولة',\r\n countrySearchPlaceholder: 'ابحث عن دولة...',\r\n noCountriesFound: 'لم يتم العثور على دول',\r\n searchCountriesAriaLabel: 'ابحث عن الدول',\r\n countryOptionsAriaLabel: 'خيارات الدول',\r\n countryButtonAriaLabel: 'افتح محدد الدولة',\r\n },\r\n hi: {\r\n selectCountry: 'देश चुनें',\r\n countrySearchPlaceholder: 'देश खोजें...',\r\n noCountriesFound: 'कोई देश नहीं मिला',\r\n searchCountriesAriaLabel: 'देश खोजें',\r\n countryOptionsAriaLabel: 'देश विकल्प',\r\n countryButtonAriaLabel: 'देश चयन खोलें',\r\n },\r\n};\r\n\r\nfunction getPrimaryLanguage(locale?: string | readonly string[]): string | undefined {\r\n const locales = Array.isArray(locale) ? locale : locale ? [locale] : [];\r\n const firstLocale = locales.find(Boolean);\r\n return firstLocale ? firstLocale.toLowerCase().split('-')[0] : undefined;\r\n}\r\n\r\nexport function resolvePhoneInputLabels(\r\n locale?: string | readonly string[],\r\n overrides?: Partial<PhoneInputLabels>\r\n): PhoneInputLabels {\r\n const language = getPrimaryLanguage(locale);\r\n const localizedDefaults = language ? LABELS_BY_LANGUAGE[language] : undefined;\r\n\r\n return {\r\n ...DEFAULT_PHONE_INPUT_LABELS,\r\n ...localizedDefaults,\r\n ...overrides,\r\n };\r\n}","import type { Country } from './countries';\r\nimport { countries, detectCountryFromPhone, getCountryByCode } from './countries';\r\nimport {\r\n AsYouType,\r\n isPossiblePhoneNumber,\r\n isValidPhoneNumber,\r\n parsePhoneNumberFromString,\r\n validatePhoneNumberLength as validateLength,\r\n type CountryCode,\r\n} from 'libphonenumber-js';\r\n\r\ntype MaybeCountry = Country | null | undefined;\r\n\r\nexport type ValidationReason = 'required' | 'too_short' | 'too_long' | 'invalid' | null;\r\n\r\nexport interface ValidationResult {\r\n isValid: boolean;\r\n reason: ValidationReason;\r\n message: string | null;\r\n /** Alias for `message` (compatibility) */\r\n error: string | null;\r\n}\r\n\r\nexport interface ParsedPhoneValue {\r\n country: Country | undefined;\r\n nationalNumber: string;\r\n e164: string | undefined;\r\n isValid: boolean;\r\n}\r\n\r\nfunction normalizePhoneInput(phone: string): string {\r\n const trimmed = phone.trim();\r\n const digits = cleanPhone(trimmed);\r\n\r\n if (trimmed.startsWith('+') && !digits) {\r\n return '+';\r\n }\r\n\r\n if (!digits) {\r\n return '';\r\n }\r\n\r\n return trimmed.startsWith('+') ? `+${digits}` : digits;\r\n}\r\n\r\nfunction getCountryCode(country: MaybeCountry): CountryCode | undefined {\r\n return country?.code as CountryCode | undefined;\r\n}\r\n\r\nfunction getMaxNationalDigits(country: MaybeCountry): number | undefined {\r\n return country?.format?.replace(/[^#]/g, '').length;\r\n}\r\n\r\ntype LengthValidationStatus = ReturnType<typeof validateLength>;\r\n\r\n/**\r\n * Check number length against libphonenumber metadata (handles\r\n * variable-length countries correctly, unlike format-based guesses).\r\n */\r\nfunction getLengthValidationStatus(phone: string, country: MaybeCountry): LengthValidationStatus {\r\n const normalized = normalizePhoneInput(phone);\r\n\r\n if (normalized.startsWith('+')) {\r\n return validateLength(normalized);\r\n }\r\n\r\n const countryCode = getCountryCode(country);\r\n if (!countryCode) {\r\n return undefined;\r\n }\r\n\r\n return validateLength(cleanPhone(normalized), countryCode);\r\n}\r\n\r\n/**\r\n * Whether the number already exceeds the maximum possible length for the\r\n * country (per libphonenumber metadata), with an E.164 digit-count fallback\r\n * when metadata cannot resolve the number.\r\n */\r\nexport function isPhoneTooLong(phone: string, country?: MaybeCountry): boolean {\r\n const normalized = normalizePhoneInput(phone);\r\n const digits = cleanPhone(normalized);\r\n\r\n if (!digits) {\r\n return false;\r\n }\r\n\r\n if (getLengthValidationStatus(phone, country) === 'TOO_LONG') {\r\n return true;\r\n }\r\n\r\n // E.164 caps national significant numbers at 15 digits (+ up to 3 for the country code).\r\n const maxDigits = normalized.startsWith('+') ? 18 : 15;\r\n return digits.length > maxDigits;\r\n}\r\n\r\n/**\r\n * Remove all non-digit characters from phone number\r\n */\r\nexport function cleanPhone(phone: string): string {\r\n return phone.replace(/\\D/g, '');\r\n}\r\n\r\n/**\r\n * Format phone number according to country format\r\n */\r\nexport function formatPhone(phone: string, country: MaybeCountry): string {\r\n if (!phone) return phone;\r\n\r\n const formatter = new AsYouType(getCountryCode(country));\r\n return formatter.input(normalizePhoneInput(phone));\r\n}\r\n\r\n/**\r\n * Get raw phone number without formatting\r\n */\r\nexport function unformatPhone(formattedPhone: string): string {\r\n return normalizePhoneInput(formattedPhone);\r\n}\r\n\r\n/**\r\n * Validate phone number length based on country\r\n */\r\nexport function validatePhoneLength(phone: string, country: MaybeCountry): boolean {\r\n if (!phone || !country) return false;\r\n\r\n if (phone.trim().startsWith('+')) {\r\n return validateLength(normalizePhoneInput(phone)) === undefined;\r\n }\r\n\r\n return validateLength(cleanPhone(phone), getCountryCode(country)) === undefined;\r\n}\r\n\r\n/**\r\n * Validate phone number format\r\n */\r\nexport function validatePhone(\r\n phone: string,\r\n country: MaybeCountry,\r\n customValidator?: (phone: string, country: Country | undefined) => boolean\r\n): boolean {\r\n if (!phone) return false;\r\n \r\n if (customValidator) {\r\n return customValidator(phone, country ?? undefined);\r\n }\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n const countryCode = getCountryCode(country);\r\n\r\n if (!countryCode) {\r\n return isPossiblePhoneNumber(normalized.startsWith('+') ? normalized : `+${cleanPhone(normalized)}`);\r\n }\r\n\r\n if (normalized.startsWith('+')) {\r\n return isValidPhoneNumber(normalized);\r\n }\r\n\r\n return isValidPhoneNumber(cleanPhone(normalized), countryCode);\r\n}\r\n\r\n/**\r\n * Add dial code to phone number\r\n */\r\nexport function addDialCode(phone: string, country: MaybeCountry): string {\r\n if (!country) return phone;\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n if (!normalized) return '';\r\n if (normalized === '+') return '';\r\n if (normalized.startsWith('+')) return normalized;\r\n\r\n const digits = cleanPhone(normalized);\r\n const matchingDialCode = country.dialCodes.find((dialCode) => digits.startsWith(dialCode.replace('+', '')));\r\n return matchingDialCode ? `+${digits}` : `${country.dialCode}${digits}`;\r\n}\r\n\r\n/**\r\n * Remove dial code from phone number\r\n */\r\nexport function removeDialCode(phone: string, country: MaybeCountry): string {\r\n if (!country) return phone;\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n const digits = cleanPhone(normalized);\r\n const primaryDialDigits = cleanPhone(country.dialCode);\r\n\r\n if (digits.startsWith(primaryDialDigits)) {\r\n return digits.slice(primaryDialDigits.length);\r\n }\r\n\r\n for (const dialCode of country.dialCodes) {\r\n const dialDigits = dialCode.replace('+', '');\r\n if (digits.startsWith(dialDigits)) {\r\n return digits.slice(dialDigits.length);\r\n }\r\n }\r\n\r\n return digits;\r\n}\r\n\r\n/**\r\n * Filter countries by search query\r\n */\r\nexport function filterCountries(\r\n countries: Country[],\r\n query: string,\r\n preferredCountries?: string[]\r\n): Country[] {\r\n const lowerQuery = query.toLowerCase().trim();\r\n \r\n if (!lowerQuery) {\r\n // Sort by preferred countries first\r\n if (preferredCountries?.length) {\r\n return [...countries].sort((a, b) => {\r\n const aPreferred = preferredCountries.indexOf(a.code);\r\n const bPreferred = preferredCountries.indexOf(b.code);\r\n if (aPreferred !== -1 && bPreferred !== -1) return aPreferred - bPreferred;\r\n if (aPreferred !== -1) return -1;\r\n if (bPreferred !== -1) return 1;\r\n return (a.displayName ?? a.name).localeCompare(b.displayName ?? b.name);\r\n });\r\n }\r\n return countries;\r\n }\r\n \r\n return countries.filter(\r\n country =>\r\n country.name.toLowerCase().includes(lowerQuery) ||\r\n (country.displayName ?? '').toLowerCase().includes(lowerQuery) ||\r\n country.code.toLowerCase().includes(lowerQuery) ||\r\n country.dialCodes.some((dialCode) => dialCode.includes(lowerQuery))\r\n );\r\n}\r\n\r\nexport function getCountryDisplayName(country: Country | undefined): string {\r\n return country?.displayName ?? country?.name ?? '';\r\n}\r\n\r\n/**\r\n * Get placeholder based on country format\r\n */\r\nexport function getPlaceholder(country: MaybeCountry): string {\r\n if (!country?.format) return country?.dialCode ? `${country.dialCode} 000 000 0000` : 'Phone number';\r\n return country.format.replace(/#/g, '0');\r\n}\r\n\r\nexport const stripNonDigits = cleanPhone;\r\n\r\nexport function isInternationalFormat(phone: string): boolean {\r\n return phone.trim().startsWith('+') || phone.trim().startsWith('00');\r\n}\r\n\r\nexport function extractDialCode(phone: string): { dialCode: string | null; nationalNumber: string } {\r\n const digits = cleanPhone(phone);\r\n if (!isInternationalFormat(phone)) {\r\n return { dialCode: null, nationalNumber: digits };\r\n }\r\n\r\n const match = countries\r\n .map((country) => country.dialCode)\r\n .sort((left, right) => right.length - left.length)\r\n .find((dialCode) => digits.startsWith(cleanPhone(dialCode)));\r\n\r\n if (!match) {\r\n return { dialCode: null, nationalNumber: digits };\r\n }\r\n\r\n const dialDigits = cleanPhone(match);\r\n return {\r\n dialCode: dialDigits,\r\n nationalNumber: digits.slice(dialDigits.length),\r\n };\r\n}\r\n\r\nexport function detectCountry(phone: string): Country | null {\r\n return detectCountryFromPhone(phone) ?? null;\r\n}\r\n\r\nexport function formatPhoneNumber(\r\n phone: string,\r\n country: MaybeCountry,\r\n format: 'national' | 'international' | 'e164' = 'national'\r\n): string {\r\n if (!phone) return '';\r\n if (format === 'e164') {\r\n return addDialCode(phone, country);\r\n }\r\n\r\n const nationalNumber = isInternationalFormat(phone) ? removeDialCode(phone, country) : phone;\r\n if (!country && format === 'national') {\r\n return cleanPhone(nationalNumber).replace(/(\\d{3})(?=\\d)/g, '$1 ').trim();\r\n }\r\n\r\n const formattedNational = formatPhone(nationalNumber, country);\r\n\r\n if (format === 'international') {\r\n return country ? `${country.dialCode} ${formattedNational}` : addDialCode(phone, country);\r\n }\r\n\r\n return formattedNational;\r\n}\r\n\r\nexport function parseToE164(phone: string, country: MaybeCountry): string {\r\n return addDialCode(phone, country);\r\n}\r\n\r\nexport function getNationalNumber(phone: string, country?: MaybeCountry): string {\r\n if (country) {\r\n return removeDialCode(phone, country);\r\n }\r\n\r\n const detectedCountry = detectCountryFromPhone(phone);\r\n return detectedCountry ? removeDialCode(phone, detectedCountry) : cleanPhone(phone);\r\n}\r\n\r\nfunction validationFailure(\r\n reason: Exclude<ValidationReason, null>,\r\n message: string\r\n): ValidationResult {\r\n return { isValid: false, reason, message, error: message };\r\n}\r\n\r\nfunction validationSuccess(): ValidationResult {\r\n return { isValid: true, reason: null, message: null, error: null };\r\n}\r\n\r\nexport function validatePhoneNumber(\r\n phone: string,\r\n country?: MaybeCountry,\r\n required = false,\r\n customValidator?: (phone: string, country: Country | undefined) => boolean\r\n): ValidationResult {\r\n const digits = cleanPhone(phone);\r\n if (!digits) {\r\n return required\r\n ? validationFailure('required', 'Phone number is required')\r\n : validationSuccess();\r\n }\r\n\r\n const lengthStatus = getLengthValidationStatus(phone, country);\r\n const nationalDigits = country ? cleanPhone(removeDialCode(phone, country)) : digits;\r\n\r\n // Prefer libphonenumber metadata; fall back to a loose heuristic when the\r\n // number cannot be resolved to a country.\r\n if (lengthStatus === 'TOO_SHORT' || (lengthStatus === undefined && nationalDigits.length < 7)) {\r\n return validationFailure('too_short', 'Phone number is too short');\r\n }\r\n\r\n if (lengthStatus === 'TOO_LONG' || isPhoneTooLong(phone, country)) {\r\n return validationFailure('too_long', 'Phone number is too long');\r\n }\r\n\r\n const isValid = customValidator\r\n ? customValidator(phone, country ?? undefined)\r\n : validatePhone(phone, country);\r\n\r\n return isValid ? validationSuccess() : validationFailure('invalid', 'Invalid phone number');\r\n}\r\n\r\nexport function parsePhoneValue(phone: string, country?: MaybeCountry): ParsedPhoneValue {\r\n const countryCode = getCountryCode(country);\r\n const normalized = normalizePhoneInput(phone);\r\n const parsed = normalized.startsWith('+')\r\n ? parsePhoneNumberFromString(normalized)\r\n : parsePhoneNumberFromString(cleanPhone(normalized), countryCode);\r\n\r\n if (!parsed) {\r\n const nationalNumber = country ? removeDialCode(phone, country) : cleanPhone(phone);\r\n return {\r\n country: country ?? undefined,\r\n nationalNumber,\r\n e164: undefined,\r\n isValid: false,\r\n };\r\n }\r\n\r\n const parsedCountry = parsed.country ? getCountryByCode(parsed.country) : country ?? undefined;\r\n\r\n return {\r\n country: parsedCountry,\r\n nationalNumber: parsed.nationalNumber,\r\n e164: parsed.isValid() ? parsed.number : undefined,\r\n isValid: parsed.isValid(),\r\n };\r\n}\r\n\r\nexport function isPhoneNumberComplete(phone: string, country?: MaybeCountry): boolean {\r\n if (!country) {\r\n return cleanPhone(phone).length >= 7;\r\n }\r\n\r\n return validatePhoneLength(phone, country);\r\n}\r\n\r\nexport function formatAsYouType(phone: string, country: MaybeCountry): string {\r\n if (isInternationalFormat(phone) && country) {\r\n return `${country.dialCode} ${formatPhone(removeDialCode(phone, country), country)}`;\r\n }\r\n\r\n return formatPhone(phone, country);\r\n}\r\n\r\nexport const normalizePhoneNumber = cleanPhone;\r\n\r\nexport function phoneNumbersEqual(left: string, right: string): boolean {\r\n return normalizePhoneNumber(left) === normalizePhoneNumber(right);\r\n}\r\n\r\nexport function getCountryDisplayLabel(country: Country, includeDialCode = true): string {\r\n const label = `${country.flag} ${getCountryDisplayName(country)}`;\r\n return includeDialCode ? `${label} (${country.dialCode})` : label;\r\n}\r\n\r\nexport function limitInputLength(phone: string, country?: MaybeCountry): string {\r\n const maxDigits = getMaxNationalDigits(country);\r\n if (!maxDigits) {\r\n return phone;\r\n }\r\n\r\n const isInternational = isInternationalFormat(phone);\r\n const digits = cleanPhone(phone);\r\n const dialDigits = country ? cleanPhone(country.dialCode) : '';\r\n const maxLength = isInternational ? dialDigits.length + maxDigits : maxDigits;\r\n const limited = digits.slice(0, maxLength);\r\n\r\n return isInternational ? `+${limited}` : limited;\r\n}\r\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\r\nimport type { PhoneInputOptions, UsePhoneInputReturn } from './types';\r\nimport type { Country } from './countries';\r\nimport { countries, detectCountryFromPhone, getCountryByCode, localizeCountries, localizeCountry } from './countries';\r\nimport { resolvePhoneInputLabels } from './labels';\r\nimport {\r\n cleanPhone,\r\n formatPhone,\r\n unformatPhone,\r\n addDialCode,\r\n removeDialCode,\r\n filterCountries,\r\n getPlaceholder,\r\n isPhoneTooLong,\r\n validatePhoneNumber,\r\n} from './utils';\r\n\r\n// useLayoutEffect warns when rendering on the server (e.g. Next.js SSR);\r\n// fall back to useEffect there — the caret restoration it drives is a\r\n// browser-only concern anyway.\r\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\r\n\r\nfunction countDigitsBeforePosition(value: string, position: number) {\r\n return value.slice(0, position).replace(/\\D/g, '').length;\r\n}\r\n\r\nfunction getCaretPositionFromDigitCount(value: string, digitCount: number) {\r\n if (digitCount <= 0) {\r\n return value.startsWith('+') ? 1 : 0;\r\n }\r\n\r\n let seenDigits = 0;\r\n\r\n for (let index = 0; index < value.length; index += 1) {\r\n if (/\\d/.test(value[index])) {\r\n seenDigits += 1;\r\n if (seenDigits === digitCount) {\r\n return index + 1;\r\n }\r\n }\r\n }\r\n\r\n return value.length;\r\n}\r\n\r\nexport function usePhoneInput(\r\n options: PhoneInputOptions & {\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (phone: string, country: Country | undefined) => void;\r\n onCountryChange?: (country: Country | undefined) => void;\r\n onBlur?: () => void;\r\n onFocus?: () => void;\r\n } = {}\r\n): UsePhoneInputReturn {\r\n const {\r\n value: controlledValue,\r\n defaultValue = '',\r\n onChange,\r\n onCountryChange,\r\n onBlur,\r\n onFocus,\r\n defaultCountry = 'US',\r\n preferredCountries,\r\n excludeCountries,\r\n excludedCountries,\r\n onlyCountries,\r\n allowedCountries,\r\n autoDetect,\r\n autoDetectCountry,\r\n formatOnType = true,\r\n includeDialCode = false,\r\n required = false,\r\n validator,\r\n onValidationChange,\r\n locale,\r\n labels,\r\n } = options;\r\n const resolvedOnlyCountries = onlyCountries ?? allowedCountries;\r\n const resolvedExcludeCountries = excludeCountries ?? excludedCountries;\r\n const resolvedAutoDetect = autoDetect ?? autoDetectCountry ?? true;\r\n\r\n const isControlled = controlledValue !== undefined;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const pendingCaretDigitIndexRef = useRef<number | null>(null);\r\n const previousDefaultCountryRef = useRef(defaultCountry);\r\n // Tracks whether the current country was explicitly chosen by the user, so\r\n // auto-detect does not override a deliberate selection (see effect below).\r\n const manualCountrySelectionRef = useRef(false);\r\n\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (resolvedOnlyCountries?.length) {\r\n filtered = filtered.filter(c => resolvedOnlyCountries.includes(c.code));\r\n }\r\n \r\n if (resolvedExcludeCountries?.length) {\r\n filtered = filtered.filter(c => !resolvedExcludeCountries.includes(c.code));\r\n }\r\n \r\n return filtered;\r\n }, [resolvedOnlyCountries, resolvedExcludeCountries]);\r\n\r\n const localizedCountries = useMemo(\r\n () => localizeCountries(availableCountries, locale),\r\n [availableCountries, locale]\r\n );\r\n\r\n const resolvedLabels = useMemo(\r\n () => resolvePhoneInputLabels(locale, labels),\r\n [locale, labels]\r\n );\r\n\r\n // Initialize state\r\n const initialCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\r\n const [internalPhone, setInternalPhone] = useState(defaultValue);\r\n const [country, setCountry] = useState<Country | undefined>(initialCountry);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n\r\n // Current phone value\r\n const phone = isControlled ? controlledValue : internalPhone;\r\n\r\n const getOutputCountry = useCallback(\r\n (nextCountry: Country | undefined) => localizeCountry(nextCountry, locale),\r\n [locale]\r\n );\r\n\r\n useEffect(() => {\r\n const defaultCountryChanged = previousDefaultCountryRef.current !== defaultCountry;\r\n previousDefaultCountryRef.current = defaultCountry;\r\n const nextCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\r\n const countryStillAvailable = country\r\n ? availableCountries.some((candidate) => candidate.code === country.code)\r\n : false;\r\n\r\n if (nextCountry && (defaultCountryChanged || !countryStillAvailable) && nextCountry.code !== country?.code) {\r\n setCountry(nextCountry);\r\n onCountryChange?.(getOutputCountry(nextCountry));\r\n }\r\n }, [defaultCountry, availableCountries, country, onCountryChange, getOutputCountry]);\r\n\r\n // Auto-detect country from phone\r\n useEffect(() => {\r\n if (!resolvedAutoDetect || !phone) {\r\n return;\r\n }\r\n\r\n const detected = detectCountryFromPhone(phone);\r\n if (!detected || detected.code === country?.code) {\r\n return;\r\n }\r\n\r\n if (!availableCountries.some((candidate) => candidate.code === detected.code)) {\r\n return;\r\n }\r\n\r\n // Respect a manual selection while it still explains the number's dial\r\n // code — e.g. a +1 number must not flip a manually chosen CA back to US.\r\n const digits = cleanPhone(phone);\r\n const manualSelectionStillMatches =\r\n manualCountrySelectionRef.current &&\r\n country?.dialCodes.some((dialCode) => digits.startsWith(dialCode.replace('+', '')));\r\n if (manualSelectionStillMatches) {\r\n return;\r\n }\r\n\r\n manualCountrySelectionRef.current = false;\r\n setCountry(detected);\r\n onCountryChange?.(getOutputCountry(detected));\r\n }, [availableCountries, resolvedAutoDetect, phone, country, onCountryChange, getOutputCountry]);\r\n\r\n // Format phone number\r\n const formattedPhone = useMemo(() => {\r\n if (formatOnType) {\r\n return formatPhone(includeDialCode && phone.startsWith('+') ? removeDialCode(phone, country) : phone, country);\r\n }\r\n return includeDialCode && phone.startsWith('+') ? removeDialCode(phone, country) : phone;\r\n }, [formatOnType, includeDialCode, phone, country]);\r\n\r\n // Full phone with dial code\r\n const fullPhone = useMemo(() => {\r\n if (includeDialCode && country) {\r\n return addDialCode(phone, country);\r\n }\r\n return phone;\r\n }, [phone, country, includeDialCode]);\r\n\r\n const validation = useMemo(\r\n () => validatePhoneNumber(phone, country, required, validator),\r\n [phone, country, required, validator]\r\n );\r\n\r\n useEffect(() => {\r\n onValidationChange?.(validation);\r\n }, [validation, onValidationChange]);\r\n\r\n const localizedCountry = useMemo(\r\n () => localizeCountry(country, locale),\r\n [country, locale]\r\n );\r\n\r\n // Filtered countries for dropdown\r\n const filteredCountries = useMemo(\r\n () => filterCountries(localizedCountries, searchQuery, preferredCountries),\r\n [localizedCountries, searchQuery, preferredCountries]\r\n );\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n const nextDigitIndex = pendingCaretDigitIndexRef.current;\r\n const input = inputRef.current;\r\n\r\n if (nextDigitIndex === null || !input || typeof input.setSelectionRange !== 'function') {\r\n return;\r\n }\r\n\r\n if (typeof document !== 'undefined' && document.activeElement !== input) {\r\n return;\r\n }\r\n\r\n const caretPosition = getCaretPositionFromDigitCount(formattedPhone, nextDigitIndex);\r\n input.setSelectionRange(caretPosition, caretPosition);\r\n pendingCaretDigitIndexRef.current = null;\r\n }, [formattedPhone]);\r\n\r\n // Set phone handler\r\n const setPhone = useCallback(\r\n (newPhone: string) => {\r\n const unformatted = unformatPhone(newPhone);\r\n if (!isControlled) {\r\n setInternalPhone(unformatted);\r\n }\r\n onChange?.(\r\n includeDialCode ? addDialCode(unformatted, country) : unformatted,\r\n getOutputCountry(country)\r\n );\r\n },\r\n [isControlled, onChange, country, includeDialCode, getOutputCountry]\r\n );\r\n\r\n // Set country handler\r\n const setCountryByCode = useCallback(\r\n (code: string) => {\r\n const newCountry = getCountryByCode(code);\r\n if (newCountry) {\r\n manualCountrySelectionRef.current = true;\r\n setCountry(newCountry);\r\n onCountryChange?.(getOutputCountry(newCountry));\r\n onChange?.(\r\n includeDialCode ? addDialCode(phone, newCountry) : phone,\r\n getOutputCountry(newCountry)\r\n );\r\n }\r\n },\r\n [phone, onChange, onCountryChange, includeDialCode, getOutputCountry]\r\n );\r\n\r\n // Select country from dropdown\r\n const selectCountry = useCallback(\r\n (selectedCountry: Country) => {\r\n const rawCountry = getCountryByCode(selectedCountry.code) ?? selectedCountry;\r\n manualCountrySelectionRef.current = true;\r\n setCountry(rawCountry);\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n onCountryChange?.(getOutputCountry(rawCountry));\r\n onChange?.(\r\n includeDialCode ? addDialCode(phone, rawCountry) : phone,\r\n getOutputCountry(rawCountry)\r\n );\r\n },\r\n [phone, onChange, onCountryChange, includeDialCode, getOutputCountry]\r\n );\r\n\r\n // Toggle dropdown\r\n const toggleDropdown = useCallback(() => {\r\n setIsOpen(prev => !prev);\r\n if (isOpen) {\r\n setSearchQuery('');\r\n }\r\n }, [isOpen]);\r\n\r\n // Open dropdown\r\n const openDropdown = useCallback(() => {\r\n setIsOpen(true);\r\n }, []);\r\n\r\n // Close dropdown\r\n const closeDropdown = useCallback(() => {\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n }, []);\r\n\r\n // Clear input\r\n const clear = useCallback(() => {\r\n if (!isControlled) {\r\n setInternalPhone('');\r\n }\r\n onChange?.('', getOutputCountry(country));\r\n }, [isControlled, onChange, country, getOutputCountry]);\r\n\r\n // Handle input change\r\n const handleInputChange = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const rawValue = event.target.value;\r\n const caretPosition = event.target.selectionStart ?? rawValue.length;\r\n const unformatted = rawValue.trim().startsWith('+') ? `+${rawValue.replace(/\\D/g, '')}` : unformatPhone(rawValue);\r\n\r\n // Cap input at the maximum possible length for the selected country\r\n // (libphonenumber metadata). Deletions are always allowed.\r\n if (\r\n cleanPhone(unformatted).length > cleanPhone(phone).length &&\r\n isPhoneTooLong(unformatted, country)\r\n ) {\r\n event.target.value = formattedPhone;\r\n const restoredCaret = Math.min(Math.max(caretPosition - 1, 0), formattedPhone.length);\r\n if (typeof event.target.setSelectionRange === 'function') {\r\n event.target.setSelectionRange(restoredCaret, restoredCaret);\r\n }\r\n return;\r\n }\r\n\r\n pendingCaretDigitIndexRef.current = countDigitsBeforePosition(rawValue, caretPosition);\r\n setPhone(unformatted);\r\n },\r\n [setPhone, phone, country, formattedPhone]\r\n );\r\n\r\n // Handle focus\r\n const handleFocus = useCallback(() => {\r\n onFocus?.();\r\n }, [onFocus]);\r\n\r\n // Handle blur\r\n const handleBlur = useCallback(() => {\r\n onBlur?.();\r\n }, [onBlur]);\r\n\r\n const getCountryOptionId = useCallback(\r\n (code: string) => `phone-input-country-${code}`,\r\n []\r\n );\r\n\r\n const getCountryOptionProps = useCallback(\r\n (optionCountry: Country, index: number) => ({\r\n id: getCountryOptionId(optionCountry.code),\r\n role: 'option' as const,\r\n 'aria-selected': optionCountry.code === country?.code,\r\n onClick: () => selectCountry(optionCountry),\r\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n selectCountry(optionCountry);\r\n }\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeDropdown();\r\n }\r\n },\r\n tabIndex: index === 0 ? 0 : -1,\r\n }),\r\n [closeDropdown, country?.code, getCountryOptionId, selectCountry]\r\n );\r\n\r\n return {\r\n // State\r\n phone,\r\n value: phone,\r\n fullPhone,\r\n country: localizedCountry,\r\n isValid: validation.isValid,\r\n validationReason: validation.reason,\r\n error: validation.error,\r\n isOpen,\r\n searchQuery,\r\n labels: resolvedLabels,\r\n formattedValue: formattedPhone,\r\n // Actions\r\n setPhone,\r\n setValue: setPhone,\r\n setCountry: setCountryByCode,\r\n toggleDropdown,\r\n toggle: toggleDropdown,\r\n openDropdown,\r\n open: openDropdown,\r\n closeDropdown,\r\n close: closeDropdown,\r\n setSearchQuery,\r\n clear,\r\n // Props\r\n inputProps: {\r\n ref: inputRef,\r\n value: formattedPhone,\r\n onChange: handleInputChange,\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n type: 'tel',\r\n inputMode: 'tel',\r\n autoComplete: 'tel',\r\n placeholder: getPlaceholder(country),\r\n 'aria-invalid': validation.isValid ? undefined : true,\r\n },\r\n countryButtonProps: {\r\n onClick: toggleDropdown,\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'listbox',\r\n 'aria-label': resolvedLabels.countryButtonAriaLabel,\r\n },\r\n countrySelectorProps: {\r\n onClick: toggleDropdown,\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'listbox',\r\n 'aria-label': resolvedLabels.countryButtonAriaLabel,\r\n },\r\n dropdownProps: {\r\n role: 'listbox',\r\n 'aria-label': resolvedLabels.countryOptionsAriaLabel,\r\n },\r\n getCountryOptionId,\r\n filteredCountries,\r\n countries: filteredCountries,\r\n selectCountry,\r\n getCountryOptionProps,\r\n };\r\n}\r\n","import { forwardRef, useCallback, useEffect, useId, useImperativeHandle, useRef, useState, type MutableRefObject, type Ref } from 'react';\nimport { usePhoneInput } from './usePhoneInput';\nimport type { PhoneInputProps } from './types';\nimport type { Country } from './countries';\nimport { getCountryDisplayName } from './utils';\n\n// SVG Icon Components (Lucide-style)\nconst ChevronUpIcon = ({ size = 12 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n);\n\nconst ChevronDownIcon = ({ size = 12 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n);\n\nexport interface PhoneInputRef {\n /** Focus the input */\n focus: () => void;\n /** Blur the input */\n blur: () => void;\n /** Clear the input */\n clear: () => void;\n /** Set country */\n setCountry: (countryCode: string) => void;\n /** Get current country */\n getCountry: () => Country | undefined;\n /** Open country selector */\n open: () => void;\n /** Close country selector */\n close: () => void;\n}\n\n/**\n * PhoneInput component - headless phone input with country selection\n * \n * @example\n * ```tsx\n * <PhoneInput\n * value={value}\n * onChange={setValue}\n * defaultCountry=\"US\"\n * />\n * ```\n * \n * @example\n * ```tsx\n * // With custom styling\n * <PhoneInput\n * value={value}\n * onChange={setValue}\n * defaultCountry=\"GB\"\n * containerClassName=\"phone-input-container\"\n * inputClassName=\"phone-input\"\n * selectorClassName=\"country-selector\"\n * />\n * ```\n */\nexport const PhoneInput = forwardRef<PhoneInputRef, PhoneInputProps>(\n function PhoneInput(props, ref) {\n const {\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n inputClassName,\n selectorClassName,\n containerClassName,\n searchable = true,\n placeholder,\n disabled,\n readOnly,\n name,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...options\n } = props;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const optionRefs = useRef<Array<HTMLLIElement | null>>([]);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const listboxId = useId();\n\n const {\n inputProps,\n countryButtonProps,\n dropdownProps,\n country,\n filteredCountries,\n isOpen,\n isValid,\n searchQuery,\n setSearchQuery,\n setCountry,\n selectCountry,\n clear,\n openDropdown,\n closeDropdown,\n getCountryOptionId,\n labels,\n } = usePhoneInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n ...options,\n });\n\n const hookInputRef = (inputProps as typeof inputProps & { ref?: Ref<HTMLInputElement> }).ref;\n const mergedInputRef = useCallback((element: HTMLInputElement | null) => {\n inputRef.current = element;\n\n if (typeof hookInputRef === 'function') {\n hookInputRef(element);\n } else if (hookInputRef && 'current' in hookInputRef) {\n (hookInputRef as MutableRefObject<HTMLInputElement | null>).current = element;\n }\n }, [hookInputRef]);\n\n // Focus the input\n const focus = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Blur the input\n const blur = useCallback(() => {\n inputRef.current?.blur();\n }, []);\n\n // Handle country option click\n const handleCountryClick = useCallback((c: Country) => {\n selectCountry(c);\n setHighlightedIndex(0);\n }, [selectCountry]);\n\n // Handle country option keyboard navigation\n const handleCountryKeyDown = useCallback((e: React.KeyboardEvent, c: Country, index: number) => {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n selectCountry(c);\n setHighlightedIndex(0);\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (index < filteredCountries.length - 1) {\n const nextIndex = index + 1;\n setHighlightedIndex(nextIndex);\n optionRefs.current[nextIndex]?.focus();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (index > 0) {\n const nextIndex = index - 1;\n setHighlightedIndex(nextIndex);\n optionRefs.current[nextIndex]?.focus();\n }\n break;\n case 'Home':\n e.preventDefault();\n setHighlightedIndex(0);\n optionRefs.current[0]?.focus();\n break;\n case 'End': {\n e.preventDefault();\n const lastIndex = filteredCountries.length - 1;\n setHighlightedIndex(lastIndex);\n optionRefs.current[lastIndex]?.focus();\n break;\n }\n case 'Escape':\n e.preventDefault();\n closeDropdown();\n break;\n }\n }, [selectCountry, filteredCountries.length, closeDropdown]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node | null;\n if (containerRef.current && target && !containerRef.current.contains(target)) {\n closeDropdown();\n }\n };\n\n const handleFocusIn = (event: FocusEvent) => {\n const target = event.target as Node | null;\n if (containerRef.current && target && !containerRef.current.contains(target)) {\n closeDropdown();\n }\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n document.addEventListener('focusin', handleFocusIn);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n document.removeEventListener('focusin', handleFocusIn);\n };\n }, [isOpen, closeDropdown]);\n\n useEffect(() => {\n if (filteredCountries.length === 0) {\n if (highlightedIndex !== 0) {\n setHighlightedIndex(0);\n }\n return;\n }\n\n if (highlightedIndex >= filteredCountries.length) {\n setHighlightedIndex(filteredCountries.length - 1);\n }\n }, [filteredCountries.length, highlightedIndex]);\n\n // Expose imperative methods\n useImperativeHandle(ref, () => ({\n focus,\n blur,\n clear,\n setCountry,\n getCountry: () => country,\n open: openDropdown,\n close: closeDropdown,\n }));\n\n // Handle keyboard navigation from the search input into the list\n const handleSearchKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlightedIndex(0);\n optionRefs.current[0]?.focus();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeDropdown();\n }\n }, [closeDropdown]);\n\n // Render default UI\n return (\n <div ref={containerRef} className={containerClassName} data-valid={isValid}>\n {/* Country Selector Button */}\n <button\n {...countryButtonProps}\n type=\"button\"\n className={selectorClassName}\n disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n aria-controls={listboxId}\n >\n {country ? (\n <>\n <span className=\"phone-input-flag\">{country.flag}</span>\n <span className=\"phone-input-dial-code\">{country.dialCode}</span>\n </>\n ) : (\n <span className=\"phone-input-placeholder\">{labels.selectCountry}</span>\n )}\n <span className=\"phone-input-arrow\" aria-hidden=\"true\">\n {isOpen ? <ChevronUpIcon size={12} /> : <ChevronDownIcon size={12} />}\n </span>\n </button>\n\n {/* Phone Input */}\n <input\n {...inputProps}\n ref={mergedInputRef}\n id={id}\n name={name}\n className={inputClassName}\n placeholder={placeholder || inputProps.placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n />\n\n {/* Country Dropdown */}\n {isOpen && (\n <div className=\"phone-input-dropdown\">\n {/* Search Input */}\n {searchable && (\n <div className=\"phone-input-search\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleSearchKeyDown}\n placeholder={labels.countrySearchPlaceholder}\n autoFocus\n aria-controls={listboxId}\n aria-label={labels.searchCountriesAriaLabel}\n />\n </div>\n )}\n\n {/* Country List */}\n {/* Roving focus is the single focus model here; aria-activedescendant\n is intentionally not set alongside it. */}\n <ul\n {...dropdownProps}\n className=\"phone-input-country-list\"\n id={listboxId}\n >\n {filteredCountries.map((c, index) => (\n <li\n key={c.code}\n id={getCountryOptionId(c.code)}\n ref={(element) => {\n optionRefs.current[index] = element;\n }}\n role=\"option\"\n aria-selected={c.code === country?.code}\n className={`phone-input-country-option ${\n c.code === country?.code ? 'selected' : ''\n } ${index === highlightedIndex ? 'highlighted' : ''}`}\n onClick={() => handleCountryClick(c)}\n onKeyDown={(e) => handleCountryKeyDown(e, c, index)}\n onMouseEnter={() => setHighlightedIndex(index)}\n tabIndex={index === highlightedIndex ? 0 : -1}\n >\n <span className=\"phone-input-flag\">{c.flag}</span>\n <span className=\"phone-input-country-name\">{getCountryDisplayName(c)}</span>\n <span className=\"phone-input-dial-code\">{c.dialCode}</span>\n </li>\n ))}\n {filteredCountries.length === 0 && (\n <li className=\"phone-input-no-results\">{labels.noCountriesFound}</li>\n )}\n </ul>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default PhoneInput;\n"]}
package/package.json CHANGED
@@ -1,75 +1,85 @@
1
- {
2
- "name": "@input-kit/phone",
3
- "version": "0.2.2",
4
- "packageManager": "bun@1.3.3",
5
- "description": "Headless phone input with full world country codes, libphonenumber formatting, and TypeScript",
6
- "type": "module",
7
- "main": "./dist/index.js",
8
- "module": "./dist/index.js",
9
- "types": "./dist/index.d.ts",
10
- "exports": {
11
- ".": {
12
- "types": "./dist/index.d.ts",
13
- "import": "./dist/index.js",
14
- "require": "./dist/index.cjs"
15
- }
16
- },
17
- "files": [
18
- "dist",
19
- "README.md",
20
- "LICENSE"
21
- ],
22
- "sideEffects": false,
23
- "scripts": {
24
- "build": "tsup",
25
- "dev": "tsup --watch",
26
- "test": "vitest run",
27
- "test:watch": "vitest",
28
- "typecheck": "tsc --noEmit",
29
- "lint": "eslint src",
30
- "prepublishOnly": "bun run test && bun run typecheck && bun run build"
31
- },
32
- "keywords": [
33
- "react",
34
- "phone",
35
- "input",
36
- "telephone",
37
- "country",
38
- "flag",
39
- "international",
40
- "typescript",
41
- "headless",
42
- "unstyled",
43
- "accessible",
44
- "validation"
45
- ],
46
- "author": "Harshit",
47
- "license": "MIT",
48
- "engines": {
49
- "node": ">=18.0.0"
50
- },
51
- "peerDependencies": {
52
- "react": "^18.0.0 || ^19.0.0",
53
- "react-dom": "^18.0.0 || ^19.0.0"
54
- },
55
- "devDependencies": {
56
- "@testing-library/react": "^16.3.2",
57
- "@types/react": "^18.3.18",
58
- "@types/react-dom": "^18.3.5",
59
- "@vitejs/plugin-react": "^4.3.4",
60
- "jsdom": "^26.0.0",
61
- "react": "^18.3.1",
62
- "react-dom": "^18.3.1",
63
- "tsup": "^8.3.5",
64
- "typescript": "^5.7.3",
65
- "vitest": "^3.0.4",
66
- "@eslint/js": "^9.19.0",
67
- "eslint": "^9.19.0",
68
- "globals": "^15.14.0",
69
- "typescript-eslint": "^8.22.0"
70
- },
71
- "dependencies": {
72
- "libphonenumber-js": "^1.12.41",
73
- "world-countries": "^5.1.0"
74
- }
75
- }
1
+ {
2
+ "name": "@input-kit/phone",
3
+ "version": "0.3.0",
4
+ "packageManager": "bun@1.3.3",
5
+ "description": "Headless phone input with full world country codes, libphonenumber formatting, and TypeScript",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "sideEffects": false,
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/harshit-d3v/input-kit-phone.git"
27
+ },
28
+ "homepage": "https://github.com/harshit-d3v/input-kit-phone#readme",
29
+ "bugs": {
30
+ "url": "https://github.com/harshit-d3v/input-kit-phone/issues"
31
+ },
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "typecheck": "tsc --noEmit",
38
+ "lint": "eslint src",
39
+ "prepublishOnly": "bun run test && bun run typecheck && bun run build"
40
+ },
41
+ "keywords": [
42
+ "react",
43
+ "phone",
44
+ "input",
45
+ "telephone",
46
+ "country",
47
+ "flag",
48
+ "international",
49
+ "typescript",
50
+ "headless",
51
+ "unstyled",
52
+ "accessible",
53
+ "validation"
54
+ ],
55
+ "author": "Harshit",
56
+ "license": "MIT",
57
+ "engines": {
58
+ "node": ">=18.0.0"
59
+ },
60
+ "peerDependencies": {
61
+ "react": "^18.0.0 || ^19.0.0",
62
+ "react-dom": "^18.0.0 || ^19.0.0"
63
+ },
64
+ "devDependencies": {
65
+ "@testing-library/react": "^16.3.2",
66
+ "@types/react": "^18.3.18",
67
+ "@types/react-dom": "^18.3.5",
68
+ "@vitejs/plugin-react": "^4.3.4",
69
+ "jsdom": "^26.0.0",
70
+ "react": "^18.3.1",
71
+ "react-dom": "^18.3.1",
72
+ "tsup": "^8.3.5",
73
+ "typescript": "^5.7.3",
74
+ "vitest": "^3.0.4",
75
+ "@eslint/js": "^9.19.0",
76
+ "eslint": "^9.19.0",
77
+ "eslint-plugin-react-hooks": "^5.1.0",
78
+ "globals": "^15.14.0",
79
+ "typescript-eslint": "^8.22.0"
80
+ },
81
+ "dependencies": {
82
+ "libphonenumber-js": "^1.12.41",
83
+ "world-countries": "^5.1.0"
84
+ }
85
+ }