react-phone-number-input-pro 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +185 -0
  4. package/dist/components/CountryDropdown/CountryDropdown.d.ts +17 -0
  5. package/dist/components/CountryDropdown/CountryDropdown.d.ts.map +1 -0
  6. package/dist/components/CountryDropdown/index.d.ts +2 -0
  7. package/dist/components/CountryDropdown/index.d.ts.map +1 -0
  8. package/dist/components/NumberInput/NumberInput.d.ts +21 -0
  9. package/dist/components/NumberInput/NumberInput.d.ts.map +1 -0
  10. package/dist/components/NumberInput/index.d.ts +2 -0
  11. package/dist/components/NumberInput/index.d.ts.map +1 -0
  12. package/dist/components/PhoneInput/PhoneInput.d.ts +23 -0
  13. package/dist/components/PhoneInput/PhoneInput.d.ts.map +1 -0
  14. package/dist/components/PhoneInput/index.d.ts +2 -0
  15. package/dist/components/PhoneInput/index.d.ts.map +1 -0
  16. package/dist/data/countries.d.ts +14 -0
  17. package/dist/data/countries.d.ts.map +1 -0
  18. package/dist/data/countryAliases.d.ts +7 -0
  19. package/dist/data/countryAliases.d.ts.map +1 -0
  20. package/dist/data/phoneRules.d.ts +21 -0
  21. package/dist/data/phoneRules.d.ts.map +1 -0
  22. package/dist/hooks/useAutoDetect.d.ts +11 -0
  23. package/dist/hooks/useAutoDetect.d.ts.map +1 -0
  24. package/dist/hooks/useCountrySearch.d.ts +17 -0
  25. package/dist/hooks/useCountrySearch.d.ts.map +1 -0
  26. package/dist/hooks/useFormatter.d.ts +10 -0
  27. package/dist/hooks/useFormatter.d.ts.map +1 -0
  28. package/dist/hooks/usePhoneInput.d.ts +15 -0
  29. package/dist/hooks/usePhoneInput.d.ts.map +1 -0
  30. package/dist/index.cjs +2 -0
  31. package/dist/index.cjs.map +1 -0
  32. package/dist/index.d.ts +11 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.mjs +1181 -0
  35. package/dist/index.mjs.map +1 -0
  36. package/dist/phone-input.css +1 -0
  37. package/dist/tests/setup.d.ts +2 -0
  38. package/dist/tests/setup.d.ts.map +1 -0
  39. package/dist/types/index.d.ts +95 -0
  40. package/dist/types/index.d.ts.map +1 -0
  41. package/dist/utils/formatter.d.ts +27 -0
  42. package/dist/utils/formatter.d.ts.map +1 -0
  43. package/dist/utils/parser.d.ts +20 -0
  44. package/dist/utils/parser.d.ts.map +1 -0
  45. package/dist/utils/validator.d.ts +13 -0
  46. package/dist/utils/validator.d.ts.map +1 -0
  47. package/package.json +95 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/data/countries.ts","../src/hooks/useAutoDetect.ts","../src/utils/formatter.ts","../src/data/phoneRules.ts","../src/utils/validator.ts","../src/utils/parser.ts","../src/hooks/usePhoneInput.ts","../src/data/countryAliases.ts","../src/hooks/useCountrySearch.ts","../src/components/CountryDropdown/CountryDropdown.tsx","../src/components/NumberInput/NumberInput.tsx","../src/components/PhoneInput/PhoneInput.tsx"],"sourcesContent":["import type { Country } from '../types';\n\n/**\n * Complete list of 250 countries and territories with ISO codes and dial codes.\n * Sorted alphabetically by country name.\n */\nexport const countries: Country[] = [\n { name: 'Afghanistan', code: 'AF', dialCode: '+93' },\n { name: 'Albania', code: 'AL', dialCode: '+355' },\n { name: 'Algeria', code: 'DZ', dialCode: '+213' },\n { name: 'American Samoa', code: 'AS', dialCode: '+1684' },\n { name: 'Andorra', code: 'AD', dialCode: '+376' },\n { name: 'Angola', code: 'AO', dialCode: '+244' },\n { name: 'Anguilla', code: 'AI', dialCode: '+1264' },\n { name: 'Antigua and Barbuda', code: 'AG', dialCode: '+1268' },\n { name: 'Argentina', code: 'AR', dialCode: '+54' },\n { name: 'Armenia', code: 'AM', dialCode: '+374' },\n { name: 'Aruba', code: 'AW', dialCode: '+297' },\n { name: 'Australia', code: 'AU', dialCode: '+61' },\n { name: 'Austria', code: 'AT', dialCode: '+43' },\n { name: 'Azerbaijan', code: 'AZ', dialCode: '+994' },\n { name: 'Bahamas', code: 'BS', dialCode: '+1242' },\n { name: 'Bahrain', code: 'BH', dialCode: '+973' },\n { name: 'Bangladesh', code: 'BD', dialCode: '+880' },\n { name: 'Barbados', code: 'BB', dialCode: '+1246' },\n { name: 'Belarus', code: 'BY', dialCode: '+375' },\n { name: 'Belgium', code: 'BE', dialCode: '+32' },\n { name: 'Belize', code: 'BZ', dialCode: '+501' },\n { name: 'Benin', code: 'BJ', dialCode: '+229' },\n { name: 'Bermuda', code: 'BM', dialCode: '+1441' },\n { name: 'Bhutan', code: 'BT', dialCode: '+975' },\n { name: 'Bolivia', code: 'BO', dialCode: '+591' },\n { name: 'Bosnia and Herzegovina', code: 'BA', dialCode: '+387' },\n { name: 'Botswana', code: 'BW', dialCode: '+267' },\n { name: 'Brazil', code: 'BR', dialCode: '+55' },\n { name: 'British Indian Ocean Territory', code: 'IO', dialCode: '+246' },\n { name: 'British Virgin Islands', code: 'VG', dialCode: '+1284' },\n { name: 'Brunei', code: 'BN', dialCode: '+673' },\n { name: 'Bulgaria', code: 'BG', dialCode: '+359' },\n { name: 'Burkina Faso', code: 'BF', dialCode: '+226' },\n { name: 'Burundi', code: 'BI', dialCode: '+257' },\n { name: 'Cambodia', code: 'KH', dialCode: '+855' },\n { name: 'Cameroon', code: 'CM', dialCode: '+237' },\n { name: 'Canada', code: 'CA', dialCode: '+1' },\n { name: 'Cabo Verde', code: 'CV', dialCode: '+238' },\n { name: 'Cayman Islands', code: 'KY', dialCode: '+1345' },\n { name: 'Central African Republic', code: 'CF', dialCode: '+236' },\n { name: 'Chad', code: 'TD', dialCode: '+235' },\n { name: 'Chile', code: 'CL', dialCode: '+56' },\n { name: 'China', code: 'CN', dialCode: '+86' },\n { name: 'Colombia', code: 'CO', dialCode: '+57' },\n { name: 'Comoros', code: 'KM', dialCode: '+269' },\n { name: 'Congo (Democratic Republic)', code: 'CD', dialCode: '+243' },\n { name: 'Congo (Republic)', code: 'CG', dialCode: '+242' },\n { name: 'Cook Islands', code: 'CK', dialCode: '+682' },\n { name: 'Costa Rica', code: 'CR', dialCode: '+506' },\n { name: 'Croatia', code: 'HR', dialCode: '+385' },\n { name: 'Cuba', code: 'CU', dialCode: '+53' },\n { name: 'Curaçao', code: 'CW', dialCode: '+599' },\n { name: 'Cyprus', code: 'CY', dialCode: '+357' },\n { name: 'Czech Republic', code: 'CZ', dialCode: '+420' },\n { name: 'Denmark', code: 'DK', dialCode: '+45' },\n { name: 'Djibouti', code: 'DJ', dialCode: '+253' },\n { name: 'Dominica', code: 'DM', dialCode: '+1767' },\n { name: 'Dominican Republic', code: 'DO', dialCode: '+1809' },\n { name: 'Ecuador', code: 'EC', dialCode: '+593' },\n { name: 'Egypt', code: 'EG', dialCode: '+20' },\n { name: 'El Salvador', code: 'SV', dialCode: '+503' },\n { name: 'Equatorial Guinea', code: 'GQ', dialCode: '+240' },\n { name: 'Eritrea', code: 'ER', dialCode: '+291' },\n { name: 'Estonia', code: 'EE', dialCode: '+372' },\n { name: 'Eswatini', code: 'SZ', dialCode: '+268' },\n { name: 'Ethiopia', code: 'ET', dialCode: '+251' },\n { name: 'Falkland Islands', code: 'FK', dialCode: '+500' },\n { name: 'Faroe Islands', code: 'FO', dialCode: '+298' },\n { name: 'Fiji', code: 'FJ', dialCode: '+679' },\n { name: 'Finland', code: 'FI', dialCode: '+358' },\n { name: 'France', code: 'FR', dialCode: '+33' },\n { name: 'French Guiana', code: 'GF', dialCode: '+594' },\n { name: 'French Polynesia', code: 'PF', dialCode: '+689' },\n { name: 'Gabon', code: 'GA', dialCode: '+241' },\n { name: 'Gambia', code: 'GM', dialCode: '+220' },\n { name: 'Georgia', code: 'GE', dialCode: '+995' },\n { name: 'Germany', code: 'DE', dialCode: '+49' },\n { name: 'Ghana', code: 'GH', dialCode: '+233' },\n { name: 'Gibraltar', code: 'GI', dialCode: '+350' },\n { name: 'Greece', code: 'GR', dialCode: '+30' },\n { name: 'Greenland', code: 'GL', dialCode: '+299' },\n { name: 'Grenada', code: 'GD', dialCode: '+1473' },\n { name: 'Guadeloupe', code: 'GP', dialCode: '+590' },\n { name: 'Guam', code: 'GU', dialCode: '+1671' },\n { name: 'Guatemala', code: 'GT', dialCode: '+502' },\n { name: 'Guinea', code: 'GN', dialCode: '+224' },\n { name: 'Guinea-Bissau', code: 'GW', dialCode: '+245' },\n { name: 'Guyana', code: 'GY', dialCode: '+592' },\n { name: 'Haiti', code: 'HT', dialCode: '+509' },\n { name: 'Honduras', code: 'HN', dialCode: '+504' },\n { name: 'Hong Kong', code: 'HK', dialCode: '+852' },\n { name: 'Hungary', code: 'HU', dialCode: '+36' },\n { name: 'Iceland', code: 'IS', dialCode: '+354' },\n { name: 'India', code: 'IN', dialCode: '+91' },\n { name: 'Indonesia', code: 'ID', dialCode: '+62' },\n { name: 'Iran', code: 'IR', dialCode: '+98' },\n { name: 'Iraq', code: 'IQ', dialCode: '+964' },\n { name: 'Ireland', code: 'IE', dialCode: '+353' },\n { name: 'Isle of Man', code: 'IM', dialCode: '+44' },\n { name: 'Israel', code: 'IL', dialCode: '+972' },\n { name: 'Italy', code: 'IT', dialCode: '+39' },\n { name: 'Ivory Coast', code: 'CI', dialCode: '+225' },\n { name: 'Jamaica', code: 'JM', dialCode: '+1876' },\n { name: 'Japan', code: 'JP', dialCode: '+81' },\n { name: 'Jordan', code: 'JO', dialCode: '+962' },\n { name: 'Kazakhstan', code: 'KZ', dialCode: '+7' },\n { name: 'Kenya', code: 'KE', dialCode: '+254' },\n { name: 'Kiribati', code: 'KI', dialCode: '+686' },\n { name: 'Kosovo', code: 'XK', dialCode: '+383' },\n { name: 'Kuwait', code: 'KW', dialCode: '+965' },\n { name: 'Kyrgyzstan', code: 'KG', dialCode: '+996' },\n { name: 'Laos', code: 'LA', dialCode: '+856' },\n { name: 'Latvia', code: 'LV', dialCode: '+371' },\n { name: 'Lebanon', code: 'LB', dialCode: '+961' },\n { name: 'Lesotho', code: 'LS', dialCode: '+266' },\n { name: 'Liberia', code: 'LR', dialCode: '+231' },\n { name: 'Libya', code: 'LY', dialCode: '+218' },\n { name: 'Liechtenstein', code: 'LI', dialCode: '+423' },\n { name: 'Lithuania', code: 'LT', dialCode: '+370' },\n { name: 'Luxembourg', code: 'LU', dialCode: '+352' },\n { name: 'Macau', code: 'MO', dialCode: '+853' },\n { name: 'Madagascar', code: 'MG', dialCode: '+261' },\n { name: 'Malawi', code: 'MW', dialCode: '+265' },\n { name: 'Malaysia', code: 'MY', dialCode: '+60' },\n { name: 'Maldives', code: 'MV', dialCode: '+960' },\n { name: 'Mali', code: 'ML', dialCode: '+223' },\n { name: 'Malta', code: 'MT', dialCode: '+356' },\n { name: 'Marshall Islands', code: 'MH', dialCode: '+692' },\n { name: 'Martinique', code: 'MQ', dialCode: '+596' },\n { name: 'Mauritania', code: 'MR', dialCode: '+222' },\n { name: 'Mauritius', code: 'MU', dialCode: '+230' },\n { name: 'Mayotte', code: 'YT', dialCode: '+262' },\n { name: 'Mexico', code: 'MX', dialCode: '+52' },\n { name: 'Micronesia', code: 'FM', dialCode: '+691' },\n { name: 'Moldova', code: 'MD', dialCode: '+373' },\n { name: 'Monaco', code: 'MC', dialCode: '+377' },\n { name: 'Mongolia', code: 'MN', dialCode: '+976' },\n { name: 'Montenegro', code: 'ME', dialCode: '+382' },\n { name: 'Montserrat', code: 'MS', dialCode: '+1664' },\n { name: 'Morocco', code: 'MA', dialCode: '+212' },\n { name: 'Mozambique', code: 'MZ', dialCode: '+258' },\n { name: 'Myanmar', code: 'MM', dialCode: '+95' },\n { name: 'Namibia', code: 'NA', dialCode: '+264' },\n { name: 'Nauru', code: 'NR', dialCode: '+674' },\n { name: 'Nepal', code: 'NP', dialCode: '+977' },\n { name: 'Netherlands', code: 'NL', dialCode: '+31' },\n { name: 'New Caledonia', code: 'NC', dialCode: '+687' },\n { name: 'New Zealand', code: 'NZ', dialCode: '+64' },\n { name: 'Nicaragua', code: 'NI', dialCode: '+505' },\n { name: 'Niger', code: 'NE', dialCode: '+227' },\n { name: 'Nigeria', code: 'NG', dialCode: '+234' },\n { name: 'Niue', code: 'NU', dialCode: '+683' },\n { name: 'Norfolk Island', code: 'NF', dialCode: '+672' },\n { name: 'North Korea', code: 'KP', dialCode: '+850' },\n { name: 'North Macedonia', code: 'MK', dialCode: '+389' },\n { name: 'Northern Mariana Islands', code: 'MP', dialCode: '+1670' },\n { name: 'Norway', code: 'NO', dialCode: '+47' },\n { name: 'Oman', code: 'OM', dialCode: '+968' },\n { name: 'Pakistan', code: 'PK', dialCode: '+92' },\n { name: 'Palau', code: 'PW', dialCode: '+680' },\n { name: 'Palestine', code: 'PS', dialCode: '+970' },\n { name: 'Panama', code: 'PA', dialCode: '+507' },\n { name: 'Papua New Guinea', code: 'PG', dialCode: '+675' },\n { name: 'Paraguay', code: 'PY', dialCode: '+595' },\n { name: 'Peru', code: 'PE', dialCode: '+51' },\n { name: 'Philippines', code: 'PH', dialCode: '+63' },\n { name: 'Poland', code: 'PL', dialCode: '+48' },\n { name: 'Portugal', code: 'PT', dialCode: '+351' },\n { name: 'Puerto Rico', code: 'PR', dialCode: '+1939' },\n { name: 'Qatar', code: 'QA', dialCode: '+974' },\n { name: 'Réunion', code: 'RE', dialCode: '+262' },\n { name: 'Romania', code: 'RO', dialCode: '+40' },\n { name: 'Russia', code: 'RU', dialCode: '+7' },\n { name: 'Rwanda', code: 'RW', dialCode: '+250' },\n { name: 'Saint Barthélemy', code: 'BL', dialCode: '+590' },\n { name: 'Saint Helena', code: 'SH', dialCode: '+290' },\n { name: 'Saint Kitts and Nevis', code: 'KN', dialCode: '+1869' },\n { name: 'Saint Lucia', code: 'LC', dialCode: '+1758' },\n { name: 'Saint Martin', code: 'MF', dialCode: '+590' },\n { name: 'Saint Pierre and Miquelon', code: 'PM', dialCode: '+508' },\n { name: 'Saint Vincent and the Grenadines', code: 'VC', dialCode: '+1784' },\n { name: 'Samoa', code: 'WS', dialCode: '+685' },\n { name: 'San Marino', code: 'SM', dialCode: '+378' },\n { name: 'São Tomé and Príncipe', code: 'ST', dialCode: '+239' },\n { name: 'Saudi Arabia', code: 'SA', dialCode: '+966' },\n { name: 'Senegal', code: 'SN', dialCode: '+221' },\n { name: 'Serbia', code: 'RS', dialCode: '+381' },\n { name: 'Seychelles', code: 'SC', dialCode: '+248' },\n { name: 'Sierra Leone', code: 'SL', dialCode: '+232' },\n { name: 'Singapore', code: 'SG', dialCode: '+65' },\n { name: 'Sint Maarten', code: 'SX', dialCode: '+1721' },\n { name: 'Slovakia', code: 'SK', dialCode: '+421' },\n { name: 'Slovenia', code: 'SI', dialCode: '+386' },\n { name: 'Solomon Islands', code: 'SB', dialCode: '+677' },\n { name: 'Somalia', code: 'SO', dialCode: '+252' },\n { name: 'South Africa', code: 'ZA', dialCode: '+27' },\n { name: 'South Korea', code: 'KR', dialCode: '+82' },\n { name: 'South Sudan', code: 'SS', dialCode: '+211' },\n { name: 'Spain', code: 'ES', dialCode: '+34' },\n { name: 'Sri Lanka', code: 'LK', dialCode: '+94' },\n { name: 'Sudan', code: 'SD', dialCode: '+249' },\n { name: 'Suriname', code: 'SR', dialCode: '+597' },\n { name: 'Svalbard and Jan Mayen', code: 'SJ', dialCode: '+47' },\n { name: 'Sweden', code: 'SE', dialCode: '+46' },\n { name: 'Switzerland', code: 'CH', dialCode: '+41' },\n { name: 'Syria', code: 'SY', dialCode: '+963' },\n { name: 'Taiwan', code: 'TW', dialCode: '+886' },\n { name: 'Tajikistan', code: 'TJ', dialCode: '+992' },\n { name: 'Tanzania', code: 'TZ', dialCode: '+255' },\n { name: 'Thailand', code: 'TH', dialCode: '+66' },\n { name: 'Timor-Leste', code: 'TL', dialCode: '+670' },\n { name: 'Togo', code: 'TG', dialCode: '+228' },\n { name: 'Tokelau', code: 'TK', dialCode: '+690' },\n { name: 'Tonga', code: 'TO', dialCode: '+676' },\n { name: 'Trinidad and Tobago', code: 'TT', dialCode: '+1868' },\n { name: 'Tunisia', code: 'TN', dialCode: '+216' },\n { name: 'Turkey', code: 'TR', dialCode: '+90' },\n { name: 'Turkmenistan', code: 'TM', dialCode: '+993' },\n { name: 'Turks and Caicos Islands', code: 'TC', dialCode: '+1649' },\n { name: 'Tuvalu', code: 'TV', dialCode: '+688' },\n { name: 'Uganda', code: 'UG', dialCode: '+256' },\n { name: 'Ukraine', code: 'UA', dialCode: '+380' },\n { name: 'United Arab Emirates', code: 'AE', dialCode: '+971' },\n { name: 'United Kingdom', code: 'GB', dialCode: '+44' },\n { name: 'United States', code: 'US', dialCode: '+1' },\n { name: 'Uruguay', code: 'UY', dialCode: '+598' },\n { name: 'US Virgin Islands', code: 'VI', dialCode: '+1340' },\n { name: 'Uzbekistan', code: 'UZ', dialCode: '+998' },\n { name: 'Vanuatu', code: 'VU', dialCode: '+678' },\n { name: 'Vatican City', code: 'VA', dialCode: '+379' },\n { name: 'Venezuela', code: 'VE', dialCode: '+58' },\n { name: 'Vietnam', code: 'VN', dialCode: '+84' },\n { name: 'Wallis and Futuna', code: 'WF', dialCode: '+681' },\n { name: 'Western Sahara', code: 'EH', dialCode: '+212' },\n { name: 'Yemen', code: 'YE', dialCode: '+967' },\n { name: 'Zambia', code: 'ZM', dialCode: '+260' },\n { name: 'Zimbabwe', code: 'ZW', dialCode: '+263' },\n];\n\n/** Map of ISO code → Country for O(1) lookups */\nexport const countryMap: Map<string, Country> = new Map(\n countries.map((c) => [c.code, c]),\n);\n\n/** Get a country by its ISO code */\nexport const getCountryByCode = (code: string): Country | undefined =>\n countryMap.get(code.toUpperCase());\n\n/** Get all countries whose dialCode matches the given prefix */\nexport const getCountriesByDialCode = (dialCode: string): Country[] =>\n countries.filter((c) => c.dialCode === dialCode);\n","import { useEffect, useState } from 'react';\nimport { getCountryByCode } from '../data/countries';\nimport type { Country } from '../types';\n\nconst FALLBACK_COUNTRY: Country = { name: 'India', code: 'IN', dialCode: '+91' };\n\n/**\n * Attempts to detect the user's country from the browser's locale setting.\n *\n * Strategy:\n * 1. Parse navigator.language (e.g. \"en-IN\" → \"IN\")\n * 2. Also check navigator.languages for a more specific locale\n * 3. Fall back to India (+91) if detection fails\n */\nconst detectCountryFromLocale = (): Country => {\n try {\n const langs = navigator.languages?.length\n ? navigator.languages\n : [navigator.language];\n\n for (const lang of langs) {\n // Locale format: \"en-IN\", \"hi-IN\", \"zh-CN\", \"pt-BR\" etc.\n const parts = lang.split('-');\n if (parts.length >= 2) {\n const regionCode = parts[parts.length - 1].toUpperCase();\n const found = getCountryByCode(regionCode);\n if (found) return found;\n }\n }\n } catch {\n // navigator not available (SSR)\n }\n\n return FALLBACK_COUNTRY;\n};\n\n/**\n * Hook that resolves the initial country.\n *\n * - If `defaultCountry` is \"auto\" or undefined → detects from browser locale\n * - If `defaultCountry` is a valid ISO code → uses that country\n * - Falls back to India if nothing matches\n */\nexport const useAutoDetect = (defaultCountry?: string): Country => {\n const [country, setCountry] = useState<Country>(() => {\n if (!defaultCountry || defaultCountry === 'auto') {\n return detectCountryFromLocale();\n }\n return getCountryByCode(defaultCountry) ?? FALLBACK_COUNTRY;\n });\n\n useEffect(() => {\n if (!defaultCountry || defaultCountry === 'auto') {\n setCountry(detectCountryFromLocale());\n } else {\n const found = getCountryByCode(defaultCountry);\n if (found) setCountry(found);\n }\n }, [defaultCountry]);\n\n return country;\n};\n","/**\n * Phone number mask engine.\n *\n * Applies a format mask to a string of raw digits.\n * 'X' in the mask is replaced by the next available digit.\n * All other mask characters (spaces, dashes, parens) are kept as literals.\n *\n * @example applyMask(\"9876543210\", \"XXXXX XXXXX\") → \"98765 43210\"\n * @example applyMask(\"9876543210\", \"(XXX) XXX-XXXX\") → \"(987) 654-3210\"\n * @example applyMask(\"12\", \"XXXXX XXXXX\") → \"12\" (partial input)\n */\nexport const applyMask = (digits: string, mask: string): string => {\n if (!digits) return '';\n\n let digitIndex = 0;\n let result = '';\n\n for (let i = 0; i < mask.length; i++) {\n if (mask[i] === 'X') {\n if (digitIndex >= digits.length) break;\n result += digits[digitIndex++];\n } else {\n result += mask[i];\n }\n }\n\n // Trim trailing separator characters (spaces, dashes, parens)\n // that appear when digits don't fill the next group.\n return result.replace(/[\\s\\-()]+$/, '');\n};\n\n/**\n * Strip all non-digit characters from a string.\n * @example stripNonDigits(\"+91 98765-43210\") → \"919876543210\"\n */\nexport const stripNonDigits = (value: string): string =>\n value.replace(/\\D/g, '');\n\n/**\n * Count how many 'X' placeholders are in a mask.\n * This equals the max length of digits the mask can hold.\n */\nexport const getMaskCapacity = (mask: string): number =>\n [...mask].filter((c) => c === 'X').length;\n\n/**\n * Truncate raw digits to fit within the mask capacity.\n */\nexport const truncateToMask = (digits: string, mask: string): string =>\n digits.slice(0, getMaskCapacity(mask));\n","import type { PhoneRule } from '../types';\n\n/**\n * Default rule for phone number validation.\n * Fallback rule used when a country-specific rule is not defined.\n * Accepts 7–14 digits — covers most edge cases worldwide.\n */\nexport const defaultRule: PhoneRule = {\n mask: 'XXXXXXXXXXXXXXX',\n regex: /^\\d{7,14}$/,\n min: 7,\n max: 14,\n};\n\n/**\n * Per-country phone number validation rules.\n * - mask: 'X' = digit, other characters = literal separators\n * - regex: validates the national number (raw digits only, no country code)\n * - min/max: length of national number digits\n */\nexport const phoneRules: Record<string, PhoneRule> = {\n // ─── Asia ──────────────────────────────────────────────────────────────────\n\n IN: { mask: 'XXXXX XXXXX', regex: /^[6-9]\\d{9}$/, min: 10, max: 10 }, // India (+91)\n CN: { mask: 'XXX XXXX XXXX', regex: /^1[3-9]\\d{9}$/, min: 11, max: 11 }, // China (+86)\n JP: { mask: 'XXX-XXXX-XXXX', regex: /^0[789]0\\d{8}$/, min: 11, max: 11 }, // Japan (+81)\n KR: { mask: 'XXX-XXXX-XXXX', regex: /^01[016789]\\d{7,8}$/, min: 10, max: 11 }, // South Korea (+82)\n PK: { mask: 'XXX XXXXXXX', regex: /^3[0-46]\\d{8}$/, min: 10, max: 10 }, // Pakistan (+92)\n BD: { mask: 'XXXX-XXXXXX', regex: /^1[3-9]\\d{8}$/, min: 10, max: 10 }, // Bangladesh (+880)\n PH: { mask: 'XXX XXX XXXX', regex: /^9\\d{9}$/, min: 10, max: 10 }, // Philippines (+63)\n ID: { mask: 'XXXX-XXXX-XXXX', regex: /^8(1[1-9]|2[1-9]|3[1-9]|5[1-9]|7[1-9]|8[1-9]|9[1-9])\\d{6,9}$/, min: 9, max: 12 }, // Indonesia (+62)\n VN: { mask: 'XXX XXX XXXX', regex: /^[35789]\\d{8}$/, min: 9, max: 10 }, // Vietnam (+84)\n TH: { mask: 'XX-XXXX-XXXX', regex: /^[689]\\d{8}$/, min: 9, max: 9 }, // Thailand (+66)\n MY: { mask: 'XX-XXXX XXXX', regex: /^1[0-9]\\d{7,8}$/, min: 9, max: 10 }, // Malaysia (+60)\n SG: { mask: 'XXXX XXXX', regex: /^[89]\\d{7}$/, min: 8, max: 8 }, // Singapore (+65)\n LK: { mask: 'XXX XXX XXXX', regex: /^7[0-9]\\d{7}$/, min: 9, max: 9 }, // Sri Lanka (+94)\n NP: { mask: 'XXX-XXXXXXX', regex: /^9[78]\\d{8}$/, min: 10, max: 10 }, // Nepal (+977)\n MM: { mask: 'XX XXXX XXXX', regex: /^[0-9]\\d{8,9}$/, min: 8, max: 10 }, // Myanmar (+95)\n LA: { mask: 'XX XX XXXXX', regex: /^[0-9]\\d{7,9}$/, min: 8, max: 10 }, // Laos (+856)\n AF: { mask: 'XXX XXX XXXX', regex: /^7[0-9]\\d{8}$/, min: 9, max: 9 }, // Afghanistan (+93)\n SY: { mask: 'XXX XXX XXX', regex: /^9[0-9]\\d{7}$/, min: 9, max: 9 }, // Syrian Arab Republic (+963)\n LB: { mask: 'XX XXX XXX', regex: /^[37]\\d{7}$/, min: 7, max: 8 }, // Lebanon (+961)\n JO: { mask: 'X XXXX XXXX', regex: /^7[7-9]\\d{7}$/, min: 9, max: 9 }, // Jordan (+962)\n SA: { mask: 'XXX XXX XXXX', regex: /^5[013-9]\\d{7}$/, min: 9, max: 9 }, // Saudi Arabia (+966)\n AE: { mask: 'XX XXX XXXX', regex: /^5[024568]\\d{7}$/, min: 9, max: 9 }, // United Arab Emirates (+971)\n KW: { mask: 'XXXX XXXX', regex: /^[569]\\d{7}$/, min: 8, max: 8 }, // Kuwait (+965)\n YE: { mask: 'XXX XXX XXX', regex: /^7[0-7]\\d{7}$/, min: 9, max: 9 }, // Yemen (+967)\n IL: { mask: 'XXX-XXX-XXXX', regex: /^5[0-9]\\d{8}$/, min: 9, max: 10 }, // Israel (+972)\n PS: { mask: 'XXX XXX XXXX', regex: /^5[6-9]\\d{7}$/, min: 9, max: 9 }, // Palestinian Territories (+970)\n KZ: { mask: 'XXX XXX-XX-XX', regex: /^7[0-9]\\d{8}$/, min: 10, max: 10 }, // Kazakhstan (+7)\n UZ: { mask: 'XX XXX XX XX', regex: /^[39]\\d{8}$/, min: 9, max: 9 }, // Uzbekistan (+998)\n TJ: { mask: 'XX XXX XXXX', regex: /^[0-9]\\d{8}$/, min: 9, max: 9 }, // Tajikistan (+992)\n TM: { mask: 'XX XXXXXX', regex: /^[6]\\d{7}$/, min: 8, max: 8 }, // Turkmenistan (+993)\n KG: { mask: 'XXX XXX XXX', regex: /^[0-9]\\d{8}$/, min: 9, max: 9 }, // Kyrgyzstan (+996)\n AZ: { mask: 'XX XXX XX XX', regex: /^[57]\\d{8}$/, min: 9, max: 9 }, // Azerbaijan (+994)\n AM: { mask: 'XX XXXXXX', regex: /^[049]\\d{7}$/, min: 8, max: 8 }, // Armenia (+374)\n GE: { mask: 'XXX XXX XXX', regex: /^[579]\\d{8}$/, min: 9, max: 9 }, // Georgia (+995)\n BT: { mask: 'XXX XXXXX', regex: /^[127]\\d{6,7}$/, min: 7, max: 8 }, // Bhutan (+975)\n MV: { mask: 'XXX-XXXX', regex: /^[7-9]\\d{6}$/, min: 7, max: 7 }, // Maldives (+960)\n MN: { mask: 'XXXX XXXX', regex: /^[5689]\\d{7}$/, min: 8, max: 8 }, // Mongolia (+976)\n KP: { mask: 'XXX XXXX XXX', regex: /^[0-9]\\d{8,9}$/, min: 9, max: 10 }, // North Korea (+850)\n TW: { mask: 'XXXX-XXXXXX', regex: /^9\\d{8}$/, min: 9, max: 9 }, // Taiwan (+886)\n HK: { mask: 'XXXX XXXX', regex: /^[5-9]\\d{7}$/, min: 8, max: 8 }, // Hong Kong (+852)\n MO: { mask: 'XXXX XXXX', regex: /^6\\d{7}$/, min: 8, max: 8 }, // China Macau (+853)\n BN: { mask: 'XXX XXXX', regex: /^[27]\\d{6}$/, min: 7, max: 7 }, // Brunei (+673)\n TL: { mask: 'XXXX XXXX', regex: /^[7]\\d{7}$/, min: 8, max: 8 }, // Timor Leste (+670)\n // ─── Europe ────────────────────────────────────────────────────────────────\n\n GB: { mask: 'XXXXX XXXXXX', regex: /^7[0-9]\\d{8}$/, min: 10, max: 10 }, // United Kingdom (+44)\n DE: { mask: 'XXXX XXXXXXXX', regex: /^1[5-7]\\d{9,10}$/, min: 10, max: 11 }, // Germany (+49)\n FR: { mask: 'XX XX XX XX XX', regex: /^[67]\\d{8}$/, min: 9, max: 9 }, // France (+33)\n IT: { mask: 'XXX XXXXXXX', regex: /^3[0-9]\\d{8}$/, min: 9, max: 10 }, // Italy (+39)\n ES: { mask: 'XXX XXX XXX', regex: /^[67]\\d{8}$/, min: 9, max: 9 }, // Spain (+34)\n PT: { mask: 'XXX XXX XXX', regex: /^9[1236]\\d{7}$/, min: 9, max: 9 }, // Portugal (+351)\n NL: { mask: 'X XXXX XXXX', regex: /^6\\d{8}$/, min: 9, max: 9 }, // Netherlands (+31)\n BE: { mask: 'XXX XX XX XX', regex: /^4[5-9]\\d{7}$/, min: 9, max: 9 }, // Belgium (+32)\n CH: { mask: 'XX XXX XX XX', regex: /^7[5-9]\\d{7}$/, min: 9, max: 9 }, // Switzerland (+41)\n AT: { mask: 'XXX XXXXXX', regex: /^6[5-9]\\d{7,9}$/, min: 9, max: 11 }, // Austria (+43)\n PL: { mask: 'XXX XXX XXX', regex: /^[45678]\\d{8}$/, min: 9, max: 9 }, // Poland (+48)\n RU: { mask: 'XXX XXX-XX-XX', regex: /^[39]\\d{9}$/, min: 10, max: 10 }, // Russia (+7)\n UA: { mask: 'XX XXX XX XX', regex: /^[5-9]\\d{8}$/, min: 9, max: 9 }, // Ukraine (+380)\n SE: { mask: 'XX XXX XX XX', regex: /^7[0-9]\\d{7,8}$/, min: 9, max: 10 }, // Sweden (+46)\n NO: { mask: 'XXX XX XXX', regex: /^[49]\\d{7}$/, min: 8, max: 8 }, // Norway (+47)\n DK: { mask: 'XX XX XX XX', regex: /^[2-9]\\d{7}$/, min: 8, max: 8 }, // Denmark (+45)\n FI: { mask: 'XX XXX XXXX', regex: /^[45]\\d{8,9}$/, min: 9, max: 10 }, // Finland (+358)\n GR: { mask: 'XXX XXX XXXX', regex: /^6[0-9]\\d{8}$/, min: 10, max: 10 }, // Greece (+30)\n CZ: { mask: 'XXX XXX XXX', regex: /^[67]\\d{8}$/, min: 9, max: 9 }, // Czech Republic (+420)\n HU: { mask: 'XX XXX XXXX', regex: /^[27]\\d{8}$/, min: 9, max: 9 }, // Hungary (+36)\n RO: { mask: 'XXX XXX XXX', regex: /^7[0-9]\\d{7}$/, min: 9, max: 9 }, // Romania (+40)\n BG: { mask: 'XXX XXX XXX', regex: /^[89]\\d{8}$/, min: 9, max: 9 }, // Bulgaria (+359)\n RS: { mask: 'XX XXXXXXX', regex: /^6[0-9]\\d{6,7}$/, min: 8, max: 9 }, // Serbia (+381)\n HR: { mask: 'XX XXX XXXX', regex: /^9[125789]\\d{6,7}$/, min: 8, max: 9 }, // Croatia (+385)\n SK: { mask: 'XXX XXX XXX', regex: /^9[0-9]\\d{7}$/, min: 9, max: 9 }, // Slovakia (+421)\n AL: { mask: 'XX XXX XXXX', regex: /^6[0-9]\\d{7}$/, min: 9, max: 9 }, // Albania (+355)\n MK: { mask: 'XX XXX XXX', regex: /^7[0-9]\\d{6}$/, min: 8, max: 8 }, // Macedonia (+389)\n ME: { mask: 'XX XXX XXX', regex: /^6[0-9]\\d{6}$/, min: 8, max: 8 }, // Montenegro (+382)\n IE: { mask: 'XXX XXX XXXX', regex: /^8[35-9]\\d{7}$/, min: 9, max: 9 }, // Ireland (+353)\n IS: { mask: 'XXX XXXX', regex: /^[5-8]\\d{6}$/, min: 7, max: 7 }, // Iceland (+354)\n LU: { mask: 'XXX XXX XXX', regex: /^6[269]\\d{7}$/, min: 9, max: 9 }, // Luxembourg (+352)\n LT: { mask: 'X XXXX XXXX', regex: /^6\\d{7}$/, min: 8, max: 8 }, // Lithuania (+370)\n LV: { mask: 'XX XXX XXX', regex: /^2[0-9]\\d{6}$/, min: 8, max: 8 }, // Latvia (+371)\n EE: { mask: 'XXXX XXXX', regex: /^[35]\\d{6,7}$/, min: 7, max: 8 }, // Estonia (+372)\n BY: { mask: 'XX XXX-XX-XX', regex: /^[2345]\\d{8}$/, min: 9, max: 9 }, // Belarus (+375)\n MD: { mask: 'XX XXX XXX', regex: /^6[789]\\d{6}$/, min: 8, max: 8 }, // Moldova (+373)\n TR: { mask: 'XXX XXX XXXX', regex: /^5[0-9]\\d{8}$/, min: 10, max: 10 }, // Turkey (+90)\n CY: { mask: 'XX XXXXXX', regex: /^9[6-9]\\d{6}$/, min: 8, max: 8 }, // Cyprus (+357)\n MT: { mask: 'XXXX XXXX', regex: /^[79]\\d{7}$/, min: 8, max: 8 }, // Malta (+356)\n SM: { mask: 'XXX XXXXXX', regex: /^6\\d{8}$/, min: 9, max: 9 }, // San Marino (+378)\n MC: { mask: 'XXXX XXXX', regex: /^[46]\\d{7}$/, min: 8, max: 8 }, // Monaco (+377)\n LI: { mask: 'XXX XXXXX', regex: /^[67]\\d{6,7}$/, min: 7, max: 8 }, // Liechtenstein (+423)\n AD: { mask: 'XXX XXX', regex: /^[346]\\d{5}$/, min: 6, max: 6 }, // Andorra (+376)\n XK: { mask: 'XX XXX XXX', regex: /^4[3-9]\\d{6}$/, min: 8, max: 8 }, // Kosovo (+383)\n // ─── Americas ──────────────────────────────────────────────────────────────\n\n US: { mask: '(XXX) XXX-XXXX', regex: /^[2-9]\\d{9}$/, min: 10, max: 10 }, // United States (+1)\n CA: { mask: '(XXX) XXX-XXXX', regex: /^[2-9]\\d{9}$/, min: 10, max: 10 }, // Canada (+1)\n MX: { mask: 'XXX XXX XXXX', regex: /^[2-9]\\d{9}$/, min: 10, max: 10 }, // Mexico (+52)\n BR: { mask: '(XX) XXXXX-XXXX', regex: /^[1-9]\\d{9,10}$/, min: 10, max: 11 }, // Brazil (+55)\n AR: { mask: 'XX XXXX-XXXX', regex: /^9\\d{9,10}$/, min: 10, max: 11 }, // Argentina (+54)\n CO: { mask: 'XXX XXX XXXX', regex: /^3[0-9]\\d{8}$/, min: 10, max: 10 }, // Colombia (+57)\n CL: { mask: 'X XXXX XXXX', regex: /^9\\d{8}$/, min: 9, max: 9 }, // Chile (+56)\n PE: { mask: 'XXX XXX XXX', regex: /^9\\d{8}$/, min: 9, max: 9 }, // Peru (+51)\n VE: { mask: 'XXX-XXX-XXXX', regex: /^[24][0-9]\\d{7}$/, min: 10, max: 10 }, // Venezuela (+58)\n EC: { mask: 'XX XXX XXXX', regex: /^9\\d{8}$/, min: 9, max: 9 }, // Ecuador (+593)\n BO: { mask: 'XXXX XXXX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Bolivia (+591)\n PY: { mask: 'XXX XXX XXX', regex: /^9[5-9]\\d{7}$/, min: 9, max: 9 }, // Paraguay (+595)\n UY: { mask: 'X XXX XXXX', regex: /^9\\d{7}$/, min: 8, max: 8 }, // Uruguay (+598)\n GY: { mask: 'XXX XXXX', regex: /^6\\d{6}$/, min: 7, max: 7 }, // Guyana (+592)\n SR: { mask: 'XXX XXXX', regex: /^[67]\\d{6}$/, min: 7, max: 7 }, // Suriname (+597)\n CR: { mask: 'XXXX XXXX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Costa Rica (+506)\n PA: { mask: 'XXXX XXXX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Panama (+507)\n GT: { mask: 'XXXX XXXX', regex: /^[45]\\d{7}$/, min: 8, max: 8 }, // Guatemala (+502)\n HN: { mask: 'XXXX XXXX', regex: /^[37]\\d{7}$/, min: 8, max: 8 }, // Honduras (+504)\n SV: { mask: 'XXXX XXXX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // El Salvador (+503)\n NI: { mask: 'XXXX XXXX', regex: /^[578]\\d{7}$/, min: 8, max: 8 }, // Nicaragua (+505)\n BZ: { mask: 'XXX XXXX', regex: /^[6]\\d{6}$/, min: 7, max: 7 }, // Belize (+501)\n CU: { mask: 'X XXX XXXX', regex: /^5\\d{7}$/, min: 8, max: 8 }, // Cuba (+53)\n HT: { mask: 'XXXX XXXX', regex: /^[34]\\d{7}$/, min: 8, max: 8 }, // Haiti (+509)\n DO: { mask: '(XXX) XXX-XXXX', regex: /^[89]\\d{9}$/, min: 10, max: 10 }, // Dominican Republic (+1)\n JM: { mask: '(XXX) XXX-XXXX', regex: /^876\\d{7}$/, min: 10, max: 10 }, // Jamaica (+1)\n TT: { mask: '(XXX) XXX-XXXX', regex: /^868\\d{7}$/, min: 10, max: 10 }, // Trinidad And Tobago (+1)\n BB: { mask: '(XXX) XXX-XXXX', regex: /^246\\d{7}$/, min: 10, max: 10 }, // Barbados (+1)\n GD: { mask: '(XXX) XXX-XXXX', regex: /^473\\d{7}$/, min: 10, max: 10 }, // Grenada (+1)\n DM: { mask: '(XXX) XXX-XXXX', regex: /^767\\d{7}$/, min: 10, max: 10 }, // Dominica (+1)\n VC: { mask: '(XXX) XXX-XXXX', regex: /^784\\d{7}$/, min: 10, max: 10 }, // Saint Vincent And The Grenadines (+1)\n LC: { mask: '(XXX) XXX-XXXX', regex: /^758\\d{7}$/, min: 10, max: 10 }, // Saint Lucia (+1)\n KN: { mask: '(XXX) XXX-XXXX', regex: /^869\\d{7}$/, min: 10, max: 10 }, // Saint Kitts And Nevis (+1)\n AG: { mask: '(XXX) XXX-XXXX', regex: /^268\\d{7}$/, min: 10, max: 10 }, // Antigua And Barbuda (+1)\n BS: { mask: '(XXX) XXX-XXXX', regex: /^242\\d{7}$/, min: 10, max: 10 }, // Bahamas (+1)\n // ─── Africa ────────────────────────────────────────────────────────────────\n\n NG: { mask: 'XXX XXX XXXX', regex: /^[789]\\d{9}$/, min: 10, max: 10 }, // Nigeria (+234)\n ZA: { mask: 'XX XXX XXXX', regex: /^[678]\\d{8}$/, min: 9, max: 9 }, // South Africa (+27)\n EG: { mask: 'XXX XXX XXXX', regex: /^1[0-9]\\d{8}$/, min: 10, max: 10 }, // Egypt (+20)\n ET: { mask: 'XX XXX XXXX', regex: /^9[1-9]\\d{7}$/, min: 9, max: 9 }, // Ethiopia (+251)\n KE: { mask: 'XXX XXX XXX', regex: /^7[0-9]\\d{7}$/, min: 9, max: 9 }, // Kenya (+254)\n TZ: { mask: 'XXX XXX XXX', regex: /^7[5-9]\\d{7}$/, min: 9, max: 9 }, // Tanzania (+255)\n UG: { mask: 'XXX XXXXXX', regex: /^7[0-9]\\d{7}$/, min: 9, max: 9 }, // Uganda (+256)\n GH: { mask: 'XXX XXX XXXX', regex: /^[25]\\d{8}$/, min: 9, max: 9 }, // Ghana (+233)\n MA: { mask: 'XXX-XXX-XXX', regex: /^6[0-9]\\d{7}$/, min: 9, max: 9 }, // Morocco (+212)\n TN: { mask: 'XX XXX XXX', regex: /^[259]\\d{7}$/, min: 8, max: 8 }, // Tunisia (+216)\n DZ: { mask: 'XXX XX XX XX', regex: /^[567]\\d{8}$/, min: 9, max: 9 }, // Algeria (+213)\n LY: { mask: 'XX XXXXXXX', regex: /^9[1-9]\\d{7}$/, min: 9, max: 9 }, // Libya (+218)\n SD: { mask: 'XXX XXX XXXX', regex: /^9[0-9]\\d{8}$/, min: 9, max: 9 }, // Sudan (+249)\n CM: { mask: 'XXXX XXXX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Cameroon (+237)\n SN: { mask: 'XX XXX XXXX', regex: /^7[0-9]\\d{7}$/, min: 9, max: 9 }, // Senegal (+221)\n CI: { mask: 'XX XX XX XXXX', regex: /^[057]\\d{8}$/, min: 9, max: 10 }, // Côte D'ivoire (+225)\n AO: { mask: 'XXX XXX XXX', regex: /^9[1-9]\\d{7}$/, min: 9, max: 9 }, // Angola (+244)\n MZ: { mask: 'XX XXX XXXX', regex: /^8[24567]\\d{7}$/, min: 9, max: 9 }, // Mozambique (+258)\n ZW: { mask: 'XX XXX XXXX', regex: /^7[1-9]\\d{7}$/, min: 9, max: 9 }, // Zimbabwe (+263)\n ZM: { mask: 'XXX XXXXXX', regex: /^9[567]\\d{7}$/, min: 9, max: 9 }, // Zambia (+260)\n RW: { mask: 'XXX XXX XXX', regex: /^7[2-9]\\d{7}$/, min: 9, max: 9 }, // Rwanda (+250)\n MW: { mask: 'XXX XX XXXX', regex: /^[189]\\d{8}$/, min: 9, max: 9 }, // Malawi (+265)\n NA: { mask: 'XX XXX XXXX', regex: /^[68]\\d{8}$/, min: 9, max: 9 }, // Namibia (+264)\n BW: { mask: 'XX XXX XXX', regex: /^7[1-9]\\d{6}$/, min: 8, max: 8 }, // Botswana (+267)\n MG: { mask: 'XX XX XXX XX', regex: /^3[0-9]\\d{8}$/, min: 9, max: 9 }, // Madagascar (+261)\n SC: { mask: 'X XXX XXX', regex: /^2\\d{6}$/, min: 7, max: 7 }, // Seychelles (+248)\n SL: { mask: 'XXX XXXXXX', regex: /^[37]\\d{7}$/, min: 8, max: 8 }, // Sierra Leone (+232)\n LR: { mask: 'XXX XXX XXXX', regex: /^[47]\\d{8}$/, min: 9, max: 9 }, // Liberia (+231)\n GW: { mask: 'XXX XXXX', regex: /^[59]\\d{6}$/, min: 7, max: 7 }, // Guinea-bissau (+245)\n MU: { mask: 'XXXX XXXX', regex: /^[25]\\d{7}$/, min: 8, max: 8 }, // Mauritius (+230)\n GA: { mask: 'XX XX XX XX', regex: /^0[67]\\d{6}$/, min: 8, max: 8 }, // Gabon (+241)\n BJ: { mask: 'XX XXX XXXX', regex: /^[69]\\d{7}$/, min: 8, max: 8 }, // Benin (+229)\n TG: { mask: 'XX XXX XXX', regex: /^[79]\\d{7}$/, min: 8, max: 8 }, // Togo (+228)\n GN: { mask: 'XXX XX XX XX', regex: /^6[2-9]\\d{7}$/, min: 9, max: 9 }, // Guinea (+224)\n ML: { mask: 'XX XX XX XX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Mali (+223)\n BF: { mask: 'XX XX XX XX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Burkina Faso (+226)\n NE: { mask: 'XX XX XX XX', regex: /^[89]\\d{7}$/, min: 8, max: 8 }, // Niger (+227)\n MR: { mask: 'XXXX XXXX', regex: /^[23]\\d{7}$/, min: 8, max: 8 }, // Mauritania (+222)\n GM: { mask: 'XXX XXXX', regex: /^[79]\\d{6}$/, min: 7, max: 7 }, // Gambia (+220)\n CF: { mask: 'XX XX XX XX', regex: /^[27]\\d{7}$/, min: 8, max: 8 }, // Central African Republic (+236)\n TD: { mask: 'XX XX XX XX', regex: /^[69]\\d{7}$/, min: 8, max: 8 }, // Chad (+235)\n BI: { mask: 'XX XX XX XX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Burundi (+257)\n SS: { mask: 'XXX XXX XXXX', regex: /^9[0-9]\\d{8}$/, min: 9, max: 9 }, // South Sudan (+211)\n SO: { mask: 'XXX XXX XXX', regex: /^[679]\\d{8}$/, min: 9, max: 9 }, // Somalia (+252)\n DJ: { mask: 'XX XX XX XX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Djibouti (+253)\n ER: { mask: 'XXX XXX XXX', regex: /^[178]\\d{6}$/, min: 7, max: 7 }, // Eritrea (+291)\n KM: { mask: 'XXX XXXX', regex: /^[37]\\d{6}$/, min: 7, max: 7 }, // Comoros (+269)\n ST: { mask: 'XXX XXXX', regex: /^9\\d{6}$/, min: 7, max: 7 }, // São Tomé and Príncipe (+239)\n GQ: { mask: 'XXX XXX XXX', regex: /^[23]\\d{8}$/, min: 9, max: 9 }, // Equatorial Guinea (+240)\n SZ: { mask: 'XX XXX XXX', regex: /^[67]\\d{7}$/, min: 8, max: 8 }, // Eswatini (+268)\n LS: { mask: 'XXXX XXXX', regex: /^[56]\\d{7}$/, min: 8, max: 8 }, // Lesotho (+266)\n // ─── Oceania ───────────────────────────────────────────────────────────────\n AU: { mask: 'XXXX XXX XXX', regex: /^4\\d{8}$/, min: 9, max: 9 }, // Australia (+61)\n PG: { mask: 'XXX XXX XXX', regex: /^[78]\\d{7}$/, min: 8, max: 8 }, // Papua New Guinea (+675)\n SB: { mask: 'XXXXX', regex: /^[7-9]\\d{4}$/, min: 5, max: 5 }, // Solomon Islands (+677)\n VU: { mask: 'XXX XXXX', regex: /^[57]\\d{6}$/, min: 7, max: 7 }, // Vanuatu (+678)\n FJ: { mask: 'XXX XXXX', regex: /^[79]\\d{6}$/, min: 7, max: 7 }, // Fiji (+679)\n NC: { mask: 'XX XX XX', regex: /^[67]\\d{5}$/, min: 6, max: 6 }, // New Caledonia (+687)\n PF: { mask: 'XX XX XX', regex: /^[67]\\d{5}$/, min: 6, max: 6 }, // French Polynesia (+689)\n NZ: { mask: 'XX XXX XXXX', regex: /^[27]\\d{7,8}$/, min: 8, max: 9 }, // New Zealand (+64)\n WS: { mask: 'XX XXXXX', regex: /^[67]\\d{5,6}$/, min: 6, max: 7 }, // Samoa (+685)\n TO: { mask: 'XXXXX', regex: /^[57]\\d{4}$/, min: 5, max: 5 }, // Tonga (+676)\n KI: { mask: 'XXXXX', regex: /^[3-9]\\d{4}$/, min: 5, max: 5 }, // Kiribati (+686)\n NR: { mask: 'XXX XXXX', regex: /^[45]\\d{6}$/, min: 7, max: 7 }, // Nauru (+674)\n PW: { mask: 'XXX XXXX', regex: /^[67]\\d{6}$/, min: 7, max: 7 }, // Palau (+680)\n FM: { mask: 'XXX XXXX', regex: /^[39]\\d{6}$/, min: 7, max: 7 }, // Micronesia (+691)\n MH: { mask: 'XXX XXXX', regex: /^[25]\\d{6}$/, min: 7, max: 7 }, // Marshall Islands (+692)\n TV: { mask: 'XXXXX', regex: /^[289]\\d{4}$/, min: 5, max: 5 }, // Tuvalu (+688)\n};\n\n/**\n * Get the phone rule for a country code.\n * Falls back to defaultRule if no specific rule exists.\n */\nexport const getPhoneRule = (countryCode: string): PhoneRule =>\n phoneRules[countryCode.toUpperCase()] ?? defaultRule;\n","import { getPhoneRule } from '../data/phoneRules';\n\nexport interface ValidationResult {\n isValid: boolean;\n error: string | null;\n}\n\n/**\n * Validate a national phone number (raw digits, no country code) against\n * the country-specific rules (regex + min/max length).\n *\n * @param rawDigits - digits only, no spaces or dashes\n * @param countryCode - ISO 3166-1 alpha-2 (e.g. \"IN\")\n */\nexport const validatePhone = (rawDigits: string, countryCode: string): ValidationResult => {\n if (!rawDigits || rawDigits.length === 0) {\n return { isValid: false, error: null }; // empty — no error shown yet\n }\n\n const rule = getPhoneRule(countryCode);\n\n if (rawDigits.length < rule.min) {\n return {\n isValid: false,\n error: `Number too short — needs at least ${rule.min} digits`,\n };\n }\n\n if (rawDigits.length > rule.max) {\n return {\n isValid: false,\n error: `Number too long — maximum ${rule.max} digits`,\n };\n }\n\n if (!rule.regex.test(rawDigits)) {\n return {\n isValid: false,\n error: 'Invalid phone number format for this country',\n };\n }\n\n return { isValid: true, error: null };\n};\n","import { countries } from '../data/countries';\nimport { stripNonDigits } from './formatter';\nimport type { Country, ParsedPhone } from '../types';\n\n// Pre-compute sorted countries array and stripped dial codes\n// This avoids O(N log N) sorting and regex stripping on every parse invocation.\nconst sortedCountries = [...countries]\n .map(country => ({\n country,\n dialDigits: stripNonDigits(country.dialCode)\n }))\n .sort((a, b) => b.dialDigits.length - a.dialDigits.length);\n\n/**\n * Parse a pasted international phone number into country + national number.\n *\n * Handles inputs like:\n * \"+919876543210\"\n * \"+1 (987) 654-3210\"\n * \"00919876543210\"\n *\n * Strategy: try to match the longest dial code first to avoid ambiguity\n * (e.g. +1868 for Trinidad before +1 for US).\n */\nexport const parseInternationalNumber = (input: string): ParsedPhone => {\n const cleaned = input.trim();\n\n // Normalize: remove leading 00 or + to get raw digits\n let normalized = cleaned;\n if (normalized.startsWith('+')) {\n normalized = normalized.slice(1);\n } else if (normalized.startsWith('00')) {\n normalized = normalized.slice(2);\n } else {\n // Not an international format — return as-is, no country detected\n return { country: null, nationalNumber: stripNonDigits(cleaned) };\n }\n\n const digits = stripNonDigits(normalized);\n\n for (const { country, dialDigits } of sortedCountries) {\n if (digits.startsWith(dialDigits)) {\n const nationalNumber = digits.slice(dialDigits.length);\n return { country, nationalNumber };\n }\n }\n\n // Could not match any country code\n return { country: null, nationalNumber: digits };\n};\n\n/**\n * Build the full international number string from a country and national number.\n * @example buildFullNumber({ dialCode: \"+91\" }, \"9876543210\") → \"+919876543210\"\n */\nexport const buildFullNumber = (country: Country, rawDigits: string): string => {\n if (!rawDigits) return '';\n return `${country.dialCode}${rawDigits}`;\n};\n","import { useCallback, useEffect, useMemo, useState, useRef } from 'react';\nimport type { Country, UsePhoneInputOptions, UsePhoneInputReturn } from '../types';\nimport { useAutoDetect } from './useAutoDetect';\nimport { applyMask, stripNonDigits, truncateToMask } from '../utils/formatter';\nimport { validatePhone } from '../utils/validator';\nimport { buildFullNumber, parseInternationalNumber } from '../utils/parser';\nimport { getPhoneRule } from '../data/phoneRules';\n\n/**\n * Core headless hook for phone number input.\n *\n * Manages all state: selected country, national number input,\n * formatting, and validation. Export this so consumers can build\n * custom UI on top of the logic.\n *\n * @example\n * const { country, setCountry, nationalNumber, setNationalNumber, isValid } =\n * usePhoneInput({ defaultCountry: 'auto' });\n */\nexport const usePhoneInput = (options: UsePhoneInputOptions = {}): UsePhoneInputReturn => {\n const { defaultCountry = 'auto', initialValue = '' } = options;\n\n const detectedCountry = useAutoDetect(defaultCountry);\n const [country, setCountryState] = useState<Country>(detectedCountry);\n const [rawDigits, setRawDigits] = useState<string>('');\n\n // Sync auto-detected country on mount (handles SSR cases)\n useEffect(() => {\n setCountryState(detectedCountry);\n }, [detectedCountry]);\n\n // Sync with external value prop changes.\n // Uses a ref to track the last value we produced, so we only re-parse\n // when the parent provides a genuinely new value (avoids feedback loops).\n const lastEmittedValue = useRef<string>('');\n useEffect(() => {\n if (initialValue && initialValue !== lastEmittedValue.current) {\n const parsed = parseInternationalNumber(initialValue);\n if (parsed.country) setCountryState(parsed.country);\n setRawDigits(parsed.nationalNumber);\n lastEmittedValue.current = initialValue;\n }\n }, [initialValue]);\n\n const setCountry = useCallback((c: Country) => {\n setCountryState(c);\n // Preserve the number when switching countries, but truncate it \n // just in case the new country's max length is shorter.\n setRawDigits((prev) => {\n const rule = getPhoneRule(c.code);\n return truncateToMask(prev, rule.mask);\n });\n }, []);\n\n const setNationalNumber = useCallback(\n (input: string) => {\n // 1. Handle Copy-Pasting International Numbers:\n // If the user pastes a number that starts with '+' or '00',\n // we intercept it, parse the country code, automatically switch\n // the dropdown to that country, and extract just the national part.\n if (input.startsWith('+') || input.startsWith('00')) {\n const parsed = parseInternationalNumber(input);\n if (parsed.country) {\n setCountryState(parsed.country);\n const rule = getPhoneRule(parsed.country.code);\n setRawDigits(truncateToMask(parsed.nationalNumber, rule.mask));\n return;\n }\n }\n\n // 2. Handle Normal Typing:\n // Strip out all non-digits (like letters or punctuation)\n // and prevent the user from typing past the maximum mask length\n // for the currently selected country.\n const rule = getPhoneRule(country.code);\n const digits = truncateToMask(stripNonDigits(input), rule.mask);\n setRawDigits(digits);\n },\n [country],\n );\n\n const reset = useCallback(() => {\n setCountryState(detectedCountry);\n setRawDigits('');\n }, [detectedCountry]);\n\n // Derived state (memoized to avoid re-computation on unrelated re-renders)\n const { formatted, fullNumber, isValid, error } = useMemo(() => {\n const rule = getPhoneRule(country.code);\n return {\n formatted: applyMask(rawDigits, rule.mask),\n fullNumber: buildFullNumber(country, rawDigits),\n ...validatePhone(rawDigits, country.code),\n };\n }, [country, rawDigits]);\n\n // Keep the emitted value ref in sync to prevent feedback loops\n useEffect(() => {\n lastEmittedValue.current = fullNumber;\n }, [fullNumber]);\n\n return {\n country,\n setCountry,\n nationalNumber: rawDigits,\n setNationalNumber,\n fullNumber,\n formatted,\n isValid,\n error,\n reset,\n };\n};\n","/**\n * Common aliases, abbreviations, and major cities for countries.\n * Used to power smarter search in the country dropdown.\n * Key = ISO country code, Value = array of search terms.\n */\nexport const countryAliases: Record<string, string[]> = {\n AE: ['uae', 'dubai', 'abu dhabi', 'emirates', 'sharjah'],\n US: ['usa', 'america', 'united states of america', 'new york', 'los angeles'],\n GB: ['uk', 'england', 'britain', 'great britain', 'london', 'scotland', 'wales'],\n RU: ['russia'],\n KR: ['korea', 'south korea', 'seoul'],\n KP: ['north korea'],\n TW: ['taiwan', 'formosa'],\n VN: ['vietnam'],\n IR: ['iran', 'persia'],\n SY: ['syria'],\n BO: ['bolivia'],\n CN: ['china', 'prc', 'beijing', 'shanghai'],\n IN: ['india', 'bharat', 'mumbai', 'delhi', 'bangalore'],\n CD: ['congo', 'drc', 'zaire'],\n CG: ['congo brazzaville'],\n KH: ['cambodia', 'khmer'],\n MM: ['myanmar', 'burma'],\n LA: ['laos'],\n CI: ['ivory coast', 'cote divoire'],\n CV: ['cape verde'],\n TL: ['east timor', 'timor leste'],\n PS: ['palestine', 'gaza', 'west bank'],\n SS: ['south sudan'],\n XK: ['kosovo'],\n CZ: ['czech', 'czechia'],\n SK: ['slovakia'],\n BA: ['bosnia'],\n ME: ['montenegro'],\n RS: ['serbia'],\n MK: ['north macedonia', 'macedonia'],\n SZ: ['eswatini', 'swaziland'],\n TR: ['turkey', 'turkiye', 'istanbul'],\n MX: ['mexico', 'ciudad de mexico'],\n BR: ['brazil', 'brasil', 'sao paulo', 'rio'],\n AR: ['argentina', 'buenos aires'],\n ZA: ['south africa', 'johannesburg', 'cape town'],\n NG: ['nigeria', 'lagos'],\n EG: ['egypt', 'cairo'],\n SA: ['saudi', 'saudi arabia', 'riyadh', 'jeddah', 'ksa'],\n PK: ['pakistan', 'karachi', 'lahore', 'islamabad'],\n BD: ['bangladesh', 'dhaka'],\n LK: ['sri lanka', 'ceylon'],\n MY: ['malaysia', 'kuala lumpur', 'kl'],\n SG: ['singapore'],\n ID: ['indonesia', 'jakarta', 'bali'],\n PH: ['philippines', 'manila'],\n JP: ['japan', 'tokyo'],\n AU: ['australia', 'sydney', 'melbourne'],\n NZ: ['new zealand', 'auckland'],\n CA: ['canada', 'toronto', 'vancouver'],\n DE: ['germany', 'deutschland', 'berlin'],\n FR: ['france', 'paris'],\n IT: ['italy', 'italia', 'rome', 'milan'],\n ES: ['spain', 'espana', 'madrid', 'barcelona'],\n PT: ['portugal', 'lisbon'],\n NL: ['netherlands', 'holland', 'amsterdam'],\n BE: ['belgium', 'brussels'],\n CH: ['switzerland', 'swiss', 'zurich'],\n AT: ['austria', 'vienna'],\n SE: ['sweden', 'stockholm'],\n NO: ['norway', 'oslo'],\n DK: ['denmark', 'copenhagen'],\n FI: ['finland', 'helsinki'],\n PL: ['poland', 'warsaw'],\n UA: ['ukraine', 'kyiv'],\n QA: ['qatar', 'doha'],\n KW: ['kuwait'],\n BH: ['bahrain'],\n OM: ['oman', 'muscat'],\n JO: ['jordan', 'amman'],\n LB: ['lebanon', 'beirut'],\n IL: ['israel', 'tel aviv'],\n IQ: ['iraq', 'baghdad'],\n AF: ['afghanistan', 'kabul'],\n KZ: ['kazakhstan'],\n UZ: ['uzbekistan'],\n GH: ['ghana', 'accra'],\n KE: ['kenya', 'nairobi'],\n ET: ['ethiopia', 'addis ababa'],\n TZ: ['tanzania', 'dar es salaam'],\n UG: ['uganda', 'kampala'],\n RW: ['rwanda', 'kigali'],\n MA: ['morocco', 'marrakech', 'casablanca'],\n DZ: ['algeria', 'algiers'],\n TN: ['tunisia', 'tunis'],\n LY: ['libya', 'tripoli'],\n SD: ['sudan', 'khartoum'],\n CM: ['cameroon'],\n SN: ['senegal', 'dakar'],\n MG: ['madagascar'],\n MZ: ['mozambique', 'maputo'],\n ZM: ['zambia', 'lusaka'],\n ZW: ['zimbabwe', 'harare'],\n PE: ['peru', 'lima'],\n CO: ['colombia', 'bogota'],\n VE: ['venezuela', 'caracas'],\n CL: ['chile', 'santiago'],\n EC: ['ecuador', 'quito'],\n GR: ['greece', 'athens'],\n HU: ['hungary', 'budapest'],\n RO: ['romania', 'bucharest'],\n BG: ['bulgaria', 'sofia'],\n HR: ['croatia', 'zagreb'],\n IE: ['ireland', 'dublin'],\n IS: ['iceland', 'reykjavik'],\n};\n","import { useCallback, useMemo, useState } from 'react';\nimport { countries } from '../data/countries';\nimport { countryAliases } from '../data/countryAliases';\nimport type { Country } from '../types';\n\n/**\n * Hook to filter the countries list by a search query.\n * Matches against:\n * - Country name (\"United Arab Emirates\")\n * - ISO code (\"AE\")\n * - Dial code (\"+971\")\n * - Aliases (\"uae\", \"dubai\", \"emirates\")\n */\nexport const useCountrySearch = () => {\n const [query, setQuery] = useState('');\n\n const filtered = useMemo<Country[]>(() => {\n const q = query.trim().toLowerCase();\n if (!q) return countries;\n\n return countries.filter((c) => {\n // Match official name\n if (c.name.toLowerCase().includes(q)) return true;\n // Match ISO code (e.g. \"ae\", \"us\")\n if (c.code.toLowerCase().includes(q)) return true;\n // Match dial code (e.g. \"+971\", \"971\")\n if (c.dialCode.includes(q)) return true;\n // Match aliases (e.g. \"uae\", \"dubai\", \"emirates\")\n const aliases = countryAliases[c.code];\n if (aliases?.some((alias) => alias.includes(q))) return true;\n\n return false;\n });\n }, [query]);\n\n const clearSearch = useCallback(() => setQuery(''), []);\n\n return { query, setQuery, filtered, clearSearch };\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { Country } from '../../types';\nimport { useCountrySearch } from '../../hooks/useCountrySearch';\n\ninterface CountryDropdownProps {\n selected: Country;\n onChange: (country: Country) => void;\n disabled?: boolean;\n}\n\n/**\n * Searchable country selector dropdown.\n * Shows flag emoji + country name + dial code.\n * Closes on outside click, Escape key, or selection.\n * Supports arrow-key navigation for accessibility.\n */\nexport const CountryDropdown: React.FC<CountryDropdownProps> = ({\n selected,\n onChange,\n disabled = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const { query, setQuery, filtered, clearSearch } = useCountrySearch();\n const containerRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n const closeDropdown = React.useCallback(() => {\n setIsOpen(false);\n setFocusedIndex(-1);\n clearSearch();\n }, [clearSearch]);\n\n // Reset focused index when the filtered list changes (user types in search)\n useEffect(() => {\n setFocusedIndex(-1);\n }, [filtered]);\n\n const scrollItemIntoView = React.useCallback((index: number) => {\n if (!listRef.current) return;\n const items = listRef.current.querySelectorAll('[role=\"option\"]');\n const item = items[index] as HTMLElement;\n item?.scrollIntoView({ block: 'nearest' });\n }, []);\n\n const handleSelect = React.useCallback((country: Country) => {\n onChange(country);\n closeDropdown();\n }, [onChange, closeDropdown]);\n\n // ─── Consolidated event listeners for UX & Accessibility ───────────────────\n useEffect(() => {\n if (!isOpen) return;\n\n // Auto-focus the search input when the dropdown opens\n const focusTimer = setTimeout(() => searchRef.current?.focus(), 50);\n\n // Close on outside click\n const handleOutsideClick = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n closeDropdown();\n }\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n closeDropdown();\n break;\n case 'ArrowDown':\n e.preventDefault();\n setFocusedIndex((prev) => {\n const next = prev < filtered.length - 1 ? prev + 1 : 0;\n scrollItemIntoView(next);\n return next;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((prev) => {\n const next = prev > 0 ? prev - 1 : filtered.length - 1;\n scrollItemIntoView(next);\n return next;\n });\n break;\n case 'Home':\n e.preventDefault();\n setFocusedIndex(0);\n scrollItemIntoView(0);\n break;\n case 'End':\n e.preventDefault();\n setFocusedIndex(filtered.length - 1);\n scrollItemIntoView(filtered.length - 1);\n break;\n case 'Enter':\n if (focusedIndex >= 0 && focusedIndex < filtered.length) {\n e.preventDefault();\n handleSelect(filtered[focusedIndex]);\n }\n break;\n }\n };\n\n document.addEventListener('mousedown', handleOutsideClick);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n clearTimeout(focusTimer);\n document.removeEventListener('mousedown', handleOutsideClick);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, closeDropdown, filtered, focusedIndex, scrollItemIntoView, handleSelect]);\n\n\n\n const openDropdown = () => {\n if (!disabled) setIsOpen(true);\n };\n\n // Scroll selected item into view when dropdown opens\n useEffect(() => {\n if (isOpen && listRef.current) {\n const selectedEl = listRef.current.querySelector('[aria-selected=\"true\"]');\n selectedEl?.scrollIntoView({ block: 'nearest' });\n }\n }, [isOpen]);\n\n return (\n <div className=\"rpi-dropdown\" ref={containerRef}>\n {/* Trigger button */}\n <button\n type=\"button\"\n className={`rpi-dropdown__trigger ${disabled ? 'rpi-dropdown__trigger--disabled' : ''}`}\n onClick={openDropdown}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-label={`Country: ${selected.name}, dial code ${selected.dialCode}`}\n >\n <span className=\"rpi-dropdown__flag\" aria-hidden=\"true\">\n <img\n src={`https://flagcdn.com/w20/${selected.code.toLowerCase()}.png`}\n srcSet={`https://flagcdn.com/w40/${selected.code.toLowerCase()}.png 2x`}\n width=\"20\"\n alt={selected.code}\n loading=\"lazy\"\n />\n </span>\n <span className=\"rpi-dropdown__dialcode\">{selected.dialCode}</span>\n <span className={`rpi-dropdown__arrow ${isOpen ? 'rpi-dropdown__arrow--open' : ''}`} aria-hidden=\"true\">\n ▾\n </span>\n </button>\n\n {/* Dropdown panel */}\n {isOpen && (\n <div className=\"rpi-dropdown__panel\" role=\"dialog\" aria-label=\"Select country\">\n {/* Search */}\n <div className=\"rpi-dropdown__search-wrap\">\n <span className=\"rpi-dropdown__search-icon\" aria-hidden=\"true\">🔍</span>\n <input\n ref={searchRef}\n type=\"text\"\n className=\"rpi-dropdown__search\"\n placeholder=\"Search country...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n aria-label=\"Search countries\"\n autoComplete=\"off\"\n />\n {query && (\n <button\n type=\"button\"\n className=\"rpi-dropdown__search-clear\"\n onClick={clearSearch}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n </div>\n\n {/* Country list */}\n <ul\n ref={listRef}\n className=\"rpi-dropdown__list\"\n role=\"listbox\"\n aria-label=\"Countries\"\n aria-activedescendant={focusedIndex >= 0 && filtered[focusedIndex] ? `rpi-country-${filtered[focusedIndex].code}` : undefined}\n >\n {filtered.length === 0 ? (\n <li className=\"rpi-dropdown__empty\">No countries found</li>\n ) : (\n filtered.map((country, index) => {\n const isSelected = country.code === selected.code;\n const isFocused = index === focusedIndex;\n return (\n <li\n key={country.code}\n id={`rpi-country-${country.code}`}\n role=\"option\"\n aria-selected={isSelected}\n className={[\n 'rpi-dropdown__item',\n isSelected ? 'rpi-dropdown__item--selected' : '',\n isFocused ? 'rpi-dropdown__item--focused' : '',\n ].filter(Boolean).join(' ')}\n onClick={() => handleSelect(country)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleSelect(country);\n }}\n >\n <span className=\"rpi-dropdown__item-flag\" aria-hidden=\"true\">\n <img\n src={`https://flagcdn.com/w20/${country.code.toLowerCase()}.png`}\n srcSet={`https://flagcdn.com/w40/${country.code.toLowerCase()}.png 2x`}\n width=\"20\"\n alt={country.code}\n loading=\"lazy\"\n />\n </span>\n <span className=\"rpi-dropdown__item-name\">{country.name}</span>\n <span className=\"rpi-dropdown__item-code\">{country.dialCode}</span>\n </li>\n );\n })\n )}\n </ul>\n </div>\n )}\n </div>\n );\n};\n","import { forwardRef } from 'react';\n\ninterface NumberInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n isValid?: boolean;\n hasError?: boolean;\n hasValue?: boolean;\n name?: string;\n id?: string;\n required?: boolean;\n onBlur?: () => void;\n onFocus?: () => void;\n}\n\n/**\n * The number input field portion of PhoneInput.\n * Receives formatted display value but emits raw input for processing.\n */\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value,\n onChange,\n placeholder = 'Phone number',\n disabled = false,\n isValid,\n hasError,\n hasValue,\n name,\n id,\n required,\n onBlur,\n onFocus,\n },\n ref,\n ) => {\n // Dynamic class assignment based on the validation state\n const getStateClass = () => {\n if (!hasValue) return '';\n if (isValid) return 'rpi-input--valid';\n if (hasError) return 'rpi-input--error';\n return '';\n };\n\n return (\n <input\n ref={ref}\n type=\"tel\" // Triggers numeric keypad with phone formatting on mobile devices\n inputMode=\"numeric\"\n className={`rpi-number-input ${getStateClass()}`}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n name={name}\n id={id}\n required={required}\n onBlur={onBlur}\n onFocus={onFocus}\n autoComplete=\"tel-national\"\n aria-label=\"Phone number\"\n />\n );\n },\n);\n\nNumberInput.displayName = 'NumberInput';\n","import React, { useRef, useState } from 'react';\nimport type { PhoneInputProps } from '../../types';\nimport { usePhoneInput } from '../../hooks/usePhoneInput';\nimport { CountryDropdown } from '../CountryDropdown';\nimport { NumberInput } from '../NumberInput';\n\n/**\n * `<PhoneInput />` — The main exported component.\n *\n * Combines a searchable country dropdown (with flag + dial code)\n * and a formatted number input field with real-time country-specific\n * validation. Zero external dependencies.\n *\n * @example\n * ```tsx\n * import { PhoneInput } from 'react-phone-input-pro';\n * import 'react-phone-input-pro/styles';\n *\n * <PhoneInput\n * defaultCountry=\"auto\"\n * onChange={(value, meta) => console.log(value, meta)}\n * />\n * ```\n */\nexport const PhoneInput: React.FC<PhoneInputProps> = ({\n value,\n onChange,\n defaultCountry = 'auto',\n placeholder = 'Phone number',\n disabled = false,\n className = '',\n style,\n name,\n id,\n required,\n error: errorProp,\n onBlur,\n onFocus,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const {\n country,\n setCountry,\n nationalNumber,\n setNationalNumber,\n formatted,\n isValid,\n fullNumber,\n } = usePhoneInput({\n defaultCountry,\n initialValue: value,\n });\n\n const [isTouched, setIsTouched] = useState(false);\n\n // Determine if we should show the red error border.\n // We only show it if the user has touched the field (isTouched),\n // there is an actual error, and the field isn't empty.\n const hasValue = nationalNumber.length > 0;\n const showError = errorProp || (isTouched && !isValid && hasValue);\n\n const isMounted = useRef(false);\n const onChangeRef = useRef(onChange);\n\n // Keep ref synced with latest onChange.\n // This is a crucial library pattern: it prevents infinite loops\n // if the parent component passes an inline arrow function for onChange\n // without wrapping it in a useCallback.\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n const prev = useRef<{ fullNumber: string; country: string; formatted: string } | null>({ fullNumber, country: country.code, formatted });\n\n // Trigger the parent's onChange callback whenever the internal\n // state (country, digits, validity) actually changes.\n React.useEffect(() => {\n if (!isMounted.current) {\n isMounted.current = true;\n return;\n }\n \n // Guard against parent re-renders causing state loops\n if (prev.current && prev.current.fullNumber === fullNumber && prev.current.country === country.code && prev.current.formatted === formatted) {\n return;\n }\n prev.current = { fullNumber, country: country.code, formatted };\n\n if (onChangeRef.current) {\n onChangeRef.current(fullNumber, {\n country: country.code,\n dialCode: country.dialCode,\n nationalNumber: formatted,\n rawNumber: nationalNumber,\n isValid,\n });\n }\n }, [country, fullNumber, formatted, nationalNumber, isValid]);\n\n\n\n const handleCountryChange = (newCountry: typeof country) => {\n setCountry(newCountry);\n // Focus the number input after country selection\n setTimeout(() => inputRef.current?.focus(), 50);\n };\n\n const wrapperClass = [\n 'rpi-wrapper',\n disabled ? 'rpi-wrapper--disabled' : '',\n showError ? 'rpi-wrapper--error' : '',\n hasValue && isValid ? 'rpi-wrapper--valid' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className=\"rpi-root\">\n <div className={wrapperClass} style={style} role=\"group\" aria-label=\"Phone number input\">\n {/* Country Selector */}\n <CountryDropdown\n selected={country}\n onChange={handleCountryChange}\n disabled={disabled}\n />\n\n {/* Divider */}\n <div className=\"rpi-divider\" aria-hidden=\"true\" />\n\n {/* Number Input */}\n <NumberInput\n ref={inputRef}\n value={formatted}\n onChange={setNationalNumber}\n placeholder={placeholder}\n disabled={disabled}\n isValid={isValid}\n hasError={showError}\n hasValue={hasValue}\n // We omit the 'name' attribute here so that standard form submissions\n // don't submit the formatted string, and instead submit the E.164 hidden input below.\n id={id}\n required={required}\n onBlur={() => {\n setIsTouched(true);\n if (onBlur) onBlur();\n }}\n onFocus={() => {\n if (onFocus) onFocus();\n }}\n />\n </div>\n\n\n <input type=\"hidden\" value={fullNumber} name={name} id={id ? `${id}-hidden` : undefined} />\n </div>\n );\n};\n"],"names":["countries","countryMap","c","getCountryByCode","code","getCountriesByDialCode","dialCode","FALLBACK_COUNTRY","detectCountryFromLocale","langs","_a","lang","parts","regionCode","found","useAutoDetect","defaultCountry","country","setCountry","useState","useEffect","applyMask","digits","mask","digitIndex","result","stripNonDigits","value","getMaskCapacity","truncateToMask","defaultRule","phoneRules","getPhoneRule","countryCode","validatePhone","rawDigits","rule","sortedCountries","a","b","parseInternationalNumber","input","cleaned","normalized","dialDigits","nationalNumber","buildFullNumber","usePhoneInput","options","initialValue","detectedCountry","setCountryState","setRawDigits","lastEmittedValue","useRef","parsed","useCallback","prev","setNationalNumber","reset","formatted","fullNumber","isValid","error","useMemo","countryAliases","useCountrySearch","query","setQuery","filtered","q","aliases","alias","clearSearch","CountryDropdown","selected","onChange","disabled","isOpen","setIsOpen","focusedIndex","setFocusedIndex","containerRef","searchRef","listRef","closeDropdown","React","scrollItemIntoView","index","item","handleSelect","focusTimer","handleOutsideClick","e","handleKeyDown","next","openDropdown","selectedEl","jsxs","jsx","isSelected","isFocused","NumberInput","forwardRef","placeholder","hasError","hasValue","name","id","required","onBlur","onFocus","ref","getStateClass","PhoneInput","className","style","errorProp","inputRef","isTouched","setIsTouched","showError","isMounted","onChangeRef","handleCountryChange","newCountry","wrapperClass"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { PhoneInput } from './components/PhoneInput';
2
+ export { usePhoneInput } from './hooks/usePhoneInput';
3
+ export { CountryDropdown } from './components/CountryDropdown';
4
+ export { NumberInput } from './components/NumberInput';
5
+ export { validatePhone } from './utils/validator';
6
+ export { applyMask, stripNonDigits } from './utils/formatter';
7
+ export { parseInternationalNumber, buildFullNumber } from './utils/parser';
8
+ export { countries, getCountryByCode, getCountriesByDialCode } from './data/countries';
9
+ export { phoneRules, getPhoneRule, defaultRule } from './data/phoneRules';
10
+ export type { Country, PhoneRule, PhoneInputProps, PhoneChangeMeta, UsePhoneInputOptions, UsePhoneInputReturn, ParsedPhone, } from './types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG1E,YAAY,EACV,OAAO,EACP,SAAS,EACT,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,0BAA0B,CAAC"}