@input-kit/phone 0.1.3 → 0.2.1

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","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","validatePhoneNumber","required","maxDigits","nationalDigits","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","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","isValid","error","localizedCountry","filteredCountries","useLayoutEffect","nextDigitIndex","input","caretPosition","setPhone","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","rawCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur","getCountryOptionProps","optionCountry","ChevronUpIcon","size","jsx","ChevronDownIcon","PhoneInput","forwardRef","props","ref","inputClassName","selectorClassName","containerClassName","searchable","placeholder","disabled","readOnly","name","id","ariaLabel","ariaLabelledBy","optionRefs","highlightedIndex","setHighlightedIndex","listboxId","useId","inputProps","countryButtonProps","hookInputRef","mergedInputRef","element","focus","blur","handleCountryClick","handleCountryKeyDown","e","nextIndex","useImperativeHandle","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());\nconst worldCountryMap = new Map(worldCountries.map((country) => [country.cca2, country]));\nconst FALLBACK_COUNTRIES: Record<string, { name: string; dialCode?: string; flag?: string }> = {\n AC: { name: 'Ascension Island', dialCode: '+247' },\n TA: { name: 'Tristan da Cunha', dialCode: '+290' },\n BQ: { name: 'Caribbean Netherlands', dialCode: '+599' },\n};\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 {\n return code\n .toUpperCase()\n .replace(/./g, (char) => String.fromCodePoint(127397 + char.charCodeAt(0)));\n}\n\nfunction buildDialCodes(country: (typeof worldCountries)[number] | undefined, fallbackDialCode: string) {\n const root = country?.idd?.root;\n if (!root) {\n return [fallbackDialCode];\n }\n\n const suffixes = country.idd?.suffixes?.length ? country.idd.suffixes : [''];\n const dialCodes = suffixes\n .map((suffix) => normalizeDialCode(root, suffix))\n .filter((dialCode) => /^\\+\\d+$/.test(dialCode));\n\n return Array.from(new Set([fallbackDialCode, ...(dialCodes.length ? dialCodes : [])]));\n}\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)\n .map<Country>((code) => {\n const country = worldCountryMap.get(code);\n const fallback = FALLBACK_COUNTRIES[code];\n const dialCode = fallback?.dialCode ?? `+${getCountryCallingCode(code as CountryCode)}`;\n const dialCodes = buildDialCodes(country, dialCode);\n\n return {\n code,\n name: country?.name.common ?? fallback?.name ?? code,\n dialCode,\n dialCodes,\n flag: country?.flag || fallback?.flag || codeToFlag(code),\n format: getCountryFormat(code as CountryCode),\n } satisfies Country;\n })\n .sort((left, right) => {\n const priorityDelta = getCountryPriority(left.code) - getCountryPriority(right.code);\n return priorityDelta !== 0 ? priorityDelta : left.name.localeCompare(right.name);\n });\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 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';\nimport { countries, detectCountryFromPhone } from './countries';\nimport { AsYouType, isPossiblePhoneNumber, isValidPhoneNumber, validatePhoneNumberLength as validateLength, type CountryCode } from 'libphonenumber-js';\n\ntype MaybeCountry = Country | null | undefined;\n\nfunction normalizePhoneInput(phone: string): string {\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 {\n return country?.code as CountryCode | undefined;\n}\n\nfunction getMaxNationalDigits(country: MaybeCountry): number | undefined {\n return country?.format?.replace(/[^#]/g, '').length;\n}\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 {\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 {\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(\n phone: string,\n country: MaybeCountry,\n customValidator?: (phone: string, country: Country | undefined) => boolean\n): boolean {\n if (!phone) return false;\r\n \r\n if (customValidator) {\r\n return customValidator(phone, country ?? undefined);\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 {\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 {\n if (!country) return phone;\n\n const normalized = normalizePhoneInput(phone);\n const digits = cleanPhone(normalized);\n const primaryDialDigits = cleanPhone(country.dialCode);\n\n if (digits.startsWith(primaryDialDigits)) {\n return digits.slice(primaryDialDigits.length);\n }\n\n for (const dialCode of country.dialCodes) {\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 {\n return country?.displayName ?? country?.name ?? '';\n}\n\r\n/**\r\n * Get placeholder based on country format\r\n */\r\nexport function getPlaceholder(country: MaybeCountry): string {\n if (!country?.format) return country?.dialCode ? `${country.dialCode} 000 000 0000` : 'Phone number';\n return country.format.replace(/#/g, '0');\n}\n\nexport const stripNonDigits = cleanPhone;\n\nexport function isInternationalFormat(phone: string): boolean {\n return phone.trim().startsWith('+') || phone.trim().startsWith('00');\n}\n\nexport function extractDialCode(phone: string): { dialCode: string | null; nationalNumber: string } {\n const digits = cleanPhone(phone);\n if (!isInternationalFormat(phone)) {\n return { dialCode: null, nationalNumber: digits };\n }\n\n const match = countries\n .map((country) => country.dialCode)\n .sort((left, right) => right.length - left.length)\n .find((dialCode) => digits.startsWith(cleanPhone(dialCode)));\n\n if (!match) {\n return { dialCode: null, nationalNumber: digits };\n }\n\n const dialDigits = cleanPhone(match);\n return {\n dialCode: dialDigits,\n nationalNumber: digits.slice(dialDigits.length),\n };\n}\n\nexport function detectCountry(phone: string): Country | null {\n return detectCountryFromPhone(phone) ?? null;\n}\n\nexport function formatPhoneNumber(\n phone: string,\n country: MaybeCountry,\n format: 'national' | 'international' | 'e164' = 'national'\n): string {\n if (!phone) return '';\n if (format === 'e164') {\n return addDialCode(phone, country);\n }\n\n const nationalNumber = isInternationalFormat(phone) ? removeDialCode(phone, country) : phone;\n if (!country && format === 'national') {\n return cleanPhone(nationalNumber).slice(0, 9).replace(/(\\d{3})(?=\\d)/g, '$1 ').trim();\n }\n\n const formattedNational = formatPhone(nationalNumber, country);\n\n if (format === 'international') {\n return country ? `${country.dialCode} ${formattedNational}` : addDialCode(phone, country);\n }\n\n return formattedNational;\n}\n\nexport function parseToE164(phone: string, country: MaybeCountry): string {\n return addDialCode(phone, country);\n}\n\nexport function getNationalNumber(phone: string, country?: MaybeCountry): string {\n if (country) {\n return removeDialCode(phone, country);\n }\n\n const detectedCountry = detectCountryFromPhone(phone);\n return detectedCountry ? removeDialCode(phone, detectedCountry) : cleanPhone(phone);\n}\n\nexport function validatePhoneNumber(\n phone: string,\n country?: MaybeCountry,\n required = false\n): { isValid: boolean; error: string | null } {\n const digits = cleanPhone(phone);\n if (!digits) {\n return required\n ? { isValid: false, error: 'Phone number is required' }\n : { isValid: true, error: null };\n }\n\n const maxDigits = getMaxNationalDigits(country);\n const nationalDigits = country ? cleanPhone(removeDialCode(phone, country)) : digits;\n\n if (nationalDigits.length < 7) {\n return { isValid: false, error: 'Phone number is too short' };\n }\n\n if (maxDigits && nationalDigits.length > maxDigits) {\n return { isValid: false, error: `Phone number is too long (max ${maxDigits} digits)` };\n }\n\n const isValid = validatePhone(phone, country);\n return isValid ? { isValid: true, error: null } : { isValid: false, error: 'Invalid phone number' };\n}\n\nexport function isPhoneNumberComplete(phone: string, country?: MaybeCountry): boolean {\n if (!country) {\n return cleanPhone(phone).length >= 7;\n }\n\n return validatePhoneLength(phone, country);\n}\n\nexport function formatAsYouType(phone: string, country: MaybeCountry): string {\n if (isInternationalFormat(phone) && country) {\n return `${country.dialCode} ${formatPhone(removeDialCode(phone, country), country)}`;\n }\n\n return formatPhone(phone, country);\n}\n\nexport const normalizePhoneNumber = cleanPhone;\n\nexport function phoneNumbersEqual(left: string, right: string): boolean {\n return normalizePhoneNumber(left) === normalizePhoneNumber(right);\n}\n\nexport function getCountryDisplayLabel(country: Country, includeDialCode = true): string {\n const label = `${country.flag} ${getCountryDisplayName(country)}`;\n return includeDialCode ? `${label} (${country.dialCode})` : label;\n}\n\nexport function limitInputLength(phone: string, country?: MaybeCountry): string {\n const maxDigits = getMaxNationalDigits(country);\n if (!maxDigits) {\n return phone;\n }\n\n const isInternational = isInternationalFormat(phone);\n const digits = cleanPhone(phone);\n const dialDigits = country ? cleanPhone(country.dialCode) : '';\n const maxLength = isInternational ? dialDigits.length + maxDigits : maxDigits;\n const limited = digits.slice(0, maxLength);\n\n return isInternational ? `+${limited}` : limited;\n}\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 validatePhone,\r\n addDialCode,\r\n removeDialCode,\r\n filterCountries,\n getPlaceholder,\n validatePhoneNumber,\n} from './utils';\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;\n defaultValue?: string;\n onChange?: (phone: string, country: Country | undefined) => void;\n onCountryChange?: (country: Country | undefined) => void;\n onBlur?: () => void;\n onFocus?: () => void;\n } = {}\n): UsePhoneInputReturn {\r\n const {\r\n value: controlledValue,\r\n defaultValue = '',\n onChange,\n onCountryChange,\n onBlur,\n onFocus,\n defaultCountry = 'US',\n preferredCountries,\n excludeCountries,\n excludedCountries,\n onlyCountries,\n allowedCountries,\n autoDetect,\n autoDetectCountry,\n formatOnType = true,\n includeDialCode = false,\n required = false,\n validator,\n locale,\n labels,\n } = options;\n const resolvedOnlyCountries = onlyCountries ?? allowedCountries;\n const resolvedExcludeCountries = excludeCountries ?? excludedCountries;\n const resolvedAutoDetect = autoDetect ?? autoDetectCountry ?? true;\n\r\n const isControlled = controlledValue !== undefined;\n const inputRef = useRef<HTMLInputElement>(null);\n const pendingCaretDigitIndexRef = useRef<number | null>(null);\n const previousDefaultCountryRef = useRef(defaultCountry);\n\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (resolvedOnlyCountries?.length) {\n filtered = filtered.filter(c => resolvedOnlyCountries.includes(c.code));\n }\n \n if (resolvedExcludeCountries?.length) {\n filtered = filtered.filter(c => !resolvedExcludeCountries.includes(c.code));\n }\n \n return filtered;\n }, [resolvedOnlyCountries, resolvedExcludeCountries]);\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\n const phone = isControlled ? controlledValue : internalPhone;\n\n const getOutputCountry = useCallback(\n (nextCountry: Country | undefined) => localizeCountry(nextCountry, locale),\n [locale]\n );\n\n useEffect(() => {\n const defaultCountryChanged = previousDefaultCountryRef.current !== defaultCountry;\n previousDefaultCountryRef.current = defaultCountry;\n const nextCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\n const countryStillAvailable = country\n ? availableCountries.some((candidate) => candidate.code === country.code)\n : false;\n\n if (nextCountry && (defaultCountryChanged || !countryStillAvailable)) {\n setCountry(nextCountry);\n }\n }, [defaultCountry, availableCountries, country]);\n\r\n // Auto-detect country from phone\r\n useEffect(() => {\r\n if (resolvedAutoDetect && phone) {\n const detected = detectCountryFromPhone(phone);\n if (detected && availableCountries.some((candidate) => candidate.code === detected.code) && detected.code !== country?.code) {\n setCountry(detected);\n onCountryChange?.(getOutputCountry(detected));\n }\n }\n }, [availableCountries, resolvedAutoDetect, phone, country?.code, onCountryChange, getOutputCountry]);\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 // Validation\r\n const isValid = useMemo(\n () => validatePhone(phone, country, validator),\n [phone, country, validator]\n );\n\n const error = useMemo(\n () => validatePhoneNumber(phone, country, required).error,\n [phone, country, required]\n );\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(() => {\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);\n onCountryChange?.(getOutputCountry(newCountry));\n onChange?.(\n includeDialCode ? addDialCode(phone, newCountry) : phone,\r\n getOutputCountry(newCountry)\r\n );\r\n }\r\n },\r\n [phone, onChange, onCountryChange, includeDialCode, getOutputCountry]\n );\n\r\n // Select country from dropdown\r\n const selectCountry = useCallback(\r\n (selectedCountry: Country) => {\r\n const rawCountry = getCountryByCode(selectedCountry.code) ?? selectedCountry;\n setCountry(rawCountry);\n setIsOpen(false);\n setSearchQuery('');\n onCountryChange?.(getOutputCountry(rawCountry));\n onChange?.(\n includeDialCode ? addDialCode(phone, rawCountry) : phone,\r\n getOutputCountry(rawCountry)\r\n );\r\n },\r\n [phone, onChange, onCountryChange, includeDialCode, getOutputCountry]\n );\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(() => {\n onBlur?.();\n }, [onBlur]);\n\n const getCountryOptionProps = useCallback(\n (optionCountry: Country, index: number) => ({\n role: 'option' as const,\n 'aria-selected': optionCountry.code === country?.code,\n onClick: () => selectCountry(optionCountry),\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n selectCountry(optionCountry);\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n closeDropdown();\n }\n },\n tabIndex: index === 0 ? 0 : -1,\n }),\n [closeDropdown, country?.code, selectCountry]\n );\n\r\n return {\r\n // State\r\n phone,\n value: phone,\n fullPhone,\n country: localizedCountry,\n isValid,\n error,\n isOpen,\n searchQuery,\n labels: resolvedLabels,\n formattedValue: formattedPhone,\n // Actions\n setPhone,\n setValue: setPhone,\n setCountry: setCountryByCode,\n toggleDropdown,\n toggle: toggleDropdown,\n openDropdown,\n open: openDropdown,\n closeDropdown,\n close: closeDropdown,\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 ? !isValid : undefined,\r\n },\r\n countryButtonProps: {\n onClick: toggleDropdown,\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'listbox',\n 'aria-label': resolvedLabels.countryButtonAriaLabel,\n },\n countrySelectorProps: {\n onClick: toggleDropdown,\n 'aria-expanded': isOpen,\n 'aria-haspopup': true,\n 'aria-label': resolvedLabels.countryButtonAriaLabel,\n },\n dropdownProps: {\n role: 'listbox',\n 'aria-label': resolvedLabels.countryOptionsAriaLabel,\n },\n filteredCountries,\n countries: filteredCountries,\n selectCountry,\n getCountryOptionProps,\n };\n}\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 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 country,\n filteredCountries,\n isOpen,\n isValid,\n searchQuery,\n setSearchQuery,\n setCountry,\n selectCountry,\n clear,\n openDropdown,\n closeDropdown,\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 (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 // Render default UI\n return (\n <div 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 className=\"phone-input-country-list\" id={listboxId} role=\"listbox\" aria-label={labels.countryOptionsAriaLabel}>\n {filteredCountries.map((c, index) => (\n <li\n key={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":["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"]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@input-kit/phone",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
+ "packageManager": "bun@1.3.3",
4
5
  "description": "Headless phone input with full world country codes, libphonenumber formatting, and TypeScript",
5
6
  "type": "module",
6
7
  "main": "./dist/index.js",
@@ -25,8 +26,8 @@
25
26
  "test": "vitest run",
26
27
  "test:watch": "vitest",
27
28
  "typecheck": "tsc --noEmit",
28
- "lint": "eslint src --ext .ts,.tsx",
29
- "prepublishOnly": "npm run build"
29
+ "lint": "eslint src",
30
+ "prepublishOnly": "bun run test && bun run typecheck && bun run build"
30
31
  },
31
32
  "keywords": [
32
33
  "react",
@@ -61,7 +62,11 @@
61
62
  "react-dom": "^18.3.1",
62
63
  "tsup": "^8.3.5",
63
64
  "typescript": "^5.7.3",
64
- "vitest": "^3.0.4"
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"
65
70
  },
66
71
  "dependencies": {
67
72
  "libphonenumber-js": "^1.12.41",