@input-kit/phone 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -43
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -3
- package/dist/index.d.ts +40 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -11
package/README.md
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
# @input-kit/phone
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Headless React phone input with a complete world country-code dataset, searchable country selection, and `libphonenumber-js` powered formatting and validation.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- **
|
|
8
|
-
- **Headless**
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **Tiny** - Tree-shakeable, minimal dependencies
|
|
14
|
-
- **TypeScript** - Full type safety
|
|
7
|
+
- **245 supported calling regions** derived from `libphonenumber-js` metadata and `world-countries`
|
|
8
|
+
- **Headless hook and component** via `usePhoneInput()` and `PhoneInput`
|
|
9
|
+
- **Searchable country selector** with country name, ISO code, and dial-code matching
|
|
10
|
+
- **Real formatting and validation** powered by `libphonenumber-js`
|
|
11
|
+
- **International detection** for pasted or typed `+` / `00` numbers
|
|
12
|
+
- **TypeScript-first** exports for countries, helpers, hook return values, and component refs
|
|
15
13
|
|
|
16
14
|
## Installation
|
|
17
15
|
|
|
@@ -21,10 +19,29 @@ npm install @input-kit/phone
|
|
|
21
19
|
|
|
22
20
|
## Quick Start
|
|
23
21
|
|
|
22
|
+
### Component
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { PhoneInput } from '@input-kit/phone';
|
|
26
|
+
|
|
27
|
+
function Example() {
|
|
28
|
+
return (
|
|
29
|
+
<PhoneInput
|
|
30
|
+
defaultCountry="US"
|
|
31
|
+
onChange={(phone, country) => {
|
|
32
|
+
console.log(phone, country?.code);
|
|
33
|
+
}}
|
|
34
|
+
/>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Hook
|
|
40
|
+
|
|
24
41
|
```tsx
|
|
25
|
-
import { usePhoneInput
|
|
42
|
+
import { usePhoneInput } from '@input-kit/phone';
|
|
26
43
|
|
|
27
|
-
function
|
|
44
|
+
function Example() {
|
|
28
45
|
const {
|
|
29
46
|
inputProps,
|
|
30
47
|
country,
|
|
@@ -35,7 +52,7 @@ function MyComponent() {
|
|
|
35
52
|
isValid,
|
|
36
53
|
} = usePhoneInput({
|
|
37
54
|
defaultCountry: 'US',
|
|
38
|
-
onChange: (phone,
|
|
55
|
+
onChange: (phone, nextCountry) => console.log(phone, nextCountry?.dialCode),
|
|
39
56
|
});
|
|
40
57
|
|
|
41
58
|
return (
|
|
@@ -43,53 +60,89 @@ function MyComponent() {
|
|
|
43
60
|
<button {...countryButtonProps}>
|
|
44
61
|
{country?.flag} {country?.dialCode}
|
|
45
62
|
</button>
|
|
46
|
-
|
|
63
|
+
|
|
47
64
|
{isOpen && (
|
|
48
65
|
<div>
|
|
49
|
-
{filteredCountries.map(
|
|
50
|
-
<button key={
|
|
51
|
-
{
|
|
66
|
+
{filteredCountries.map((candidate) => (
|
|
67
|
+
<button key={candidate.code} onClick={() => selectCountry(candidate)}>
|
|
68
|
+
{candidate.flag} {candidate.name} {candidate.dialCode}
|
|
52
69
|
</button>
|
|
53
70
|
))}
|
|
54
71
|
</div>
|
|
55
72
|
)}
|
|
56
|
-
|
|
73
|
+
|
|
57
74
|
<input {...inputProps} />
|
|
58
|
-
{!isValid && <span>Invalid phone</span>}
|
|
75
|
+
{!isValid && <span>Invalid phone number</span>}
|
|
59
76
|
</div>
|
|
60
77
|
);
|
|
61
78
|
}
|
|
62
79
|
```
|
|
63
80
|
|
|
64
|
-
##
|
|
81
|
+
## Exports
|
|
82
|
+
|
|
83
|
+
### Components and hooks
|
|
84
|
+
|
|
85
|
+
- `PhoneInput`
|
|
86
|
+
- `usePhoneInput(options)`
|
|
87
|
+
|
|
88
|
+
### Country data
|
|
89
|
+
|
|
90
|
+
- `countries`
|
|
91
|
+
- `getCountryByCode(code)`
|
|
92
|
+
- `getCountryByDialCode(dialCode)`
|
|
93
|
+
- `getCountriesByDialCode(dialCode)`
|
|
94
|
+
- `detectCountryFromPhone(phone)`
|
|
95
|
+
|
|
96
|
+
### Utilities
|
|
65
97
|
|
|
66
|
-
|
|
98
|
+
- `cleanPhone(phone)`
|
|
99
|
+
- `formatPhone(phone, country)`
|
|
100
|
+
- `unformatPhone(formattedPhone)`
|
|
101
|
+
- `validatePhone(phone, country, validator?)`
|
|
102
|
+
- `validatePhoneLength(phone, country)`
|
|
103
|
+
- `addDialCode(phone, country)`
|
|
104
|
+
- `removeDialCode(phone, country)`
|
|
105
|
+
- `filterCountries(countries, query, preferredCountries?)`
|
|
106
|
+
- `getPlaceholder(country)`
|
|
67
107
|
|
|
68
|
-
|
|
108
|
+
## `usePhoneInput(options)`
|
|
69
109
|
|
|
70
110
|
| Option | Type | Default | Description |
|
|
71
|
-
|
|
72
|
-
| `defaultCountry` | `string` | `'US'` | Default country
|
|
73
|
-
| `preferredCountries` | `string[]` | - |
|
|
74
|
-
| `excludeCountries` | `string[]` | - |
|
|
75
|
-
| `onlyCountries` | `string[]` | - |
|
|
76
|
-
| `
|
|
77
|
-
| `
|
|
78
|
-
| `
|
|
79
|
-
| `
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
111
|
+
|------|------|---------|-------------|
|
|
112
|
+
| `defaultCountry` | `string` | `'US'` | Default selected country |
|
|
113
|
+
| `preferredCountries` | `string[]` | - | Countries shown first in search results |
|
|
114
|
+
| `excludeCountries` | `string[]` | - | Countries to exclude |
|
|
115
|
+
| `onlyCountries` | `string[]` | - | Restrict selection to these countries |
|
|
116
|
+
| `autoDetect` | `boolean` | `true` | Detect country from international numbers |
|
|
117
|
+
| `formatOnType` | `boolean` | `true` | Apply live formatting |
|
|
118
|
+
| `includeDialCode` | `boolean` | `false` | Return values with dial code included |
|
|
119
|
+
| `validator` | `(phone, country) => boolean` | - | Custom validation override |
|
|
120
|
+
|
|
121
|
+
Important returned fields:
|
|
122
|
+
|
|
123
|
+
- `phone`
|
|
124
|
+
- `fullPhone`
|
|
125
|
+
- `country`
|
|
126
|
+
- `isValid`
|
|
127
|
+
- `isOpen`
|
|
128
|
+
- `searchQuery`
|
|
129
|
+
- `filteredCountries`
|
|
130
|
+
- `inputProps`
|
|
131
|
+
- `countryButtonProps`
|
|
132
|
+
- `setPhone()`
|
|
133
|
+
- `setCountry()`
|
|
134
|
+
- `selectCountry()`
|
|
135
|
+
- `openDropdown()`
|
|
136
|
+
- `closeDropdown()`
|
|
137
|
+
- `toggleDropdown()`
|
|
138
|
+
- `setSearchQuery()`
|
|
139
|
+
- `clear()`
|
|
140
|
+
|
|
141
|
+
## Notes
|
|
142
|
+
|
|
143
|
+
- Country coverage now comes from current `libphonenumber-js` supported regions instead of a short hand-maintained list.
|
|
144
|
+
- Formatting and validation behavior follows `libphonenumber-js`, similar to libraries like `react-phone-number-input`.
|
|
145
|
+
- The selector keeps a separate country button and number field, which matches the common multi-country pattern used by larger phone-input packages.
|
|
93
146
|
|
|
94
147
|
## License
|
|
95
148
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var react=require('react');var C=[{code:"US",name:"United States",dialCode:"+1",flag:"\u{1F1FA}\u{1F1F8}",format:"(###) ###-####"},{code:"GB",name:"United Kingdom",dialCode:"+44",flag:"\u{1F1EC}\u{1F1E7}",format:"#### ######"},{code:"CA",name:"Canada",dialCode:"+1",flag:"\u{1F1E8}\u{1F1E6}",format:"(###) ###-####"},{code:"AU",name:"Australia",dialCode:"+61",flag:"\u{1F1E6}\u{1F1FA}",format:"#### ### ###"},{code:"DE",name:"Germany",dialCode:"+49",flag:"\u{1F1E9}\u{1F1EA}",format:"#### #######"},{code:"FR",name:"France",dialCode:"+33",flag:"\u{1F1EB}\u{1F1F7}",format:"# ## ## ## ##"},{code:"IT",name:"Italy",dialCode:"+39",flag:"\u{1F1EE}\u{1F1F9}",format:"### ### ####"},{code:"ES",name:"Spain",dialCode:"+34",flag:"\u{1F1EA}\u{1F1F8}",format:"### ### ###"},{code:"JP",name:"Japan",dialCode:"+81",flag:"\u{1F1EF}\u{1F1F5}",format:"## #### ####"},{code:"CN",name:"China",dialCode:"+86",flag:"\u{1F1E8}\u{1F1F3}",format:"### #### ####"},{code:"IN",name:"India",dialCode:"+91",flag:"\u{1F1EE}\u{1F1F3}",format:"##### #####"},{code:"BR",name:"Brazil",dialCode:"+55",flag:"\u{1F1E7}\u{1F1F7}",format:"(##) #####-####"},{code:"MX",name:"Mexico",dialCode:"+52",flag:"\u{1F1F2}\u{1F1FD}",format:"### ### ####"},{code:"RU",name:"Russia",dialCode:"+7",flag:"\u{1F1F7}\u{1F1FA}",format:"(###) ###-##-##"},{code:"KR",name:"South Korea",dialCode:"+82",flag:"\u{1F1F0}\u{1F1F7}",format:"## #### ####"},{code:"NL",name:"Netherlands",dialCode:"+31",flag:"\u{1F1F3}\u{1F1F1}",format:"# ## ## ## ##"},{code:"BE",name:"Belgium",dialCode:"+32",flag:"\u{1F1E7}\u{1F1EA}",format:"### ## ## ##"},{code:"SE",name:"Sweden",dialCode:"+46",flag:"\u{1F1F8}\u{1F1EA}",format:"## ### ## ##"},{code:"CH",name:"Switzerland",dialCode:"+41",flag:"\u{1F1E8}\u{1F1ED}",format:"## ### ## ##"},{code:"AT",name:"Austria",dialCode:"+43",flag:"\u{1F1E6}\u{1F1F9}",format:"### ######"},{code:"PL",name:"Poland",dialCode:"+48",flag:"\u{1F1F5}\u{1F1F1}",format:"### ### ###"},{code:"UA",name:"Ukraine",dialCode:"+380",flag:"\u{1F1FA}\u{1F1E6}",format:"## ### ## ##"},{code:"TR",name:"Turkey",dialCode:"+90",flag:"\u{1F1F9}\u{1F1F7}",format:"(###) ### ## ##"},{code:"SA",name:"Saudi Arabia",dialCode:"+966",flag:"\u{1F1F8}\u{1F1E6}",format:"# ### ####"},{code:"ZA",name:"South Africa",dialCode:"+27",flag:"\u{1F1FF}\u{1F1E6}",format:"## ### ####"},{code:"EG",name:"Egypt",dialCode:"+20",flag:"\u{1F1EA}\u{1F1EC}",format:"### ### ####"},{code:"NG",name:"Nigeria",dialCode:"+234",flag:"\u{1F1F3}\u{1F1EC}",format:"### ### ####"},{code:"KE",name:"Kenya",dialCode:"+254",flag:"\u{1F1F0}\u{1F1EA}",format:"### ######"},{code:"AE",name:"UAE",dialCode:"+971",flag:"\u{1F1E6}\u{1F1EA}",format:"## ### ####"},{code:"IL",name:"Israel",dialCode:"+972",flag:"\u{1F1EE}\u{1F1F1}",format:"## ### ####"},{code:"IR",name:"Iran",dialCode:"+98",flag:"\u{1F1EE}\u{1F1F7}",format:"### ### ####"},{code:"PK",name:"Pakistan",dialCode:"+92",flag:"\u{1F1F5}\u{1F1F0}",format:"### #######"},{code:"BD",name:"Bangladesh",dialCode:"+880",flag:"\u{1F1E7}\u{1F1E9}",format:"#### ######"},{code:"VN",name:"Vietnam",dialCode:"+84",flag:"\u{1F1FB}\u{1F1F3}",format:"## #### ###"},{code:"TH",name:"Thailand",dialCode:"+66",flag:"\u{1F1F9}\u{1F1ED}",format:"## ### ####"},{code:"MY",name:"Malaysia",dialCode:"+60",flag:"\u{1F1F2}\u{1F1FE}",format:"## ### ####"},{code:"PH",name:"Philippines",dialCode:"+63",flag:"\u{1F1F5}\u{1F1ED}",format:"### ### ####"},{code:"SG",name:"Singapore",dialCode:"+65",flag:"\u{1F1F8}\u{1F1EC}",format:"#### ####"},{code:"ID",name:"Indonesia",dialCode:"+62",flag:"\u{1F1EE}\u{1F1E9}",format:"### ### ####"},{code:"NZ",name:"New Zealand",dialCode:"+64",flag:"\u{1F1F3}\u{1F1FF}",format:"## ### ####"},{code:"AR",name:"Argentina",dialCode:"+54",flag:"\u{1F1E6}\u{1F1F7}",format:"## #### ####"},{code:"CL",name:"Chile",dialCode:"+56",flag:"\u{1F1E8}\u{1F1F1}",format:"# #### ####"},{code:"CO",name:"Colombia",dialCode:"+57",flag:"\u{1F1E8}\u{1F1F4}",format:"### ### ####"},{code:"PE",name:"Peru",dialCode:"+51",flag:"\u{1F1F5}\u{1F1EA}",format:"### ### ###"},{code:"VE",name:"Venezuela",dialCode:"+58",flag:"\u{1F1FB}\u{1F1EA}",format:"### ### ####"},{code:"PT",name:"Portugal",dialCode:"+351",flag:"\u{1F1F5}\u{1F1F9}",format:"### ### ###"},{code:"GR",name:"Greece",dialCode:"+30",flag:"\u{1F1EC}\u{1F1F7}",format:"### ### ####"},{code:"DK",name:"Denmark",dialCode:"+45",flag:"\u{1F1E9}\u{1F1F0}",format:"## ## ## ##"},{code:"FI",name:"Finland",dialCode:"+358",flag:"\u{1F1EB}\u{1F1EE}",format:"## ### ## ##"},{code:"NO",name:"Norway",dialCode:"+47",flag:"\u{1F1F3}\u{1F1F4}",format:"### ## ###"},{code:"IE",name:"Ireland",dialCode:"+353",flag:"\u{1F1EE}\u{1F1EA}",format:"## ### ####"},{code:"CZ",name:"Czech Republic",dialCode:"+420",flag:"\u{1F1E8}\u{1F1FF}",format:"### ### ###"},{code:"HU",name:"Hungary",dialCode:"+36",flag:"\u{1F1ED}\u{1F1FA}",format:"## ### ####"},{code:"RO",name:"Romania",dialCode:"+40",flag:"\u{1F1F7}\u{1F1F4}",format:"### ### ###"},{code:"BG",name:"Bulgaria",dialCode:"+359",flag:"\u{1F1E7}\u{1F1EC}",format:"### ### ###"},{code:"HR",name:"Croatia",dialCode:"+385",flag:"\u{1F1ED}\u{1F1F7}",format:"## ### ####"},{code:"RS",name:"Serbia",dialCode:"+381",flag:"\u{1F1F7}\u{1F1F8}",format:"## ### ####"},{code:"SK",name:"Slovakia",dialCode:"+421",flag:"\u{1F1F8}\u{1F1F0}",format:"### ### ###"},{code:"SI",name:"Slovenia",dialCode:"+386",flag:"\u{1F1F8}\u{1F1EE}",format:"## ### ###"},{code:"LT",name:"Lithuania",dialCode:"+370",flag:"\u{1F1F1}\u{1F1F9}",format:"### #####"},{code:"LV",name:"Latvia",dialCode:"+371",flag:"\u{1F1F1}\u{1F1FB}",format:"## ### ###"},{code:"EE",name:"Estonia",dialCode:"+372",flag:"\u{1F1EA}\u{1F1EA}",format:"#### ####"}],ne=new Map(C.map(e=>[e.code,e]));function S(e){return ne.get(e.toUpperCase())}function te(e){return C.find(a=>a.dialCode===e)}function w(e){let a=e.replace(/\D/g,""),n=[...C].sort((o,t)=>t.dialCode.length-o.dialCode.length);for(let o of n){let t=o.dialCode.replace("+","");if(a.startsWith(t))return o}}function g(e){return e.replace(/\D/g,"")}function N(e,a){if(!e||!a?.format)return e;let n=g(e),o=a.format,t="",u=0;for(let f=0;f<o.length&&u<n.length;f++)o[f]==="#"?(t+=n[u],u++):t+=o[f];return t}function R(e){return g(e)}function k(e,a){if(!e||!a)return false;let n=g(e),o={US:{min:10,max:10},CA:{min:10,max:10},GB:{min:10,max:11},AU:{min:9,max:9},DE:{min:10,max:11},FR:{min:9,max:9},IT:{min:9,max:10},ES:{min:9,max:9},JP:{min:10,max:11},CN:{min:11,max:11},IN:{min:10,max:10},BR:{min:11,max:11},MX:{min:10,max:10},RU:{min:10,max:10},KR:{min:9,max:11},NL:{min:9,max:9},BE:{min:9,max:9},SE:{min:9,max:9},CH:{min:9,max:9},AT:{min:9,max:13},PL:{min:9,max:9}},t=a.code?o[a.code]:void 0;return t?n.length>=t.min&&n.length<=t.max:n.length>=7&&n.length<=15}function b(e,a,n){return e?n?n(e,a):k(e,a):false}function p(e,a){if(!a)return e;let n=g(e);return `${a.dialCode}${n}`}function re(e,a){if(!a)return e;let n=g(e),o=a.dialCode.replace("+","");return n.startsWith(o)?n.slice(o.length):n}function F(e,a,n){let o=a.toLowerCase().trim();return o?e.filter(t=>t.name.toLowerCase().includes(o)||t.code.toLowerCase().includes(o)||t.dialCode.includes(o)):n?.length?[...e].sort((t,u)=>{let f=n.indexOf(t.code),s=n.indexOf(u.code);return f!==-1&&s!==-1?f-s:f!==-1?-1:s!==-1?1:t.name.localeCompare(u.name)}):e}function T(e){return e?.format?e.format.replace(/#/g,"0"):"Phone number"}function ie(e={}){let{value:a,defaultValue:n="",onChange:o,onBlur:t,onFocus:u,defaultCountry:f="US",preferredCountries:s,excludeCountries:E,onlyCountries:v,autoDetect:O=true,formatOnType:M=true,includeDialCode:c=false,validator:G}=e,h=a!==void 0,D=react.useMemo(()=>{let r=C;return v?.length&&(r=r.filter(l=>v.includes(l.code))),E?.length&&(r=r.filter(l=>!E.includes(l.code))),r},[v,E]),z=S(f)||D[0],[Z,K]=react.useState(n),[i,A]=react.useState(z),[P,x]=react.useState(false),[U,I]=react.useState(""),d=h?a:Z;react.useEffect(()=>{if(O&&d){let r=w(d);r&&r.code!==i?.code&&A(r);}},[d,O,i?.code]);let J=react.useMemo(()=>M?N(d,i):d,[d,i,M]),Q=react.useMemo(()=>c&&i?p(d,i):d,[d,i,c]),V=react.useMemo(()=>b(d,i,G),[d,i,G]),W=react.useMemo(()=>F(D,U,s),[D,U,s]),L=react.useCallback(r=>{let l=R(r);h||K(l),o?.(c?p(l,i):l,i);},[h,o,i,c]),X=react.useCallback(r=>{let l=S(r);l&&(A(l),o?.(c?p(d,l):d,l));},[d,o,c]),$=react.useCallback(r=>{A(r),x(false),I(""),o?.(c?p(d,r):d,r);},[d,o,c]),H=react.useCallback(()=>{x(r=>!r),P&&I("");},[P]),Y=react.useCallback(()=>{x(true);},[]),j=react.useCallback(()=>{x(false),I("");},[]),q=react.useCallback(()=>{h||K(""),o?.("",i);},[h,o,i]),_=react.useCallback(r=>{let l=r.target.value,ae=R(l);L(ae);},[L]),ee=react.useCallback(()=>{u?.();},[u]),oe=react.useCallback(()=>{t?.();},[t]);return {phone:d,fullPhone:Q,country:i,isValid:V,isOpen:P,searchQuery:U,setPhone:L,setCountry:X,toggleDropdown:H,openDropdown:Y,closeDropdown:j,setSearchQuery:I,clear:q,inputProps:{value:J,onChange:_,onFocus:ee,onBlur:oe,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:T(i),"aria-invalid":!V},countryButtonProps:{onClick:H,"aria-expanded":P,"aria-haspopup":"listbox"},filteredCountries:W,selectCountry:$}}exports.addDialCode=p;exports.cleanPhone=g;exports.countries=C;exports.detectCountryFromPhone=w;exports.filterCountries=F;exports.formatPhone=N;exports.getCountryByCode=S;exports.getCountryByDialCode=te;exports.getPlaceholder=T;exports.removeDialCode=re;exports.unformatPhone=R;exports.usePhoneInput=ie;exports.validatePhone=b;exports.validatePhoneLength=k;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var react=require('react'),libphonenumberJs=require('libphonenumber-js'),ke=require('libphonenumber-js/mobile/examples'),Me=require('world-countries'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ke__default=/*#__PURE__*/_interopDefault(ke);var Me__default=/*#__PURE__*/_interopDefault(Me);var Te=["US","GB","CA","AU","DE","FR","IT","ES","JP","CN","IN","BR","MX","KR","NL","CH","SE","AE","SG","ZA","NG","SA","TR","ID","PH","TH","VN","MY","NZ","AR"],We=new Set(libphonenumberJs.getCountries());function $e(e,n){let t=e.startsWith("+")?e:`+${e}`,o=n.replace(/\D/g,"");return `${t}${o}`}function Ue(e){let n=e.idd?.root;if(!n)return [];let o=(e.idd?.suffixes?.length?e.idd.suffixes:[""]).map(a=>$e(n,a)).filter(a=>/^\+\d+$/.test(a));return Array.from(new Set(o))}function He(e){let n=libphonenumberJs.getExampleNumber(e,ke__default.default);return n?n.formatNational().replace(/\d/g,"#"):void 0}function Ie(e){let n=Te.indexOf(e);return n===-1?Number.MAX_SAFE_INTEGER:n}var _e=Me__default.default.filter(e=>We.has(e.cca2)).map(e=>{let n=e.cca2,t=Ue(e),o=`+${libphonenumberJs.getCountryCallingCode(n)}`;return !e.flag||t.length===0?null:{code:n,name:e.name.common,dialCode:o,dialCodes:t,flag:e.flag,format:He(n)}}).filter(e=>e!==null).sort((e,n)=>{let t=Ie(e.code)-Ie(n.code);return t!==0?t:e.name.localeCompare(n.name)}),T=_e,Ve=new Map(T.map(e=>[e.code,e])),Ge=T.reduce((e,n)=>{for(let t of n.dialCodes){let o=e.get(t)??[];o.push(n),e.set(t,o);}return e},new Map),Ke=T.flatMap(e=>e.dialCodes.map(n=>({dialCode:n,country:e}))).sort((e,n)=>n.dialCode.length-e.dialCode.length),Ae=new Map;function je(e){return Array.isArray(e)?[...e]:e?[e]:[]}function Qe(e){let n=je(e);if(n.length===0||typeof Intl>"u"||typeof Intl.DisplayNames>"u")return;let t=n.join("|"),o=Ae.get(t);if(o)return o;try{let a=new Intl.DisplayNames(n,{type:"region"});return Ae.set(t,a),a}catch{return}}function Ye(e){let n=e.replace(/\D/g,"");return n?`+${n}`:""}function K(e){return Ve.get(e.toUpperCase())}function Ne(e,n){return e?Qe(n)?.of(e.code)??e.displayName??e.name:void 0}function j(e,n){if(!e)return;let t=Ne(e,n);return t?{...e,displayName:t}:e}function de(e,n){return n?e.map(t=>j(t,n)??t):e}function xe(e){return Ge.get(Ye(e))??[]}function qe(e){return xe(e)[0]}function pe(e){let n=e.trim();if(!n)return;let t=n.startsWith("+")?`+${n.replace(/\D/g,"")}`:n.startsWith("00")?`+${n.slice(2).replace(/\D/g,"")}`:"";if(!t)return;let o=libphonenumberJs.parsePhoneNumberFromString(t);return o?.country?K(o.country):Ke.find(a=>t.startsWith(a.dialCode))?.country}var fe={selectCountry:"Select country",countrySearchPlaceholder:"Search countries...",noCountriesFound:"No countries found",searchCountriesAriaLabel:"Search countries",countryOptionsAriaLabel:"Country options",countryButtonAriaLabel:"Open country selector"},Xe={en:fe,fr:{selectCountry:"Choisir un pays",countrySearchPlaceholder:"Rechercher un pays...",noCountriesFound:"Aucun pays trouv\xE9",searchCountriesAriaLabel:"Rechercher des pays",countryOptionsAriaLabel:"Options de pays",countryButtonAriaLabel:"Ouvrir le s\xE9lecteur de pays"},de:{selectCountry:"Land ausw\xE4hlen",countrySearchPlaceholder:"Land suchen...",noCountriesFound:"Keine L\xE4nder gefunden",searchCountriesAriaLabel:"L\xE4nder suchen",countryOptionsAriaLabel:"L\xE4nderoptionen",countryButtonAriaLabel:"L\xE4nderauswahl \xF6ffnen"},es:{selectCountry:"Seleccionar pa\xEDs",countrySearchPlaceholder:"Buscar pa\xEDs...",noCountriesFound:"No se encontraron pa\xEDses",searchCountriesAriaLabel:"Buscar pa\xEDses",countryOptionsAriaLabel:"Opciones de pa\xEDs",countryButtonAriaLabel:"Abrir selector de pa\xEDs"},pt:{selectCountry:"Selecionar pa\xEDs",countrySearchPlaceholder:"Pesquisar pa\xEDs...",noCountriesFound:"Nenhum pa\xEDs encontrado",searchCountriesAriaLabel:"Pesquisar pa\xEDses",countryOptionsAriaLabel:"Op\xE7\xF5es de pa\xEDs",countryButtonAriaLabel:"Abrir seletor de pa\xEDs"},it:{selectCountry:"Seleziona paese",countrySearchPlaceholder:"Cerca paese...",noCountriesFound:"Nessun paese trovato",searchCountriesAriaLabel:"Cerca paesi",countryOptionsAriaLabel:"Opzioni paese",countryButtonAriaLabel:"Apri selettore paese"},ja:{selectCountry:"\u56FD\u3092\u9078\u629E",countrySearchPlaceholder:"\u56FD\u3092\u691C\u7D22...",noCountriesFound:"\u56FD\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",searchCountriesAriaLabel:"\u56FD\u3092\u691C\u7D22",countryOptionsAriaLabel:"\u56FD\u306E\u5019\u88DC",countryButtonAriaLabel:"\u56FD\u306E\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u958B\u304F"},ko:{selectCountry:"\uAD6D\uAC00 \uC120\uD0DD",countrySearchPlaceholder:"\uAD6D\uAC00 \uAC80\uC0C9...",noCountriesFound:"\uAD6D\uAC00\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",searchCountriesAriaLabel:"\uAD6D\uAC00 \uAC80\uC0C9",countryOptionsAriaLabel:"\uAD6D\uAC00 \uC635\uC158",countryButtonAriaLabel:"\uAD6D\uAC00 \uC120\uD0DD\uAE30 \uC5F4\uAE30"},zh:{selectCountry:"\u9009\u62E9\u56FD\u5BB6",countrySearchPlaceholder:"\u641C\u7D22\u56FD\u5BB6...",noCountriesFound:"\u672A\u627E\u5230\u56FD\u5BB6",searchCountriesAriaLabel:"\u641C\u7D22\u56FD\u5BB6",countryOptionsAriaLabel:"\u56FD\u5BB6\u9009\u9879",countryButtonAriaLabel:"\u6253\u5F00\u56FD\u5BB6\u9009\u62E9\u5668"},ar:{selectCountry:"\u0627\u062E\u062A\u0631 \u0627\u0644\u062F\u0648\u0644\u0629",countrySearchPlaceholder:"\u0627\u0628\u062D\u062B \u0639\u0646 \u062F\u0648\u0644\u0629...",noCountriesFound:"\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u062F\u0648\u0644",searchCountriesAriaLabel:"\u0627\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u062F\u0648\u0644",countryOptionsAriaLabel:"\u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u062F\u0648\u0644",countryButtonAriaLabel:"\u0627\u0641\u062A\u062D \u0645\u062D\u062F\u062F \u0627\u0644\u062F\u0648\u0644\u0629"},hi:{selectCountry:"\u0926\u0947\u0936 \u091A\u0941\u0928\u0947\u0902",countrySearchPlaceholder:"\u0926\u0947\u0936 \u0916\u094B\u091C\u0947\u0902...",noCountriesFound:"\u0915\u094B\u0908 \u0926\u0947\u0936 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E",searchCountriesAriaLabel:"\u0926\u0947\u0936 \u0916\u094B\u091C\u0947\u0902",countryOptionsAriaLabel:"\u0926\u0947\u0936 \u0935\u093F\u0915\u0932\u094D\u092A",countryButtonAriaLabel:"\u0926\u0947\u0936 \u091A\u092F\u0928 \u0916\u094B\u0932\u0947\u0902"}};function Ze(e){let t=(Array.isArray(e)?e:e?[e]:[]).find(Boolean);return t?t.toLowerCase().split("-")[0]:void 0}function Ce(e,n){let t=Ze(e),o=t?Xe[t]:void 0;return {...fe,...o,...n}}function W(e){let n=e.trim(),t=w(n);return n.startsWith("+")&&!t?"+":t?n.startsWith("+")?`+${t}`:t:""}function ye(e){return e?.code}function w(e){return e.replace(/\D/g,"")}function he(e,n){return e&&new libphonenumberJs.AsYouType(ye(n)).input(W(e))}function ne(e){return W(e)}function nn(e,n){return !e||!n?false:e.trim().startsWith("+")?libphonenumberJs.validatePhoneNumberLength(W(e))===void 0:libphonenumberJs.validatePhoneNumberLength(w(e),ye(n))===void 0}function ge(e,n,t){if(!e)return false;if(t)return t(e,n);let o=W(e),a=ye(n);return a?o.startsWith("+")?libphonenumberJs.isValidPhoneNumber(o):libphonenumberJs.isValidPhoneNumber(w(o),a):libphonenumberJs.isPossiblePhoneNumber(o.startsWith("+")?o:`+${w(o)}`)}function $(e,n){if(!n)return e;let t=W(e);if(!t||t==="+")return "";if(t.startsWith("+"))return t;let o=w(t);return n.dialCodes.find(d=>o.startsWith(d.replace("+","")))?`+${o}`:`${n.dialCode}${o}`}function te(e,n){if(!n)return e;let t=W(e),o=w(t);for(let a of n.dialCodes){let d=a.replace("+","");if(o.startsWith(d))return o.slice(d.length)}return o}function me(e,n,t){let o=n.toLowerCase().trim();return o?e.filter(a=>a.name.toLowerCase().includes(o)||(a.displayName??"").toLowerCase().includes(o)||a.code.toLowerCase().includes(o)||a.dialCodes.some(d=>d.includes(o))):t?.length?[...e].sort((a,d)=>{let P=t.indexOf(a.code),N=t.indexOf(d.code);return P!==-1&&N!==-1?P-N:P!==-1?-1:N!==-1?1:(a.displayName??a.name).localeCompare(d.displayName??d.name)}):e}function be(e){return e?.displayName??e?.name??""}function Pe(e){return e?.format?e.format.replace(/#/g,"0"):e?.dialCode?`${e.dialCode} 000 000 0000`:"Phone number"}function on(e,n){return e.slice(0,n).replace(/\D/g,"").length}function rn(e,n){if(n<=0)return e.startsWith("+")?1:0;let t=0;for(let o=0;o<e.length;o+=1)if(/\d/.test(e[o])&&(t+=1,t===n))return o+1;return e.length}function Le(e={}){let{value:n,defaultValue:t="",onChange:o,onBlur:a,onFocus:d,defaultCountry:P="US",preferredCountries:N,excludeCountries:H,onlyCountries:_,autoDetect:Y=true,formatOnType:q=true,includeDialCode:p=false,validator:O,locale:m,labels:X}=e,v=n!==void 0,Z=react.useRef(null),V=react.useRef(null),y=react.useMemo(()=>{let r=T;return _?.length&&(r=r.filter(i=>_.includes(i.code))),H?.length&&(r=r.filter(i=>!H.includes(i.code))),r},[_,H]),R=react.useMemo(()=>de(y,m),[y,m]),E=react.useMemo(()=>Ce(m,X),[m,X]),B=y.find(r=>r.code===P)||y[0],[L,F]=react.useState(t),[s,z]=react.useState(B),[h,f]=react.useState(false),[k,M]=react.useState(""),u=v?n:L;react.useEffect(()=>{let r=y.find(i=>i.code===P)||y[0];r&&r.code!==s?.code&&z(r);},[P,y,s?.code]),react.useEffect(()=>{if(Y&&u){let r=pe(u);r&&y.some(i=>i.code===r.code)&&r.code!==s?.code&&z(r);}},[y,Y,u,s?.code]);let G=react.useMemo(()=>q?he(p&&u.startsWith("+")?te(u,s):u,s):p&&u.startsWith("+")?te(u,s):u,[q,p,u,s]),re=react.useMemo(()=>p&&s?$(u,s):u,[u,s,p]),S=react.useMemo(()=>ge(u,s,O),[u,s,O]),ie=react.useMemo(()=>j(s,m),[s,m]),ae=react.useMemo(()=>me(R,k,N),[R,k,N]),C=react.useCallback(r=>j(r,m),[m]);react.useLayoutEffect(()=>{let r=V.current,i=Z.current;if(r===null||!i||typeof i.setSelectionRange!="function"||typeof document<"u"&&document.activeElement!==i)return;let ee=rn(G,r);i.setSelectionRange(ee,ee),V.current=null;},[G]);let I=react.useCallback(r=>{let i=ne(r);v||F(i),o?.(p?$(i,s):i,C(s));},[v,o,s,p,C]),x=react.useCallback(r=>{let i=K(r);i&&(z(i),o?.(p?$(u,i):u,C(i)));},[u,o,p,C]),se=react.useCallback(r=>{let i=K(r.code)??r;z(i),f(false),M(""),o?.(p?$(u,i):u,C(i));},[u,o,p,C]),J=react.useCallback(()=>{f(r=>!r),h&&M("");},[h]),ue=react.useCallback(()=>{f(true);},[]),le=react.useCallback(()=>{f(false),M("");},[]),ce=react.useCallback(()=>{v||F(""),o?.("",C(s));},[v,o,s,C]),l=react.useCallback(r=>{let i=r.target.value,ee=r.target.selectionStart??i.length,Oe=i.trim().startsWith("+")?`+${i.replace(/\D/g,"")}`:ne(i);V.current=on(i,ee),I(Oe);},[I]),A=react.useCallback(()=>{d?.();},[d]),b=react.useCallback(()=>{a?.();},[a]);return {phone:u,fullPhone:re,country:ie,isValid:S,isOpen:h,searchQuery:k,labels:E,setPhone:I,setCountry:x,toggleDropdown:J,openDropdown:ue,closeDropdown:le,setSearchQuery:M,clear:ce,inputProps:{ref:Z,value:G,onChange:l,onFocus:A,onBlur:b,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:Pe(s),"aria-invalid":u?!S:void 0},countryButtonProps:{onClick:J,"aria-expanded":h,"aria-haspopup":"listbox","aria-label":E.countryButtonAriaLabel},filteredCountries:ae,selectCountry:se}}var dn=({size:e=12})=>jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("polyline",{points:"18 15 12 9 6 15"})}),pn=({size:e=12})=>jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("polyline",{points:"6 9 12 15 18 9"})}),fn=react.forwardRef(function(n,t){let{value:o,defaultValue:a,onChange:d,onBlur:P,onFocus:N,inputClassName:H,selectorClassName:_,containerClassName:Y,searchable:q=true,placeholder:p,disabled:O,readOnly:m,name:X,id:v,"aria-label":Z,"aria-labelledby":V,...y}=n,R=react.useRef(null),E=react.useRef([]),[B,L]=react.useState(0),F=react.useId(),{inputProps:s,countryButtonProps:z,country:h,filteredCountries:f,isOpen:k,isValid:M,searchQuery:u,setSearchQuery:G,setCountry:re,selectCountry:S,clear:ie,openDropdown:ae,closeDropdown:C,labels:I}=Le({value:o,defaultValue:a,onChange:d,onBlur:P,onFocus:N,...y}),x=s.ref,se=react.useCallback(l=>{R.current=l,typeof x=="function"?x(l):x&&"current"in x&&(x.current=l);},[x]),J=react.useCallback(()=>{R.current?.focus();},[]),ue=react.useCallback(()=>{R.current?.blur();},[]),le=react.useCallback(l=>{S(l),L(0);},[S]),ce=react.useCallback((l,A,b)=>{switch(l.key){case "Enter":case " ":l.preventDefault(),S(A),L(0);break;case "ArrowDown":if(l.preventDefault(),b<f.length-1){let r=b+1;L(r),E.current[r]?.focus();}break;case "ArrowUp":if(l.preventDefault(),b>0){let r=b-1;L(r),E.current[r]?.focus();}break;case "Escape":l.preventDefault(),C();break}},[S,f.length,C]);return react.useEffect(()=>{if(f.length===0){B!==0&&L(0);return}B>=f.length&&L(f.length-1);},[f.length,B]),react.useImperativeHandle(t,()=>({focus:J,blur:ue,clear:ie,setCountry:re,getCountry:()=>h,open:ae,close:C})),jsxRuntime.jsxs("div",{className:Y,"data-valid":M,children:[jsxRuntime.jsxs("button",{...z,type:"button",className:_,disabled:O,tabIndex:O?-1:0,"aria-controls":F,children:[h?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"phone-input-flag",children:h.flag}),jsxRuntime.jsx("span",{className:"phone-input-dial-code",children:h.dialCode})]}):jsxRuntime.jsx("span",{className:"phone-input-placeholder",children:I.selectCountry}),jsxRuntime.jsx("span",{className:"phone-input-arrow","aria-hidden":"true",children:k?jsxRuntime.jsx(dn,{size:12}):jsxRuntime.jsx(pn,{size:12})})]}),jsxRuntime.jsx("input",{...s,ref:se,id:v,name:X,className:H,placeholder:p||s.placeholder,disabled:O,readOnly:m,"aria-label":Z,"aria-labelledby":V}),k&&jsxRuntime.jsxs("div",{className:"phone-input-dropdown",children:[q&&jsxRuntime.jsx("div",{className:"phone-input-search",children:jsxRuntime.jsx("input",{type:"text",value:u,onChange:l=>G(l.target.value),placeholder:I.countrySearchPlaceholder,autoFocus:true,"aria-controls":F,"aria-label":I.searchCountriesAriaLabel})}),jsxRuntime.jsxs("ul",{className:"phone-input-country-list",id:F,role:"listbox","aria-label":I.countryOptionsAriaLabel,children:[f.map((l,A)=>jsxRuntime.jsxs("li",{ref:b=>{E.current[A]=b;},role:"option","aria-selected":l.code===h?.code,className:`phone-input-country-option ${l.code===h?.code?"selected":""} ${A===B?"highlighted":""}`,onClick:()=>le(l),onKeyDown:b=>ce(b,l,A),onMouseEnter:()=>L(A),tabIndex:A===B?0:-1,children:[jsxRuntime.jsx("span",{className:"phone-input-flag",children:l.flag}),jsxRuntime.jsx("span",{className:"phone-input-country-name",children:be(l)}),jsxRuntime.jsx("span",{className:"phone-input-dial-code",children:l.dialCode})]},l.code)),f.length===0&&jsxRuntime.jsx("li",{className:"phone-input-no-results",children:I.noCountriesFound})]})]})]})});exports.DEFAULT_PHONE_INPUT_LABELS=fe;exports.PhoneInput=fn;exports.addDialCode=$;exports.cleanPhone=w;exports.countries=T;exports.detectCountryFromPhone=pe;exports.filterCountries=me;exports.formatPhone=he;exports.getCountriesByDialCode=xe;exports.getCountryByCode=K;exports.getCountryByDialCode=qe;exports.getCountryDisplayName=be;exports.getLocalizedCountryName=Ne;exports.getPlaceholder=Pe;exports.localizeCountries=de;exports.localizeCountry=j;exports.removeDialCode=te;exports.resolvePhoneInputLabels=Ce;exports.unformatPhone=ne;exports.usePhoneInput=Le;exports.validatePhone=ge;exports.validatePhoneLength=nn;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/countries.ts","../src/utils.ts","../src/usePhoneInput.ts"],"names":["countries","countryMap","c","getCountryByCode","code","getCountryByDialCode","dialCode","detectCountryFromPhone","phone","cleaned","sortedCountries","a","b","country","codeWithoutPlus","cleanPhone","formatPhone","format","result","digitIndex","i","unformatPhone","formattedPhone","validatePhoneLength","lengthRules","rule","validatePhone","customValidator","addDialCode","removeDialCode","filterCountries","query","preferredCountries","lowerQuery","aPreferred","bPreferred","getPlaceholder","usePhoneInput","options","controlledValue","defaultValue","onChange","onBlur","onFocus","defaultCountry","excludeCountries","onlyCountries","autoDetect","formatOnType","includeDialCode","validator","isControlled","availableCountries","useMemo","filtered","initialCountry","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","useEffect","detected","fullPhone","isValid","filteredCountries","setPhone","useCallback","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface Country {\r\n code: string;\r\n name: string;\r\n dialCode: string;\r\n flag: string;\r\n format?: string;\r\n}\r\n\r\nexport const countries: Country[] = [\r\n { code: \"US\", name: \"United States\", dialCode: \"+1\", flag: \"🇺🇸\", format: \"(###) ###-####\" },\r\n { code: \"GB\", name: \"United Kingdom\", dialCode: \"+44\", flag: \"🇬🇧\", format: \"#### ######\" },\r\n { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"🇨🇦\", format: \"(###) ###-####\" },\r\n { code: \"AU\", name: \"Australia\", dialCode: \"+61\", flag: \"🇦🇺\", format: \"#### ### ###\" },\r\n { code: \"DE\", name: \"Germany\", dialCode: \"+49\", flag: \"🇩🇪\", format: \"#### #######\" },\r\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\", format: \"# ## ## ## ##\" },\r\n { code: \"IT\", name: \"Italy\", dialCode: \"+39\", flag: \"🇮🇹\", format: \"### ### ####\" },\r\n { code: \"ES\", name: \"Spain\", dialCode: \"+34\", flag: \"🇪🇸\", format: \"### ### ###\" },\r\n { code: \"JP\", name: \"Japan\", dialCode: \"+81\", flag: \"🇯🇵\", format: \"## #### ####\" },\r\n { code: \"CN\", name: \"China\", dialCode: \"+86\", flag: \"🇨🇳\", format: \"### #### ####\" },\r\n { code: \"IN\", name: \"India\", dialCode: \"+91\", flag: \"🇮🇳\", format: \"##### #####\" },\r\n { code: \"BR\", name: \"Brazil\", dialCode: \"+55\", flag: \"🇧🇷\", format: \"(##) #####-####\" },\r\n { code: \"MX\", name: \"Mexico\", dialCode: \"+52\", flag: \"🇲🇽\", format: \"### ### ####\" },\r\n { code: \"RU\", name: \"Russia\", dialCode: \"+7\", flag: \"🇷🇺\", format: \"(###) ###-##-##\" },\r\n { code: \"KR\", name: \"South Korea\", dialCode: \"+82\", flag: \"🇰🇷\", format: \"## #### ####\" },\r\n { code: \"NL\", name: \"Netherlands\", dialCode: \"+31\", flag: \"🇳🇱\", format: \"# ## ## ## ##\" },\r\n { code: \"BE\", name: \"Belgium\", dialCode: \"+32\", flag: \"🇧🇪\", format: \"### ## ## ##\" },\r\n { code: \"SE\", name: \"Sweden\", dialCode: \"+46\", flag: \"🇸🇪\", format: \"## ### ## ##\" },\r\n { code: \"CH\", name: \"Switzerland\", dialCode: \"+41\", flag: \"🇨🇭\", format: \"## ### ## ##\" },\r\n { code: \"AT\", name: \"Austria\", dialCode: \"+43\", flag: \"🇦🇹\", format: \"### ######\" },\r\n { code: \"PL\", name: \"Poland\", dialCode: \"+48\", flag: \"🇵🇱\", format: \"### ### ###\" },\r\n { code: \"UA\", name: \"Ukraine\", dialCode: \"+380\", flag: \"🇺🇦\", format: \"## ### ## ##\" },\r\n { code: \"TR\", name: \"Turkey\", dialCode: \"+90\", flag: \"🇹🇷\", format: \"(###) ### ## ##\" },\r\n { code: \"SA\", name: \"Saudi Arabia\", dialCode: \"+966\", flag: \"🇸🇦\", format: \"# ### ####\" },\r\n { code: \"ZA\", name: \"South Africa\", dialCode: \"+27\", flag: \"🇿🇦\", format: \"## ### ####\" },\r\n { code: \"EG\", name: \"Egypt\", dialCode: \"+20\", flag: \"🇪🇬\", format: \"### ### ####\" },\r\n { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"🇳🇬\", format: \"### ### ####\" },\r\n { code: \"KE\", name: \"Kenya\", dialCode: \"+254\", flag: \"🇰🇪\", format: \"### ######\" },\r\n { code: \"AE\", name: \"UAE\", dialCode: \"+971\", flag: \"🇦🇪\", format: \"## ### ####\" },\r\n { code: \"IL\", name: \"Israel\", dialCode: \"+972\", flag: \"🇮🇱\", format: \"## ### ####\" },\r\n { code: \"IR\", name: \"Iran\", dialCode: \"+98\", flag: \"🇮🇷\", format: \"### ### ####\" },\r\n { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"🇵🇰\", format: \"### #######\" },\r\n { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"🇧🇩\", format: \"#### ######\" },\r\n { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"🇻🇳\", format: \"## #### ###\" },\r\n { code: \"TH\", name: \"Thailand\", dialCode: \"+66\", flag: \"🇹🇭\", format: \"## ### ####\" },\r\n { code: \"MY\", name: \"Malaysia\", dialCode: \"+60\", flag: \"🇲🇾\", format: \"## ### ####\" },\r\n { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"🇵🇭\", format: \"### ### ####\" },\r\n { code: \"SG\", name: \"Singapore\", dialCode: \"+65\", flag: \"🇸🇬\", format: \"#### ####\" },\r\n { code: \"ID\", name: \"Indonesia\", dialCode: \"+62\", flag: \"🇮🇩\", format: \"### ### ####\" },\r\n { code: \"NZ\", name: \"New Zealand\", dialCode: \"+64\", flag: \"🇳🇿\", format: \"## ### ####\" },\r\n { code: \"AR\", name: \"Argentina\", dialCode: \"+54\", flag: \"🇦🇷\", format: \"## #### ####\" },\r\n { code: \"CL\", name: \"Chile\", dialCode: \"+56\", flag: \"🇨🇱\", format: \"# #### ####\" },\r\n { code: \"CO\", name: \"Colombia\", dialCode: \"+57\", flag: \"🇨🇴\", format: \"### ### ####\" },\r\n { code: \"PE\", name: \"Peru\", dialCode: \"+51\", flag: \"🇵🇪\", format: \"### ### ###\" },\r\n { code: \"VE\", name: \"Venezuela\", dialCode: \"+58\", flag: \"🇻🇪\", format: \"### ### ####\" },\r\n { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"🇵🇹\", format: \"### ### ###\" },\r\n { code: \"GR\", name: \"Greece\", dialCode: \"+30\", flag: \"🇬🇷\", format: \"### ### ####\" },\r\n { code: \"DK\", name: \"Denmark\", dialCode: \"+45\", flag: \"🇩🇰\", format: \"## ## ## ##\" },\r\n { code: \"FI\", name: \"Finland\", dialCode: \"+358\", flag: \"🇫🇮\", format: \"## ### ## ##\" },\r\n { code: \"NO\", name: \"Norway\", dialCode: \"+47\", flag: \"🇳🇴\", format: \"### ## ###\" },\r\n { code: \"IE\", name: \"Ireland\", dialCode: \"+353\", flag: \"🇮🇪\", format: \"## ### ####\" },\r\n { code: \"CZ\", name: \"Czech Republic\", dialCode: \"+420\", flag: \"🇨🇿\", format: \"### ### ###\" },\r\n { code: \"HU\", name: \"Hungary\", dialCode: \"+36\", flag: \"🇭🇺\", format: \"## ### ####\" },\r\n { code: \"RO\", name: \"Romania\", dialCode: \"+40\", flag: \"🇷🇴\", format: \"### ### ###\" },\r\n { code: \"BG\", name: \"Bulgaria\", dialCode: \"+359\", flag: \"🇧🇬\", format: \"### ### ###\" },\r\n { code: \"HR\", name: \"Croatia\", dialCode: \"+385\", flag: \"🇭🇷\", format: \"## ### ####\" },\r\n { code: \"RS\", name: \"Serbia\", dialCode: \"+381\", flag: \"🇷🇸\", format: \"## ### ####\" },\r\n { code: \"SK\", name: \"Slovakia\", dialCode: \"+421\", flag: \"🇸🇰\", format: \"### ### ###\" },\r\n { code: \"SI\", name: \"Slovenia\", dialCode: \"+386\", flag: \"🇸🇮\", format: \"## ### ###\" },\r\n { code: \"LT\", name: \"Lithuania\", dialCode: \"+370\", flag: \"🇱🇹\", format: \"### #####\" },\r\n { code: \"LV\", name: \"Latvia\", dialCode: \"+371\", flag: \"🇱🇻\", format: \"## ### ###\" },\r\n { code: \"EE\", name: \"Estonia\", dialCode: \"+372\", flag: \"🇪🇪\", format: \"#### ####\" },\r\n];\r\n\r\nexport const countryMap = new Map(countries.map(c => [c.code, c]));\r\n\r\nexport function getCountryByCode(code: string): Country | undefined {\r\n return countryMap.get(code.toUpperCase());\r\n}\r\n\r\nexport function getCountryByDialCode(dialCode: string): Country | undefined {\r\n return countries.find(c => c.dialCode === dialCode);\r\n}\r\n\r\nexport function detectCountryFromPhone(phone: string): Country | undefined {\r\n const cleaned = phone.replace(/\\D/g, '');\r\n \r\n // Try longer dial codes first\r\n const sortedCountries = [...countries].sort((a, b) => \r\n b.dialCode.length - a.dialCode.length\r\n );\r\n \r\n for (const country of sortedCountries) {\r\n const codeWithoutPlus = country.dialCode.replace('+', '');\r\n if (cleaned.startsWith(codeWithoutPlus)) {\r\n return country;\r\n }\r\n }\r\n \r\n return undefined;\r\n}\r\n","import type { Country } from './countries';\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: Country | undefined): string {\r\n if (!phone || !country?.format) return phone;\r\n \r\n const cleaned = cleanPhone(phone);\r\n const format = country.format;\r\n \r\n let result = '';\r\n let digitIndex = 0;\r\n \r\n for (let i = 0; i < format.length && digitIndex < cleaned.length; i++) {\r\n if (format[i] === '#') {\r\n result += cleaned[digitIndex];\r\n digitIndex++;\r\n } else {\r\n result += format[i];\r\n }\r\n }\r\n \r\n return result;\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 cleanPhone(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: Country | undefined): boolean {\r\n if (!phone || !country) return false;\r\n \r\n const cleaned = cleanPhone(phone);\r\n \r\n // Country-specific validation\r\n const lengthRules: Record<string, { min: number; max: number }> = {\r\n US: { min: 10, max: 10 },\r\n CA: { min: 10, max: 10 },\r\n GB: { min: 10, max: 11 },\r\n AU: { min: 9, max: 9 },\r\n DE: { min: 10, max: 11 },\r\n FR: { min: 9, max: 9 },\r\n IT: { min: 9, max: 10 },\r\n ES: { min: 9, max: 9 },\r\n JP: { min: 10, max: 11 },\r\n CN: { min: 11, max: 11 },\r\n IN: { min: 10, max: 10 },\r\n BR: { min: 11, max: 11 },\r\n MX: { min: 10, max: 10 },\r\n RU: { min: 10, max: 10 },\r\n KR: { min: 9, max: 11 },\r\n NL: { min: 9, max: 9 },\r\n BE: { min: 9, max: 9 },\r\n SE: { min: 9, max: 9 },\r\n CH: { min: 9, max: 9 },\r\n AT: { min: 9, max: 13 },\r\n PL: { min: 9, max: 9 },\r\n };\r\n \r\n const rule = country.code ? lengthRules[country.code] : undefined;\r\n \r\n if (rule) {\r\n return cleaned.length >= rule.min && cleaned.length <= rule.max;\r\n }\r\n \r\n // Default: at least 7 digits, max 15 (ITU-T E.164)\r\n return cleaned.length >= 7 && cleaned.length <= 15;\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: Country | undefined,\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);\r\n }\r\n \r\n return validatePhoneLength(phone, country);\r\n}\r\n\r\n/**\r\n * Add dial code to phone number\r\n */\r\nexport function addDialCode(phone: string, country: Country | undefined): string {\r\n if (!country) return phone;\r\n const cleaned = cleanPhone(phone);\r\n return `${country.dialCode}${cleaned}`;\r\n}\r\n\r\n/**\r\n * Remove dial code from phone number\r\n */\r\nexport function removeDialCode(phone: string, country: Country | undefined): string {\r\n if (!country) return phone;\r\n const cleaned = cleanPhone(phone);\r\n const dialCode = country.dialCode.replace('+', '');\r\n if (cleaned.startsWith(dialCode)) {\r\n return cleaned.slice(dialCode.length);\r\n }\r\n return cleaned;\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.name.localeCompare(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.code.toLowerCase().includes(lowerQuery) ||\r\n country.dialCode.includes(lowerQuery)\r\n );\r\n}\r\n\r\n/**\r\n * Get placeholder based on country format\r\n */\r\nexport function getPlaceholder(country: Country | undefined): string {\r\n if (!country?.format) return 'Phone number';\r\n return country.format.replace(/#/g, '0');\r\n}\r\n","import { useCallback, useMemo, useState, useEffect } from 'react';\r\nimport type { PhoneInputOptions, UsePhoneInputReturn } from './types';\r\nimport type { Country } from './countries';\r\nimport { countries, getCountryByCode, detectCountryFromPhone } from './countries';\r\nimport {\r\n formatPhone,\r\n unformatPhone,\r\n validatePhone,\r\n addDialCode,\r\n filterCountries,\r\n getPlaceholder,\r\n} from './utils';\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 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 onBlur,\r\n onFocus,\r\n defaultCountry = 'US',\r\n preferredCountries,\r\n excludeCountries,\r\n onlyCountries,\r\n autoDetect = true,\r\n formatOnType = true,\r\n includeDialCode = false,\r\n validator,\r\n } = options;\r\n\r\n const isControlled = controlledValue !== undefined;\r\n\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (onlyCountries?.length) {\r\n filtered = filtered.filter(c => onlyCountries.includes(c.code));\r\n }\r\n \r\n if (excludeCountries?.length) {\r\n filtered = filtered.filter(c => !excludeCountries.includes(c.code));\r\n }\r\n \r\n return filtered;\r\n }, [onlyCountries, excludeCountries]);\r\n\r\n // Initialize state\r\n const initialCountry = getCountryByCode(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 // Auto-detect country from phone\r\n useEffect(() => {\r\n if (autoDetect && phone) {\r\n const detected = detectCountryFromPhone(phone);\r\n if (detected && detected.code !== country?.code) {\r\n setCountry(detected);\r\n }\r\n }\r\n }, [phone, autoDetect, country?.code]);\r\n\r\n // Format phone number\r\n const formattedPhone = useMemo(() => {\r\n if (formatOnType) {\r\n return formatPhone(phone, country);\r\n }\r\n return phone;\r\n }, [phone, country, formatOnType]);\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(\r\n () => validatePhone(phone, country, validator),\r\n [phone, country, validator]\r\n );\r\n\r\n // Filtered countries for dropdown\r\n const filteredCountries = useMemo(\r\n () => filterCountries(availableCountries, searchQuery, preferredCountries),\r\n [availableCountries, searchQuery, preferredCountries]\r\n );\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?.(includeDialCode ? addDialCode(unformatted, country) : unformatted, country);\r\n },\r\n [isControlled, onChange, country, includeDialCode]\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 onChange?.(includeDialCode ? addDialCode(phone, newCountry) : phone, newCountry);\r\n }\r\n },\r\n [phone, onChange, includeDialCode]\r\n );\r\n\r\n // Select country from dropdown\r\n const selectCountry = useCallback(\r\n (selectedCountry: Country) => {\r\n setCountry(selectedCountry);\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n onChange?.(\r\n includeDialCode ? addDialCode(phone, selectedCountry) : phone,\r\n selectedCountry\r\n );\r\n },\r\n [phone, onChange, includeDialCode]\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?.('', country);\r\n }, [isControlled, onChange, country]);\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 unformatted = unformatPhone(rawValue);\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 return {\r\n // State\r\n phone,\r\n fullPhone,\r\n country,\r\n isValid,\r\n isOpen,\r\n searchQuery,\r\n // Actions\r\n setPhone,\r\n setCountry: setCountryByCode,\r\n toggleDropdown,\r\n openDropdown,\r\n closeDropdown,\r\n setSearchQuery,\r\n clear,\r\n // Props\r\n inputProps: {\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': !isValid,\r\n },\r\n countryButtonProps: {\r\n onClick: toggleDropdown,\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'listbox',\r\n },\r\n filteredCountries,\r\n selectCountry,\r\n };\r\n}\r\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","normalizeDialCode","root","suffix","normalizedRoot","digitsOnlySuffix","buildDialCodes","country","dialCodes","dialCode","getCountryFormat","code","example","getExampleNumber","examples","getCountryPriority","index","generatedCountries","worldCountries","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","formatPhone","AsYouType","unformatPhone","formattedPhone","validatePhoneLength","validateLength","validatePhone","customValidator","countryCode","isValidPhoneNumber","isPossiblePhoneNumber","addDialCode","removeDialCode","dialDigits","filterCountries","query","preferredCountries","lowerQuery","b","aPreferred","bPreferred","getCountryDisplayName","getPlaceholder","countDigitsBeforePosition","value","position","getCaretPositionFromDigitCount","digitCount","seenDigits","usePhoneInput","options","controlledValue","defaultValue","onChange","onBlur","onFocus","defaultCountry","excludeCountries","onlyCountries","autoDetect","formatOnType","includeDialCode","validator","labels","isControlled","inputRef","useRef","pendingCaretDigitIndexRef","availableCountries","useMemo","filtered","c","localizedCountries","resolvedLabels","initialCountry","candidate","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","useEffect","nextCountry","detected","fullPhone","isValid","localizedCountry","filteredCountries","getOutputCountry","useCallback","useLayoutEffect","nextDigitIndex","input","caretPosition","setPhone","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","rawCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur","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.cjs","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\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 buildDialCodes(country: (typeof worldCountries)[number]) {\r\n const root = country.idd?.root;\r\n if (!root) {\r\n return [];\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(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 = worldCountries\r\n .filter((country) => supportedCountries.has(country.cca2 as CountryCode))\r\n .map<Country | null>((country) => {\r\n const code = country.cca2 as CountryCode;\r\n const dialCodes = buildDialCodes(country);\r\n const dialCode = `+${getCountryCallingCode(code)}`;\r\n\r\n if (!country.flag || dialCodes.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n code,\r\n name: country.name.common,\r\n dialCode,\r\n dialCodes,\r\n flag: country.flag,\r\n format: getCountryFormat(code),\r\n } satisfies Country;\r\n })\r\n .filter((country): country is Country => country !== null)\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 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 { AsYouType, isPossiblePhoneNumber, isValidPhoneNumber, validatePhoneNumberLength as validateLength, type CountryCode } from 'libphonenumber-js';\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: Country | undefined): CountryCode | undefined {\r\n return country?.code as CountryCode | undefined;\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: Country | undefined): 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: Country | undefined): 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: Country | undefined,\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);\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: Country | undefined): 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: Country | undefined): string {\r\n if (!country) return phone;\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n const digits = cleanPhone(normalized);\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: Country | undefined): 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","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,\r\n getPlaceholder,\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 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 onBlur,\r\n onFocus,\r\n defaultCountry = 'US',\r\n preferredCountries,\r\n excludeCountries,\r\n onlyCountries,\r\n autoDetect = true,\r\n formatOnType = true,\r\n includeDialCode = false,\r\n validator,\r\n locale,\r\n labels,\r\n } = options;\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\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (onlyCountries?.length) {\r\n filtered = filtered.filter(c => onlyCountries.includes(c.code));\r\n }\r\n \r\n if (excludeCountries?.length) {\r\n filtered = filtered.filter(c => !excludeCountries.includes(c.code));\r\n }\r\n \r\n return filtered;\r\n }, [onlyCountries, excludeCountries]);\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 useEffect(() => {\r\n const nextCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\r\n if (nextCountry && nextCountry.code !== country?.code) {\r\n setCountry(nextCountry);\r\n }\r\n }, [defaultCountry, availableCountries, country?.code]);\r\n\r\n // Auto-detect country from phone\r\n useEffect(() => {\r\n if (autoDetect && 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 }\r\n }\r\n }, [availableCountries, autoDetect, phone, country?.code]);\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 // Validation\r\n const isValid = useMemo(\r\n () => validatePhone(phone, country, validator),\r\n [phone, country, validator]\r\n );\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 const getOutputCountry = useCallback(\r\n (nextCountry: Country | undefined) => localizeCountry(nextCountry, locale),\r\n [locale]\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 onChange?.(\r\n includeDialCode ? addDialCode(phone, newCountry) : phone,\r\n getOutputCountry(newCountry)\r\n );\r\n }\r\n },\r\n [phone, onChange, 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 onChange?.(\r\n includeDialCode ? addDialCode(phone, rawCountry) : phone,\r\n getOutputCountry(rawCountry)\r\n );\r\n },\r\n [phone, onChange, 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 return {\r\n // State\r\n phone,\r\n fullPhone,\r\n country: localizedCountry,\r\n isValid,\r\n isOpen,\r\n searchQuery,\r\n labels: resolvedLabels,\r\n // Actions\r\n setPhone,\r\n setCountry: setCountryByCode,\r\n toggleDropdown,\r\n openDropdown,\r\n 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 ? !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 filteredCountries,\r\n selectCountry,\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 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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,17 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { InputHTMLAttributes, RefObject } from 'react';
|
|
2
3
|
|
|
3
4
|
interface Country {
|
|
4
5
|
code: string;
|
|
5
6
|
name: string;
|
|
6
7
|
dialCode: string;
|
|
8
|
+
dialCodes: string[];
|
|
7
9
|
flag: string;
|
|
8
10
|
format?: string;
|
|
11
|
+
displayName?: string;
|
|
9
12
|
}
|
|
10
13
|
declare const countries: Country[];
|
|
11
14
|
declare function getCountryByCode(code: string): Country | undefined;
|
|
15
|
+
declare function getLocalizedCountryName(country: Country | undefined, locale?: string | readonly string[]): string | undefined;
|
|
16
|
+
declare function localizeCountry(country: Country | undefined, locale?: string | readonly string[]): Country | undefined;
|
|
17
|
+
declare function localizeCountries(list: Country[], locale?: string | readonly string[]): Country[];
|
|
18
|
+
declare function getCountriesByDialCode(dialCode: string): Country[];
|
|
12
19
|
declare function getCountryByDialCode(dialCode: string): Country | undefined;
|
|
13
20
|
declare function detectCountryFromPhone(phone: string): Country | undefined;
|
|
14
21
|
|
|
22
|
+
interface PhoneInputLabels {
|
|
23
|
+
selectCountry: string;
|
|
24
|
+
countrySearchPlaceholder: string;
|
|
25
|
+
noCountriesFound: string;
|
|
26
|
+
searchCountriesAriaLabel: string;
|
|
27
|
+
countryOptionsAriaLabel: string;
|
|
28
|
+
countryButtonAriaLabel: string;
|
|
29
|
+
}
|
|
15
30
|
interface PhoneInputOptions {
|
|
16
31
|
defaultCountry?: string;
|
|
17
32
|
preferredCountries?: string[];
|
|
@@ -22,6 +37,8 @@ interface PhoneInputOptions {
|
|
|
22
37
|
formatOnType?: boolean;
|
|
23
38
|
includeDialCode?: boolean;
|
|
24
39
|
validator?: (phone: string, country: Country | undefined) => boolean;
|
|
40
|
+
locale?: string | readonly string[];
|
|
41
|
+
labels?: Partial<PhoneInputLabels>;
|
|
25
42
|
}
|
|
26
43
|
interface PhoneInputState {
|
|
27
44
|
phone: string;
|
|
@@ -30,6 +47,7 @@ interface PhoneInputState {
|
|
|
30
47
|
isValid: boolean;
|
|
31
48
|
isOpen: boolean;
|
|
32
49
|
searchQuery: string;
|
|
50
|
+
labels: PhoneInputLabels;
|
|
33
51
|
}
|
|
34
52
|
interface PhoneInputActions {
|
|
35
53
|
setPhone: (phone: string) => void;
|
|
@@ -41,11 +59,14 @@ interface PhoneInputActions {
|
|
|
41
59
|
clear: () => void;
|
|
42
60
|
}
|
|
43
61
|
interface UsePhoneInputReturn extends PhoneInputState, PhoneInputActions {
|
|
44
|
-
inputProps: InputHTMLAttributes<HTMLInputElement
|
|
62
|
+
inputProps: InputHTMLAttributes<HTMLInputElement> & {
|
|
63
|
+
ref: RefObject<HTMLInputElement | null>;
|
|
64
|
+
};
|
|
45
65
|
countryButtonProps: {
|
|
46
66
|
onClick: () => void;
|
|
47
67
|
'aria-expanded': boolean;
|
|
48
68
|
'aria-haspopup': 'listbox';
|
|
69
|
+
'aria-label': string;
|
|
49
70
|
};
|
|
50
71
|
filteredCountries: Country[];
|
|
51
72
|
selectCountry: (country: Country) => void;
|
|
@@ -59,6 +80,7 @@ interface PhoneInputProps extends PhoneInputOptions {
|
|
|
59
80
|
containerClassName?: string;
|
|
60
81
|
inputClassName?: string;
|
|
61
82
|
selectorClassName?: string;
|
|
83
|
+
searchable?: boolean;
|
|
62
84
|
placeholder?: string;
|
|
63
85
|
disabled?: boolean;
|
|
64
86
|
readOnly?: boolean;
|
|
@@ -76,6 +98,20 @@ declare function usePhoneInput(options?: PhoneInputOptions & {
|
|
|
76
98
|
onFocus?: () => void;
|
|
77
99
|
}): UsePhoneInputReturn;
|
|
78
100
|
|
|
101
|
+
interface PhoneInputRef {
|
|
102
|
+
focus: () => void;
|
|
103
|
+
blur: () => void;
|
|
104
|
+
clear: () => void;
|
|
105
|
+
setCountry: (countryCode: string) => void;
|
|
106
|
+
getCountry: () => Country | undefined;
|
|
107
|
+
open: () => void;
|
|
108
|
+
close: () => void;
|
|
109
|
+
}
|
|
110
|
+
declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<PhoneInputRef>>;
|
|
111
|
+
|
|
112
|
+
declare const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels;
|
|
113
|
+
declare function resolvePhoneInputLabels(locale?: string | readonly string[], overrides?: Partial<PhoneInputLabels>): PhoneInputLabels;
|
|
114
|
+
|
|
79
115
|
declare function cleanPhone(phone: string): string;
|
|
80
116
|
declare function formatPhone(phone: string, country: Country | undefined): string;
|
|
81
117
|
declare function unformatPhone(formattedPhone: string): string;
|
|
@@ -84,6 +120,7 @@ declare function validatePhone(phone: string, country: Country | undefined, cust
|
|
|
84
120
|
declare function addDialCode(phone: string, country: Country | undefined): string;
|
|
85
121
|
declare function removeDialCode(phone: string, country: Country | undefined): string;
|
|
86
122
|
declare function filterCountries(countries: Country[], query: string, preferredCountries?: string[]): Country[];
|
|
123
|
+
declare function getCountryDisplayName(country: Country | undefined): string;
|
|
87
124
|
declare function getPlaceholder(country: Country | undefined): string;
|
|
88
125
|
|
|
89
|
-
export { type Country, type PhoneInputActions, type PhoneInputOptions, type PhoneInputProps, type PhoneInputState, type UsePhoneInputReturn, addDialCode, cleanPhone, countries, detectCountryFromPhone, filterCountries, formatPhone, getCountryByCode, getCountryByDialCode, getPlaceholder, removeDialCode, unformatPhone, usePhoneInput, validatePhone, validatePhoneLength };
|
|
126
|
+
export { type Country, DEFAULT_PHONE_INPUT_LABELS, PhoneInput, type PhoneInputActions, type PhoneInputLabels, type PhoneInputOptions, type PhoneInputProps, type PhoneInputRef, type PhoneInputState, type UsePhoneInputReturn, addDialCode, cleanPhone, countries, detectCountryFromPhone, filterCountries, formatPhone, getCountriesByDialCode, getCountryByCode, getCountryByDialCode, getCountryDisplayName, getLocalizedCountryName, getPlaceholder, localizeCountries, localizeCountry, removeDialCode, resolvePhoneInputLabels, unformatPhone, usePhoneInput, validatePhone, validatePhoneLength };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { InputHTMLAttributes, RefObject } from 'react';
|
|
2
3
|
|
|
3
4
|
interface Country {
|
|
4
5
|
code: string;
|
|
5
6
|
name: string;
|
|
6
7
|
dialCode: string;
|
|
8
|
+
dialCodes: string[];
|
|
7
9
|
flag: string;
|
|
8
10
|
format?: string;
|
|
11
|
+
displayName?: string;
|
|
9
12
|
}
|
|
10
13
|
declare const countries: Country[];
|
|
11
14
|
declare function getCountryByCode(code: string): Country | undefined;
|
|
15
|
+
declare function getLocalizedCountryName(country: Country | undefined, locale?: string | readonly string[]): string | undefined;
|
|
16
|
+
declare function localizeCountry(country: Country | undefined, locale?: string | readonly string[]): Country | undefined;
|
|
17
|
+
declare function localizeCountries(list: Country[], locale?: string | readonly string[]): Country[];
|
|
18
|
+
declare function getCountriesByDialCode(dialCode: string): Country[];
|
|
12
19
|
declare function getCountryByDialCode(dialCode: string): Country | undefined;
|
|
13
20
|
declare function detectCountryFromPhone(phone: string): Country | undefined;
|
|
14
21
|
|
|
22
|
+
interface PhoneInputLabels {
|
|
23
|
+
selectCountry: string;
|
|
24
|
+
countrySearchPlaceholder: string;
|
|
25
|
+
noCountriesFound: string;
|
|
26
|
+
searchCountriesAriaLabel: string;
|
|
27
|
+
countryOptionsAriaLabel: string;
|
|
28
|
+
countryButtonAriaLabel: string;
|
|
29
|
+
}
|
|
15
30
|
interface PhoneInputOptions {
|
|
16
31
|
defaultCountry?: string;
|
|
17
32
|
preferredCountries?: string[];
|
|
@@ -22,6 +37,8 @@ interface PhoneInputOptions {
|
|
|
22
37
|
formatOnType?: boolean;
|
|
23
38
|
includeDialCode?: boolean;
|
|
24
39
|
validator?: (phone: string, country: Country | undefined) => boolean;
|
|
40
|
+
locale?: string | readonly string[];
|
|
41
|
+
labels?: Partial<PhoneInputLabels>;
|
|
25
42
|
}
|
|
26
43
|
interface PhoneInputState {
|
|
27
44
|
phone: string;
|
|
@@ -30,6 +47,7 @@ interface PhoneInputState {
|
|
|
30
47
|
isValid: boolean;
|
|
31
48
|
isOpen: boolean;
|
|
32
49
|
searchQuery: string;
|
|
50
|
+
labels: PhoneInputLabels;
|
|
33
51
|
}
|
|
34
52
|
interface PhoneInputActions {
|
|
35
53
|
setPhone: (phone: string) => void;
|
|
@@ -41,11 +59,14 @@ interface PhoneInputActions {
|
|
|
41
59
|
clear: () => void;
|
|
42
60
|
}
|
|
43
61
|
interface UsePhoneInputReturn extends PhoneInputState, PhoneInputActions {
|
|
44
|
-
inputProps: InputHTMLAttributes<HTMLInputElement
|
|
62
|
+
inputProps: InputHTMLAttributes<HTMLInputElement> & {
|
|
63
|
+
ref: RefObject<HTMLInputElement | null>;
|
|
64
|
+
};
|
|
45
65
|
countryButtonProps: {
|
|
46
66
|
onClick: () => void;
|
|
47
67
|
'aria-expanded': boolean;
|
|
48
68
|
'aria-haspopup': 'listbox';
|
|
69
|
+
'aria-label': string;
|
|
49
70
|
};
|
|
50
71
|
filteredCountries: Country[];
|
|
51
72
|
selectCountry: (country: Country) => void;
|
|
@@ -59,6 +80,7 @@ interface PhoneInputProps extends PhoneInputOptions {
|
|
|
59
80
|
containerClassName?: string;
|
|
60
81
|
inputClassName?: string;
|
|
61
82
|
selectorClassName?: string;
|
|
83
|
+
searchable?: boolean;
|
|
62
84
|
placeholder?: string;
|
|
63
85
|
disabled?: boolean;
|
|
64
86
|
readOnly?: boolean;
|
|
@@ -76,6 +98,20 @@ declare function usePhoneInput(options?: PhoneInputOptions & {
|
|
|
76
98
|
onFocus?: () => void;
|
|
77
99
|
}): UsePhoneInputReturn;
|
|
78
100
|
|
|
101
|
+
interface PhoneInputRef {
|
|
102
|
+
focus: () => void;
|
|
103
|
+
blur: () => void;
|
|
104
|
+
clear: () => void;
|
|
105
|
+
setCountry: (countryCode: string) => void;
|
|
106
|
+
getCountry: () => Country | undefined;
|
|
107
|
+
open: () => void;
|
|
108
|
+
close: () => void;
|
|
109
|
+
}
|
|
110
|
+
declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<PhoneInputRef>>;
|
|
111
|
+
|
|
112
|
+
declare const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels;
|
|
113
|
+
declare function resolvePhoneInputLabels(locale?: string | readonly string[], overrides?: Partial<PhoneInputLabels>): PhoneInputLabels;
|
|
114
|
+
|
|
79
115
|
declare function cleanPhone(phone: string): string;
|
|
80
116
|
declare function formatPhone(phone: string, country: Country | undefined): string;
|
|
81
117
|
declare function unformatPhone(formattedPhone: string): string;
|
|
@@ -84,6 +120,7 @@ declare function validatePhone(phone: string, country: Country | undefined, cust
|
|
|
84
120
|
declare function addDialCode(phone: string, country: Country | undefined): string;
|
|
85
121
|
declare function removeDialCode(phone: string, country: Country | undefined): string;
|
|
86
122
|
declare function filterCountries(countries: Country[], query: string, preferredCountries?: string[]): Country[];
|
|
123
|
+
declare function getCountryDisplayName(country: Country | undefined): string;
|
|
87
124
|
declare function getPlaceholder(country: Country | undefined): string;
|
|
88
125
|
|
|
89
|
-
export { type Country, type PhoneInputActions, type PhoneInputOptions, type PhoneInputProps, type PhoneInputState, type UsePhoneInputReturn, addDialCode, cleanPhone, countries, detectCountryFromPhone, filterCountries, formatPhone, getCountryByCode, getCountryByDialCode, getPlaceholder, removeDialCode, unformatPhone, usePhoneInput, validatePhone, validatePhoneLength };
|
|
126
|
+
export { type Country, DEFAULT_PHONE_INPUT_LABELS, PhoneInput, type PhoneInputActions, type PhoneInputLabels, type PhoneInputOptions, type PhoneInputProps, type PhoneInputRef, type PhoneInputState, type UsePhoneInputReturn, addDialCode, cleanPhone, countries, detectCountryFromPhone, filterCountries, formatPhone, getCountriesByDialCode, getCountryByCode, getCountryByDialCode, getCountryDisplayName, getLocalizedCountryName, getPlaceholder, localizeCountries, localizeCountry, removeDialCode, resolvePhoneInputLabels, unformatPhone, usePhoneInput, validatePhone, validatePhoneLength };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {useMemo,useState,useEffect,useCallback}from'react';var C=[{code:"US",name:"United States",dialCode:"+1",flag:"\u{1F1FA}\u{1F1F8}",format:"(###) ###-####"},{code:"GB",name:"United Kingdom",dialCode:"+44",flag:"\u{1F1EC}\u{1F1E7}",format:"#### ######"},{code:"CA",name:"Canada",dialCode:"+1",flag:"\u{1F1E8}\u{1F1E6}",format:"(###) ###-####"},{code:"AU",name:"Australia",dialCode:"+61",flag:"\u{1F1E6}\u{1F1FA}",format:"#### ### ###"},{code:"DE",name:"Germany",dialCode:"+49",flag:"\u{1F1E9}\u{1F1EA}",format:"#### #######"},{code:"FR",name:"France",dialCode:"+33",flag:"\u{1F1EB}\u{1F1F7}",format:"# ## ## ## ##"},{code:"IT",name:"Italy",dialCode:"+39",flag:"\u{1F1EE}\u{1F1F9}",format:"### ### ####"},{code:"ES",name:"Spain",dialCode:"+34",flag:"\u{1F1EA}\u{1F1F8}",format:"### ### ###"},{code:"JP",name:"Japan",dialCode:"+81",flag:"\u{1F1EF}\u{1F1F5}",format:"## #### ####"},{code:"CN",name:"China",dialCode:"+86",flag:"\u{1F1E8}\u{1F1F3}",format:"### #### ####"},{code:"IN",name:"India",dialCode:"+91",flag:"\u{1F1EE}\u{1F1F3}",format:"##### #####"},{code:"BR",name:"Brazil",dialCode:"+55",flag:"\u{1F1E7}\u{1F1F7}",format:"(##) #####-####"},{code:"MX",name:"Mexico",dialCode:"+52",flag:"\u{1F1F2}\u{1F1FD}",format:"### ### ####"},{code:"RU",name:"Russia",dialCode:"+7",flag:"\u{1F1F7}\u{1F1FA}",format:"(###) ###-##-##"},{code:"KR",name:"South Korea",dialCode:"+82",flag:"\u{1F1F0}\u{1F1F7}",format:"## #### ####"},{code:"NL",name:"Netherlands",dialCode:"+31",flag:"\u{1F1F3}\u{1F1F1}",format:"# ## ## ## ##"},{code:"BE",name:"Belgium",dialCode:"+32",flag:"\u{1F1E7}\u{1F1EA}",format:"### ## ## ##"},{code:"SE",name:"Sweden",dialCode:"+46",flag:"\u{1F1F8}\u{1F1EA}",format:"## ### ## ##"},{code:"CH",name:"Switzerland",dialCode:"+41",flag:"\u{1F1E8}\u{1F1ED}",format:"## ### ## ##"},{code:"AT",name:"Austria",dialCode:"+43",flag:"\u{1F1E6}\u{1F1F9}",format:"### ######"},{code:"PL",name:"Poland",dialCode:"+48",flag:"\u{1F1F5}\u{1F1F1}",format:"### ### ###"},{code:"UA",name:"Ukraine",dialCode:"+380",flag:"\u{1F1FA}\u{1F1E6}",format:"## ### ## ##"},{code:"TR",name:"Turkey",dialCode:"+90",flag:"\u{1F1F9}\u{1F1F7}",format:"(###) ### ## ##"},{code:"SA",name:"Saudi Arabia",dialCode:"+966",flag:"\u{1F1F8}\u{1F1E6}",format:"# ### ####"},{code:"ZA",name:"South Africa",dialCode:"+27",flag:"\u{1F1FF}\u{1F1E6}",format:"## ### ####"},{code:"EG",name:"Egypt",dialCode:"+20",flag:"\u{1F1EA}\u{1F1EC}",format:"### ### ####"},{code:"NG",name:"Nigeria",dialCode:"+234",flag:"\u{1F1F3}\u{1F1EC}",format:"### ### ####"},{code:"KE",name:"Kenya",dialCode:"+254",flag:"\u{1F1F0}\u{1F1EA}",format:"### ######"},{code:"AE",name:"UAE",dialCode:"+971",flag:"\u{1F1E6}\u{1F1EA}",format:"## ### ####"},{code:"IL",name:"Israel",dialCode:"+972",flag:"\u{1F1EE}\u{1F1F1}",format:"## ### ####"},{code:"IR",name:"Iran",dialCode:"+98",flag:"\u{1F1EE}\u{1F1F7}",format:"### ### ####"},{code:"PK",name:"Pakistan",dialCode:"+92",flag:"\u{1F1F5}\u{1F1F0}",format:"### #######"},{code:"BD",name:"Bangladesh",dialCode:"+880",flag:"\u{1F1E7}\u{1F1E9}",format:"#### ######"},{code:"VN",name:"Vietnam",dialCode:"+84",flag:"\u{1F1FB}\u{1F1F3}",format:"## #### ###"},{code:"TH",name:"Thailand",dialCode:"+66",flag:"\u{1F1F9}\u{1F1ED}",format:"## ### ####"},{code:"MY",name:"Malaysia",dialCode:"+60",flag:"\u{1F1F2}\u{1F1FE}",format:"## ### ####"},{code:"PH",name:"Philippines",dialCode:"+63",flag:"\u{1F1F5}\u{1F1ED}",format:"### ### ####"},{code:"SG",name:"Singapore",dialCode:"+65",flag:"\u{1F1F8}\u{1F1EC}",format:"#### ####"},{code:"ID",name:"Indonesia",dialCode:"+62",flag:"\u{1F1EE}\u{1F1E9}",format:"### ### ####"},{code:"NZ",name:"New Zealand",dialCode:"+64",flag:"\u{1F1F3}\u{1F1FF}",format:"## ### ####"},{code:"AR",name:"Argentina",dialCode:"+54",flag:"\u{1F1E6}\u{1F1F7}",format:"## #### ####"},{code:"CL",name:"Chile",dialCode:"+56",flag:"\u{1F1E8}\u{1F1F1}",format:"# #### ####"},{code:"CO",name:"Colombia",dialCode:"+57",flag:"\u{1F1E8}\u{1F1F4}",format:"### ### ####"},{code:"PE",name:"Peru",dialCode:"+51",flag:"\u{1F1F5}\u{1F1EA}",format:"### ### ###"},{code:"VE",name:"Venezuela",dialCode:"+58",flag:"\u{1F1FB}\u{1F1EA}",format:"### ### ####"},{code:"PT",name:"Portugal",dialCode:"+351",flag:"\u{1F1F5}\u{1F1F9}",format:"### ### ###"},{code:"GR",name:"Greece",dialCode:"+30",flag:"\u{1F1EC}\u{1F1F7}",format:"### ### ####"},{code:"DK",name:"Denmark",dialCode:"+45",flag:"\u{1F1E9}\u{1F1F0}",format:"## ## ## ##"},{code:"FI",name:"Finland",dialCode:"+358",flag:"\u{1F1EB}\u{1F1EE}",format:"## ### ## ##"},{code:"NO",name:"Norway",dialCode:"+47",flag:"\u{1F1F3}\u{1F1F4}",format:"### ## ###"},{code:"IE",name:"Ireland",dialCode:"+353",flag:"\u{1F1EE}\u{1F1EA}",format:"## ### ####"},{code:"CZ",name:"Czech Republic",dialCode:"+420",flag:"\u{1F1E8}\u{1F1FF}",format:"### ### ###"},{code:"HU",name:"Hungary",dialCode:"+36",flag:"\u{1F1ED}\u{1F1FA}",format:"## ### ####"},{code:"RO",name:"Romania",dialCode:"+40",flag:"\u{1F1F7}\u{1F1F4}",format:"### ### ###"},{code:"BG",name:"Bulgaria",dialCode:"+359",flag:"\u{1F1E7}\u{1F1EC}",format:"### ### ###"},{code:"HR",name:"Croatia",dialCode:"+385",flag:"\u{1F1ED}\u{1F1F7}",format:"## ### ####"},{code:"RS",name:"Serbia",dialCode:"+381",flag:"\u{1F1F7}\u{1F1F8}",format:"## ### ####"},{code:"SK",name:"Slovakia",dialCode:"+421",flag:"\u{1F1F8}\u{1F1F0}",format:"### ### ###"},{code:"SI",name:"Slovenia",dialCode:"+386",flag:"\u{1F1F8}\u{1F1EE}",format:"## ### ###"},{code:"LT",name:"Lithuania",dialCode:"+370",flag:"\u{1F1F1}\u{1F1F9}",format:"### #####"},{code:"LV",name:"Latvia",dialCode:"+371",flag:"\u{1F1F1}\u{1F1FB}",format:"## ### ###"},{code:"EE",name:"Estonia",dialCode:"+372",flag:"\u{1F1EA}\u{1F1EA}",format:"#### ####"}],ne=new Map(C.map(e=>[e.code,e]));function S(e){return ne.get(e.toUpperCase())}function te(e){return C.find(a=>a.dialCode===e)}function w(e){let a=e.replace(/\D/g,""),n=[...C].sort((o,t)=>t.dialCode.length-o.dialCode.length);for(let o of n){let t=o.dialCode.replace("+","");if(a.startsWith(t))return o}}function g(e){return e.replace(/\D/g,"")}function N(e,a){if(!e||!a?.format)return e;let n=g(e),o=a.format,t="",u=0;for(let f=0;f<o.length&&u<n.length;f++)o[f]==="#"?(t+=n[u],u++):t+=o[f];return t}function R(e){return g(e)}function k(e,a){if(!e||!a)return false;let n=g(e),o={US:{min:10,max:10},CA:{min:10,max:10},GB:{min:10,max:11},AU:{min:9,max:9},DE:{min:10,max:11},FR:{min:9,max:9},IT:{min:9,max:10},ES:{min:9,max:9},JP:{min:10,max:11},CN:{min:11,max:11},IN:{min:10,max:10},BR:{min:11,max:11},MX:{min:10,max:10},RU:{min:10,max:10},KR:{min:9,max:11},NL:{min:9,max:9},BE:{min:9,max:9},SE:{min:9,max:9},CH:{min:9,max:9},AT:{min:9,max:13},PL:{min:9,max:9}},t=a.code?o[a.code]:void 0;return t?n.length>=t.min&&n.length<=t.max:n.length>=7&&n.length<=15}function b(e,a,n){return e?n?n(e,a):k(e,a):false}function p(e,a){if(!a)return e;let n=g(e);return `${a.dialCode}${n}`}function re(e,a){if(!a)return e;let n=g(e),o=a.dialCode.replace("+","");return n.startsWith(o)?n.slice(o.length):n}function F(e,a,n){let o=a.toLowerCase().trim();return o?e.filter(t=>t.name.toLowerCase().includes(o)||t.code.toLowerCase().includes(o)||t.dialCode.includes(o)):n?.length?[...e].sort((t,u)=>{let f=n.indexOf(t.code),s=n.indexOf(u.code);return f!==-1&&s!==-1?f-s:f!==-1?-1:s!==-1?1:t.name.localeCompare(u.name)}):e}function T(e){return e?.format?e.format.replace(/#/g,"0"):"Phone number"}function ie(e={}){let{value:a,defaultValue:n="",onChange:o,onBlur:t,onFocus:u,defaultCountry:f="US",preferredCountries:s,excludeCountries:E,onlyCountries:v,autoDetect:O=true,formatOnType:M=true,includeDialCode:c=false,validator:G}=e,h=a!==void 0,D=useMemo(()=>{let r=C;return v?.length&&(r=r.filter(l=>v.includes(l.code))),E?.length&&(r=r.filter(l=>!E.includes(l.code))),r},[v,E]),z=S(f)||D[0],[Z,K]=useState(n),[i,A]=useState(z),[P,x]=useState(false),[U,I]=useState(""),d=h?a:Z;useEffect(()=>{if(O&&d){let r=w(d);r&&r.code!==i?.code&&A(r);}},[d,O,i?.code]);let J=useMemo(()=>M?N(d,i):d,[d,i,M]),Q=useMemo(()=>c&&i?p(d,i):d,[d,i,c]),V=useMemo(()=>b(d,i,G),[d,i,G]),W=useMemo(()=>F(D,U,s),[D,U,s]),L=useCallback(r=>{let l=R(r);h||K(l),o?.(c?p(l,i):l,i);},[h,o,i,c]),X=useCallback(r=>{let l=S(r);l&&(A(l),o?.(c?p(d,l):d,l));},[d,o,c]),$=useCallback(r=>{A(r),x(false),I(""),o?.(c?p(d,r):d,r);},[d,o,c]),H=useCallback(()=>{x(r=>!r),P&&I("");},[P]),Y=useCallback(()=>{x(true);},[]),j=useCallback(()=>{x(false),I("");},[]),q=useCallback(()=>{h||K(""),o?.("",i);},[h,o,i]),_=useCallback(r=>{let l=r.target.value,ae=R(l);L(ae);},[L]),ee=useCallback(()=>{u?.();},[u]),oe=useCallback(()=>{t?.();},[t]);return {phone:d,fullPhone:Q,country:i,isValid:V,isOpen:P,searchQuery:U,setPhone:L,setCountry:X,toggleDropdown:H,openDropdown:Y,closeDropdown:j,setSearchQuery:I,clear:q,inputProps:{value:J,onChange:_,onFocus:ee,onBlur:oe,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:T(i),"aria-invalid":!V},countryButtonProps:{onClick:H,"aria-expanded":P,"aria-haspopup":"listbox"},filteredCountries:W,selectCountry:$}}export{p as addDialCode,g as cleanPhone,C as countries,w as detectCountryFromPhone,F as filterCountries,N as formatPhone,S as getCountryByCode,te as getCountryByDialCode,T as getPlaceholder,re as removeDialCode,R as unformatPhone,ie as usePhoneInput,b as validatePhone,k as validatePhoneLength};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {forwardRef,useRef,useState,useId,useCallback,useEffect,useImperativeHandle,useMemo,useLayoutEffect}from'react';import {getCountries,getCountryCallingCode,getExampleNumber,parsePhoneNumberFromString,AsYouType,isValidPhoneNumber,isPossiblePhoneNumber,validatePhoneNumberLength}from'libphonenumber-js';import ke from'libphonenumber-js/mobile/examples';import Me from'world-countries';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Te=["US","GB","CA","AU","DE","FR","IT","ES","JP","CN","IN","BR","MX","KR","NL","CH","SE","AE","SG","ZA","NG","SA","TR","ID","PH","TH","VN","MY","NZ","AR"],We=new Set(getCountries());function $e(e,n){let t=e.startsWith("+")?e:`+${e}`,o=n.replace(/\D/g,"");return `${t}${o}`}function Ue(e){let n=e.idd?.root;if(!n)return [];let o=(e.idd?.suffixes?.length?e.idd.suffixes:[""]).map(a=>$e(n,a)).filter(a=>/^\+\d+$/.test(a));return Array.from(new Set(o))}function He(e){let n=getExampleNumber(e,ke);return n?n.formatNational().replace(/\d/g,"#"):void 0}function Ie(e){let n=Te.indexOf(e);return n===-1?Number.MAX_SAFE_INTEGER:n}var _e=Me.filter(e=>We.has(e.cca2)).map(e=>{let n=e.cca2,t=Ue(e),o=`+${getCountryCallingCode(n)}`;return !e.flag||t.length===0?null:{code:n,name:e.name.common,dialCode:o,dialCodes:t,flag:e.flag,format:He(n)}}).filter(e=>e!==null).sort((e,n)=>{let t=Ie(e.code)-Ie(n.code);return t!==0?t:e.name.localeCompare(n.name)}),T=_e,Ve=new Map(T.map(e=>[e.code,e])),Ge=T.reduce((e,n)=>{for(let t of n.dialCodes){let o=e.get(t)??[];o.push(n),e.set(t,o);}return e},new Map),Ke=T.flatMap(e=>e.dialCodes.map(n=>({dialCode:n,country:e}))).sort((e,n)=>n.dialCode.length-e.dialCode.length),Ae=new Map;function je(e){return Array.isArray(e)?[...e]:e?[e]:[]}function Qe(e){let n=je(e);if(n.length===0||typeof Intl>"u"||typeof Intl.DisplayNames>"u")return;let t=n.join("|"),o=Ae.get(t);if(o)return o;try{let a=new Intl.DisplayNames(n,{type:"region"});return Ae.set(t,a),a}catch{return}}function Ye(e){let n=e.replace(/\D/g,"");return n?`+${n}`:""}function K(e){return Ve.get(e.toUpperCase())}function Ne(e,n){return e?Qe(n)?.of(e.code)??e.displayName??e.name:void 0}function j(e,n){if(!e)return;let t=Ne(e,n);return t?{...e,displayName:t}:e}function de(e,n){return n?e.map(t=>j(t,n)??t):e}function xe(e){return Ge.get(Ye(e))??[]}function qe(e){return xe(e)[0]}function pe(e){let n=e.trim();if(!n)return;let t=n.startsWith("+")?`+${n.replace(/\D/g,"")}`:n.startsWith("00")?`+${n.slice(2).replace(/\D/g,"")}`:"";if(!t)return;let o=parsePhoneNumberFromString(t);return o?.country?K(o.country):Ke.find(a=>t.startsWith(a.dialCode))?.country}var fe={selectCountry:"Select country",countrySearchPlaceholder:"Search countries...",noCountriesFound:"No countries found",searchCountriesAriaLabel:"Search countries",countryOptionsAriaLabel:"Country options",countryButtonAriaLabel:"Open country selector"},Xe={en:fe,fr:{selectCountry:"Choisir un pays",countrySearchPlaceholder:"Rechercher un pays...",noCountriesFound:"Aucun pays trouv\xE9",searchCountriesAriaLabel:"Rechercher des pays",countryOptionsAriaLabel:"Options de pays",countryButtonAriaLabel:"Ouvrir le s\xE9lecteur de pays"},de:{selectCountry:"Land ausw\xE4hlen",countrySearchPlaceholder:"Land suchen...",noCountriesFound:"Keine L\xE4nder gefunden",searchCountriesAriaLabel:"L\xE4nder suchen",countryOptionsAriaLabel:"L\xE4nderoptionen",countryButtonAriaLabel:"L\xE4nderauswahl \xF6ffnen"},es:{selectCountry:"Seleccionar pa\xEDs",countrySearchPlaceholder:"Buscar pa\xEDs...",noCountriesFound:"No se encontraron pa\xEDses",searchCountriesAriaLabel:"Buscar pa\xEDses",countryOptionsAriaLabel:"Opciones de pa\xEDs",countryButtonAriaLabel:"Abrir selector de pa\xEDs"},pt:{selectCountry:"Selecionar pa\xEDs",countrySearchPlaceholder:"Pesquisar pa\xEDs...",noCountriesFound:"Nenhum pa\xEDs encontrado",searchCountriesAriaLabel:"Pesquisar pa\xEDses",countryOptionsAriaLabel:"Op\xE7\xF5es de pa\xEDs",countryButtonAriaLabel:"Abrir seletor de pa\xEDs"},it:{selectCountry:"Seleziona paese",countrySearchPlaceholder:"Cerca paese...",noCountriesFound:"Nessun paese trovato",searchCountriesAriaLabel:"Cerca paesi",countryOptionsAriaLabel:"Opzioni paese",countryButtonAriaLabel:"Apri selettore paese"},ja:{selectCountry:"\u56FD\u3092\u9078\u629E",countrySearchPlaceholder:"\u56FD\u3092\u691C\u7D22...",noCountriesFound:"\u56FD\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",searchCountriesAriaLabel:"\u56FD\u3092\u691C\u7D22",countryOptionsAriaLabel:"\u56FD\u306E\u5019\u88DC",countryButtonAriaLabel:"\u56FD\u306E\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u958B\u304F"},ko:{selectCountry:"\uAD6D\uAC00 \uC120\uD0DD",countrySearchPlaceholder:"\uAD6D\uAC00 \uAC80\uC0C9...",noCountriesFound:"\uAD6D\uAC00\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",searchCountriesAriaLabel:"\uAD6D\uAC00 \uAC80\uC0C9",countryOptionsAriaLabel:"\uAD6D\uAC00 \uC635\uC158",countryButtonAriaLabel:"\uAD6D\uAC00 \uC120\uD0DD\uAE30 \uC5F4\uAE30"},zh:{selectCountry:"\u9009\u62E9\u56FD\u5BB6",countrySearchPlaceholder:"\u641C\u7D22\u56FD\u5BB6...",noCountriesFound:"\u672A\u627E\u5230\u56FD\u5BB6",searchCountriesAriaLabel:"\u641C\u7D22\u56FD\u5BB6",countryOptionsAriaLabel:"\u56FD\u5BB6\u9009\u9879",countryButtonAriaLabel:"\u6253\u5F00\u56FD\u5BB6\u9009\u62E9\u5668"},ar:{selectCountry:"\u0627\u062E\u062A\u0631 \u0627\u0644\u062F\u0648\u0644\u0629",countrySearchPlaceholder:"\u0627\u0628\u062D\u062B \u0639\u0646 \u062F\u0648\u0644\u0629...",noCountriesFound:"\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u062F\u0648\u0644",searchCountriesAriaLabel:"\u0627\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u062F\u0648\u0644",countryOptionsAriaLabel:"\u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u062F\u0648\u0644",countryButtonAriaLabel:"\u0627\u0641\u062A\u062D \u0645\u062D\u062F\u062F \u0627\u0644\u062F\u0648\u0644\u0629"},hi:{selectCountry:"\u0926\u0947\u0936 \u091A\u0941\u0928\u0947\u0902",countrySearchPlaceholder:"\u0926\u0947\u0936 \u0916\u094B\u091C\u0947\u0902...",noCountriesFound:"\u0915\u094B\u0908 \u0926\u0947\u0936 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E",searchCountriesAriaLabel:"\u0926\u0947\u0936 \u0916\u094B\u091C\u0947\u0902",countryOptionsAriaLabel:"\u0926\u0947\u0936 \u0935\u093F\u0915\u0932\u094D\u092A",countryButtonAriaLabel:"\u0926\u0947\u0936 \u091A\u092F\u0928 \u0916\u094B\u0932\u0947\u0902"}};function Ze(e){let t=(Array.isArray(e)?e:e?[e]:[]).find(Boolean);return t?t.toLowerCase().split("-")[0]:void 0}function Ce(e,n){let t=Ze(e),o=t?Xe[t]:void 0;return {...fe,...o,...n}}function W(e){let n=e.trim(),t=w(n);return n.startsWith("+")&&!t?"+":t?n.startsWith("+")?`+${t}`:t:""}function ye(e){return e?.code}function w(e){return e.replace(/\D/g,"")}function he(e,n){return e&&new AsYouType(ye(n)).input(W(e))}function ne(e){return W(e)}function nn(e,n){return !e||!n?false:e.trim().startsWith("+")?validatePhoneNumberLength(W(e))===void 0:validatePhoneNumberLength(w(e),ye(n))===void 0}function ge(e,n,t){if(!e)return false;if(t)return t(e,n);let o=W(e),a=ye(n);return a?o.startsWith("+")?isValidPhoneNumber(o):isValidPhoneNumber(w(o),a):isPossiblePhoneNumber(o.startsWith("+")?o:`+${w(o)}`)}function $(e,n){if(!n)return e;let t=W(e);if(!t||t==="+")return "";if(t.startsWith("+"))return t;let o=w(t);return n.dialCodes.find(d=>o.startsWith(d.replace("+","")))?`+${o}`:`${n.dialCode}${o}`}function te(e,n){if(!n)return e;let t=W(e),o=w(t);for(let a of n.dialCodes){let d=a.replace("+","");if(o.startsWith(d))return o.slice(d.length)}return o}function me(e,n,t){let o=n.toLowerCase().trim();return o?e.filter(a=>a.name.toLowerCase().includes(o)||(a.displayName??"").toLowerCase().includes(o)||a.code.toLowerCase().includes(o)||a.dialCodes.some(d=>d.includes(o))):t?.length?[...e].sort((a,d)=>{let P=t.indexOf(a.code),N=t.indexOf(d.code);return P!==-1&&N!==-1?P-N:P!==-1?-1:N!==-1?1:(a.displayName??a.name).localeCompare(d.displayName??d.name)}):e}function be(e){return e?.displayName??e?.name??""}function Pe(e){return e?.format?e.format.replace(/#/g,"0"):e?.dialCode?`${e.dialCode} 000 000 0000`:"Phone number"}function on(e,n){return e.slice(0,n).replace(/\D/g,"").length}function rn(e,n){if(n<=0)return e.startsWith("+")?1:0;let t=0;for(let o=0;o<e.length;o+=1)if(/\d/.test(e[o])&&(t+=1,t===n))return o+1;return e.length}function Le(e={}){let{value:n,defaultValue:t="",onChange:o,onBlur:a,onFocus:d,defaultCountry:P="US",preferredCountries:N,excludeCountries:H,onlyCountries:_,autoDetect:Y=true,formatOnType:q=true,includeDialCode:p=false,validator:O,locale:m,labels:X}=e,v=n!==void 0,Z=useRef(null),V=useRef(null),y=useMemo(()=>{let r=T;return _?.length&&(r=r.filter(i=>_.includes(i.code))),H?.length&&(r=r.filter(i=>!H.includes(i.code))),r},[_,H]),R=useMemo(()=>de(y,m),[y,m]),E=useMemo(()=>Ce(m,X),[m,X]),B=y.find(r=>r.code===P)||y[0],[L,F]=useState(t),[s,z]=useState(B),[h,f]=useState(false),[k,M]=useState(""),u=v?n:L;useEffect(()=>{let r=y.find(i=>i.code===P)||y[0];r&&r.code!==s?.code&&z(r);},[P,y,s?.code]),useEffect(()=>{if(Y&&u){let r=pe(u);r&&y.some(i=>i.code===r.code)&&r.code!==s?.code&&z(r);}},[y,Y,u,s?.code]);let G=useMemo(()=>q?he(p&&u.startsWith("+")?te(u,s):u,s):p&&u.startsWith("+")?te(u,s):u,[q,p,u,s]),re=useMemo(()=>p&&s?$(u,s):u,[u,s,p]),S=useMemo(()=>ge(u,s,O),[u,s,O]),ie=useMemo(()=>j(s,m),[s,m]),ae=useMemo(()=>me(R,k,N),[R,k,N]),C=useCallback(r=>j(r,m),[m]);useLayoutEffect(()=>{let r=V.current,i=Z.current;if(r===null||!i||typeof i.setSelectionRange!="function"||typeof document<"u"&&document.activeElement!==i)return;let ee=rn(G,r);i.setSelectionRange(ee,ee),V.current=null;},[G]);let I=useCallback(r=>{let i=ne(r);v||F(i),o?.(p?$(i,s):i,C(s));},[v,o,s,p,C]),x=useCallback(r=>{let i=K(r);i&&(z(i),o?.(p?$(u,i):u,C(i)));},[u,o,p,C]),se=useCallback(r=>{let i=K(r.code)??r;z(i),f(false),M(""),o?.(p?$(u,i):u,C(i));},[u,o,p,C]),J=useCallback(()=>{f(r=>!r),h&&M("");},[h]),ue=useCallback(()=>{f(true);},[]),le=useCallback(()=>{f(false),M("");},[]),ce=useCallback(()=>{v||F(""),o?.("",C(s));},[v,o,s,C]),l=useCallback(r=>{let i=r.target.value,ee=r.target.selectionStart??i.length,Oe=i.trim().startsWith("+")?`+${i.replace(/\D/g,"")}`:ne(i);V.current=on(i,ee),I(Oe);},[I]),A=useCallback(()=>{d?.();},[d]),b=useCallback(()=>{a?.();},[a]);return {phone:u,fullPhone:re,country:ie,isValid:S,isOpen:h,searchQuery:k,labels:E,setPhone:I,setCountry:x,toggleDropdown:J,openDropdown:ue,closeDropdown:le,setSearchQuery:M,clear:ce,inputProps:{ref:Z,value:G,onChange:l,onFocus:A,onBlur:b,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:Pe(s),"aria-invalid":u?!S:void 0},countryButtonProps:{onClick:J,"aria-expanded":h,"aria-haspopup":"listbox","aria-label":E.countryButtonAriaLabel},filteredCountries:ae,selectCountry:se}}var dn=({size:e=12})=>jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("polyline",{points:"18 15 12 9 6 15"})}),pn=({size:e=12})=>jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("polyline",{points:"6 9 12 15 18 9"})}),fn=forwardRef(function(n,t){let{value:o,defaultValue:a,onChange:d,onBlur:P,onFocus:N,inputClassName:H,selectorClassName:_,containerClassName:Y,searchable:q=true,placeholder:p,disabled:O,readOnly:m,name:X,id:v,"aria-label":Z,"aria-labelledby":V,...y}=n,R=useRef(null),E=useRef([]),[B,L]=useState(0),F=useId(),{inputProps:s,countryButtonProps:z,country:h,filteredCountries:f,isOpen:k,isValid:M,searchQuery:u,setSearchQuery:G,setCountry:re,selectCountry:S,clear:ie,openDropdown:ae,closeDropdown:C,labels:I}=Le({value:o,defaultValue:a,onChange:d,onBlur:P,onFocus:N,...y}),x=s.ref,se=useCallback(l=>{R.current=l,typeof x=="function"?x(l):x&&"current"in x&&(x.current=l);},[x]),J=useCallback(()=>{R.current?.focus();},[]),ue=useCallback(()=>{R.current?.blur();},[]),le=useCallback(l=>{S(l),L(0);},[S]),ce=useCallback((l,A,b)=>{switch(l.key){case "Enter":case " ":l.preventDefault(),S(A),L(0);break;case "ArrowDown":if(l.preventDefault(),b<f.length-1){let r=b+1;L(r),E.current[r]?.focus();}break;case "ArrowUp":if(l.preventDefault(),b>0){let r=b-1;L(r),E.current[r]?.focus();}break;case "Escape":l.preventDefault(),C();break}},[S,f.length,C]);return useEffect(()=>{if(f.length===0){B!==0&&L(0);return}B>=f.length&&L(f.length-1);},[f.length,B]),useImperativeHandle(t,()=>({focus:J,blur:ue,clear:ie,setCountry:re,getCountry:()=>h,open:ae,close:C})),jsxs("div",{className:Y,"data-valid":M,children:[jsxs("button",{...z,type:"button",className:_,disabled:O,tabIndex:O?-1:0,"aria-controls":F,children:[h?jsxs(Fragment,{children:[jsx("span",{className:"phone-input-flag",children:h.flag}),jsx("span",{className:"phone-input-dial-code",children:h.dialCode})]}):jsx("span",{className:"phone-input-placeholder",children:I.selectCountry}),jsx("span",{className:"phone-input-arrow","aria-hidden":"true",children:k?jsx(dn,{size:12}):jsx(pn,{size:12})})]}),jsx("input",{...s,ref:se,id:v,name:X,className:H,placeholder:p||s.placeholder,disabled:O,readOnly:m,"aria-label":Z,"aria-labelledby":V}),k&&jsxs("div",{className:"phone-input-dropdown",children:[q&&jsx("div",{className:"phone-input-search",children:jsx("input",{type:"text",value:u,onChange:l=>G(l.target.value),placeholder:I.countrySearchPlaceholder,autoFocus:true,"aria-controls":F,"aria-label":I.searchCountriesAriaLabel})}),jsxs("ul",{className:"phone-input-country-list",id:F,role:"listbox","aria-label":I.countryOptionsAriaLabel,children:[f.map((l,A)=>jsxs("li",{ref:b=>{E.current[A]=b;},role:"option","aria-selected":l.code===h?.code,className:`phone-input-country-option ${l.code===h?.code?"selected":""} ${A===B?"highlighted":""}`,onClick:()=>le(l),onKeyDown:b=>ce(b,l,A),onMouseEnter:()=>L(A),tabIndex:A===B?0:-1,children:[jsx("span",{className:"phone-input-flag",children:l.flag}),jsx("span",{className:"phone-input-country-name",children:be(l)}),jsx("span",{className:"phone-input-dial-code",children:l.dialCode})]},l.code)),f.length===0&&jsx("li",{className:"phone-input-no-results",children:I.noCountriesFound})]})]})]})});export{fe as DEFAULT_PHONE_INPUT_LABELS,fn as PhoneInput,$ as addDialCode,w as cleanPhone,T as countries,pe as detectCountryFromPhone,me as filterCountries,he as formatPhone,xe as getCountriesByDialCode,K as getCountryByCode,qe as getCountryByDialCode,be as getCountryDisplayName,Ne as getLocalizedCountryName,Pe as getPlaceholder,de as localizeCountries,j as localizeCountry,te as removeDialCode,Ce as resolvePhoneInputLabels,ne as unformatPhone,Le as usePhoneInput,ge as validatePhone,nn as validatePhoneLength};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/countries.ts","../src/utils.ts","../src/usePhoneInput.ts"],"names":["countries","countryMap","c","getCountryByCode","code","getCountryByDialCode","dialCode","detectCountryFromPhone","phone","cleaned","sortedCountries","a","b","country","codeWithoutPlus","cleanPhone","formatPhone","format","result","digitIndex","i","unformatPhone","formattedPhone","validatePhoneLength","lengthRules","rule","validatePhone","customValidator","addDialCode","removeDialCode","filterCountries","query","preferredCountries","lowerQuery","aPreferred","bPreferred","getPlaceholder","usePhoneInput","options","controlledValue","defaultValue","onChange","onBlur","onFocus","defaultCountry","excludeCountries","onlyCountries","autoDetect","formatOnType","includeDialCode","validator","isControlled","availableCountries","useMemo","filtered","initialCountry","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","useEffect","detected","fullPhone","isValid","filteredCountries","setPhone","useCallback","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur"],"mappings":"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","file":"index.js","sourcesContent":["export interface Country {\r\n code: string;\r\n name: string;\r\n dialCode: string;\r\n flag: string;\r\n format?: string;\r\n}\r\n\r\nexport const countries: Country[] = [\r\n { code: \"US\", name: \"United States\", dialCode: \"+1\", flag: \"🇺🇸\", format: \"(###) ###-####\" },\r\n { code: \"GB\", name: \"United Kingdom\", dialCode: \"+44\", flag: \"🇬🇧\", format: \"#### ######\" },\r\n { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"🇨🇦\", format: \"(###) ###-####\" },\r\n { code: \"AU\", name: \"Australia\", dialCode: \"+61\", flag: \"🇦🇺\", format: \"#### ### ###\" },\r\n { code: \"DE\", name: \"Germany\", dialCode: \"+49\", flag: \"🇩🇪\", format: \"#### #######\" },\r\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\", format: \"# ## ## ## ##\" },\r\n { code: \"IT\", name: \"Italy\", dialCode: \"+39\", flag: \"🇮🇹\", format: \"### ### ####\" },\r\n { code: \"ES\", name: \"Spain\", dialCode: \"+34\", flag: \"🇪🇸\", format: \"### ### ###\" },\r\n { code: \"JP\", name: \"Japan\", dialCode: \"+81\", flag: \"🇯🇵\", format: \"## #### ####\" },\r\n { code: \"CN\", name: \"China\", dialCode: \"+86\", flag: \"🇨🇳\", format: \"### #### ####\" },\r\n { code: \"IN\", name: \"India\", dialCode: \"+91\", flag: \"🇮🇳\", format: \"##### #####\" },\r\n { code: \"BR\", name: \"Brazil\", dialCode: \"+55\", flag: \"🇧🇷\", format: \"(##) #####-####\" },\r\n { code: \"MX\", name: \"Mexico\", dialCode: \"+52\", flag: \"🇲🇽\", format: \"### ### ####\" },\r\n { code: \"RU\", name: \"Russia\", dialCode: \"+7\", flag: \"🇷🇺\", format: \"(###) ###-##-##\" },\r\n { code: \"KR\", name: \"South Korea\", dialCode: \"+82\", flag: \"🇰🇷\", format: \"## #### ####\" },\r\n { code: \"NL\", name: \"Netherlands\", dialCode: \"+31\", flag: \"🇳🇱\", format: \"# ## ## ## ##\" },\r\n { code: \"BE\", name: \"Belgium\", dialCode: \"+32\", flag: \"🇧🇪\", format: \"### ## ## ##\" },\r\n { code: \"SE\", name: \"Sweden\", dialCode: \"+46\", flag: \"🇸🇪\", format: \"## ### ## ##\" },\r\n { code: \"CH\", name: \"Switzerland\", dialCode: \"+41\", flag: \"🇨🇭\", format: \"## ### ## ##\" },\r\n { code: \"AT\", name: \"Austria\", dialCode: \"+43\", flag: \"🇦🇹\", format: \"### ######\" },\r\n { code: \"PL\", name: \"Poland\", dialCode: \"+48\", flag: \"🇵🇱\", format: \"### ### ###\" },\r\n { code: \"UA\", name: \"Ukraine\", dialCode: \"+380\", flag: \"🇺🇦\", format: \"## ### ## ##\" },\r\n { code: \"TR\", name: \"Turkey\", dialCode: \"+90\", flag: \"🇹🇷\", format: \"(###) ### ## ##\" },\r\n { code: \"SA\", name: \"Saudi Arabia\", dialCode: \"+966\", flag: \"🇸🇦\", format: \"# ### ####\" },\r\n { code: \"ZA\", name: \"South Africa\", dialCode: \"+27\", flag: \"🇿🇦\", format: \"## ### ####\" },\r\n { code: \"EG\", name: \"Egypt\", dialCode: \"+20\", flag: \"🇪🇬\", format: \"### ### ####\" },\r\n { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"🇳🇬\", format: \"### ### ####\" },\r\n { code: \"KE\", name: \"Kenya\", dialCode: \"+254\", flag: \"🇰🇪\", format: \"### ######\" },\r\n { code: \"AE\", name: \"UAE\", dialCode: \"+971\", flag: \"🇦🇪\", format: \"## ### ####\" },\r\n { code: \"IL\", name: \"Israel\", dialCode: \"+972\", flag: \"🇮🇱\", format: \"## ### ####\" },\r\n { code: \"IR\", name: \"Iran\", dialCode: \"+98\", flag: \"🇮🇷\", format: \"### ### ####\" },\r\n { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"🇵🇰\", format: \"### #######\" },\r\n { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"🇧🇩\", format: \"#### ######\" },\r\n { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"🇻🇳\", format: \"## #### ###\" },\r\n { code: \"TH\", name: \"Thailand\", dialCode: \"+66\", flag: \"🇹🇭\", format: \"## ### ####\" },\r\n { code: \"MY\", name: \"Malaysia\", dialCode: \"+60\", flag: \"🇲🇾\", format: \"## ### ####\" },\r\n { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"🇵🇭\", format: \"### ### ####\" },\r\n { code: \"SG\", name: \"Singapore\", dialCode: \"+65\", flag: \"🇸🇬\", format: \"#### ####\" },\r\n { code: \"ID\", name: \"Indonesia\", dialCode: \"+62\", flag: \"🇮🇩\", format: \"### ### ####\" },\r\n { code: \"NZ\", name: \"New Zealand\", dialCode: \"+64\", flag: \"🇳🇿\", format: \"## ### ####\" },\r\n { code: \"AR\", name: \"Argentina\", dialCode: \"+54\", flag: \"🇦🇷\", format: \"## #### ####\" },\r\n { code: \"CL\", name: \"Chile\", dialCode: \"+56\", flag: \"🇨🇱\", format: \"# #### ####\" },\r\n { code: \"CO\", name: \"Colombia\", dialCode: \"+57\", flag: \"🇨🇴\", format: \"### ### ####\" },\r\n { code: \"PE\", name: \"Peru\", dialCode: \"+51\", flag: \"🇵🇪\", format: \"### ### ###\" },\r\n { code: \"VE\", name: \"Venezuela\", dialCode: \"+58\", flag: \"🇻🇪\", format: \"### ### ####\" },\r\n { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"🇵🇹\", format: \"### ### ###\" },\r\n { code: \"GR\", name: \"Greece\", dialCode: \"+30\", flag: \"🇬🇷\", format: \"### ### ####\" },\r\n { code: \"DK\", name: \"Denmark\", dialCode: \"+45\", flag: \"🇩🇰\", format: \"## ## ## ##\" },\r\n { code: \"FI\", name: \"Finland\", dialCode: \"+358\", flag: \"🇫🇮\", format: \"## ### ## ##\" },\r\n { code: \"NO\", name: \"Norway\", dialCode: \"+47\", flag: \"🇳🇴\", format: \"### ## ###\" },\r\n { code: \"IE\", name: \"Ireland\", dialCode: \"+353\", flag: \"🇮🇪\", format: \"## ### ####\" },\r\n { code: \"CZ\", name: \"Czech Republic\", dialCode: \"+420\", flag: \"🇨🇿\", format: \"### ### ###\" },\r\n { code: \"HU\", name: \"Hungary\", dialCode: \"+36\", flag: \"🇭🇺\", format: \"## ### ####\" },\r\n { code: \"RO\", name: \"Romania\", dialCode: \"+40\", flag: \"🇷🇴\", format: \"### ### ###\" },\r\n { code: \"BG\", name: \"Bulgaria\", dialCode: \"+359\", flag: \"🇧🇬\", format: \"### ### ###\" },\r\n { code: \"HR\", name: \"Croatia\", dialCode: \"+385\", flag: \"🇭🇷\", format: \"## ### ####\" },\r\n { code: \"RS\", name: \"Serbia\", dialCode: \"+381\", flag: \"🇷🇸\", format: \"## ### ####\" },\r\n { code: \"SK\", name: \"Slovakia\", dialCode: \"+421\", flag: \"🇸🇰\", format: \"### ### ###\" },\r\n { code: \"SI\", name: \"Slovenia\", dialCode: \"+386\", flag: \"🇸🇮\", format: \"## ### ###\" },\r\n { code: \"LT\", name: \"Lithuania\", dialCode: \"+370\", flag: \"🇱🇹\", format: \"### #####\" },\r\n { code: \"LV\", name: \"Latvia\", dialCode: \"+371\", flag: \"🇱🇻\", format: \"## ### ###\" },\r\n { code: \"EE\", name: \"Estonia\", dialCode: \"+372\", flag: \"🇪🇪\", format: \"#### ####\" },\r\n];\r\n\r\nexport const countryMap = new Map(countries.map(c => [c.code, c]));\r\n\r\nexport function getCountryByCode(code: string): Country | undefined {\r\n return countryMap.get(code.toUpperCase());\r\n}\r\n\r\nexport function getCountryByDialCode(dialCode: string): Country | undefined {\r\n return countries.find(c => c.dialCode === dialCode);\r\n}\r\n\r\nexport function detectCountryFromPhone(phone: string): Country | undefined {\r\n const cleaned = phone.replace(/\\D/g, '');\r\n \r\n // Try longer dial codes first\r\n const sortedCountries = [...countries].sort((a, b) => \r\n b.dialCode.length - a.dialCode.length\r\n );\r\n \r\n for (const country of sortedCountries) {\r\n const codeWithoutPlus = country.dialCode.replace('+', '');\r\n if (cleaned.startsWith(codeWithoutPlus)) {\r\n return country;\r\n }\r\n }\r\n \r\n return undefined;\r\n}\r\n","import type { Country } from './countries';\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: Country | undefined): string {\r\n if (!phone || !country?.format) return phone;\r\n \r\n const cleaned = cleanPhone(phone);\r\n const format = country.format;\r\n \r\n let result = '';\r\n let digitIndex = 0;\r\n \r\n for (let i = 0; i < format.length && digitIndex < cleaned.length; i++) {\r\n if (format[i] === '#') {\r\n result += cleaned[digitIndex];\r\n digitIndex++;\r\n } else {\r\n result += format[i];\r\n }\r\n }\r\n \r\n return result;\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 cleanPhone(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: Country | undefined): boolean {\r\n if (!phone || !country) return false;\r\n \r\n const cleaned = cleanPhone(phone);\r\n \r\n // Country-specific validation\r\n const lengthRules: Record<string, { min: number; max: number }> = {\r\n US: { min: 10, max: 10 },\r\n CA: { min: 10, max: 10 },\r\n GB: { min: 10, max: 11 },\r\n AU: { min: 9, max: 9 },\r\n DE: { min: 10, max: 11 },\r\n FR: { min: 9, max: 9 },\r\n IT: { min: 9, max: 10 },\r\n ES: { min: 9, max: 9 },\r\n JP: { min: 10, max: 11 },\r\n CN: { min: 11, max: 11 },\r\n IN: { min: 10, max: 10 },\r\n BR: { min: 11, max: 11 },\r\n MX: { min: 10, max: 10 },\r\n RU: { min: 10, max: 10 },\r\n KR: { min: 9, max: 11 },\r\n NL: { min: 9, max: 9 },\r\n BE: { min: 9, max: 9 },\r\n SE: { min: 9, max: 9 },\r\n CH: { min: 9, max: 9 },\r\n AT: { min: 9, max: 13 },\r\n PL: { min: 9, max: 9 },\r\n };\r\n \r\n const rule = country.code ? lengthRules[country.code] : undefined;\r\n \r\n if (rule) {\r\n return cleaned.length >= rule.min && cleaned.length <= rule.max;\r\n }\r\n \r\n // Default: at least 7 digits, max 15 (ITU-T E.164)\r\n return cleaned.length >= 7 && cleaned.length <= 15;\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: Country | undefined,\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);\r\n }\r\n \r\n return validatePhoneLength(phone, country);\r\n}\r\n\r\n/**\r\n * Add dial code to phone number\r\n */\r\nexport function addDialCode(phone: string, country: Country | undefined): string {\r\n if (!country) return phone;\r\n const cleaned = cleanPhone(phone);\r\n return `${country.dialCode}${cleaned}`;\r\n}\r\n\r\n/**\r\n * Remove dial code from phone number\r\n */\r\nexport function removeDialCode(phone: string, country: Country | undefined): string {\r\n if (!country) return phone;\r\n const cleaned = cleanPhone(phone);\r\n const dialCode = country.dialCode.replace('+', '');\r\n if (cleaned.startsWith(dialCode)) {\r\n return cleaned.slice(dialCode.length);\r\n }\r\n return cleaned;\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.name.localeCompare(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.code.toLowerCase().includes(lowerQuery) ||\r\n country.dialCode.includes(lowerQuery)\r\n );\r\n}\r\n\r\n/**\r\n * Get placeholder based on country format\r\n */\r\nexport function getPlaceholder(country: Country | undefined): string {\r\n if (!country?.format) return 'Phone number';\r\n return country.format.replace(/#/g, '0');\r\n}\r\n","import { useCallback, useMemo, useState, useEffect } from 'react';\r\nimport type { PhoneInputOptions, UsePhoneInputReturn } from './types';\r\nimport type { Country } from './countries';\r\nimport { countries, getCountryByCode, detectCountryFromPhone } from './countries';\r\nimport {\r\n formatPhone,\r\n unformatPhone,\r\n validatePhone,\r\n addDialCode,\r\n filterCountries,\r\n getPlaceholder,\r\n} from './utils';\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 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 onBlur,\r\n onFocus,\r\n defaultCountry = 'US',\r\n preferredCountries,\r\n excludeCountries,\r\n onlyCountries,\r\n autoDetect = true,\r\n formatOnType = true,\r\n includeDialCode = false,\r\n validator,\r\n } = options;\r\n\r\n const isControlled = controlledValue !== undefined;\r\n\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (onlyCountries?.length) {\r\n filtered = filtered.filter(c => onlyCountries.includes(c.code));\r\n }\r\n \r\n if (excludeCountries?.length) {\r\n filtered = filtered.filter(c => !excludeCountries.includes(c.code));\r\n }\r\n \r\n return filtered;\r\n }, [onlyCountries, excludeCountries]);\r\n\r\n // Initialize state\r\n const initialCountry = getCountryByCode(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 // Auto-detect country from phone\r\n useEffect(() => {\r\n if (autoDetect && phone) {\r\n const detected = detectCountryFromPhone(phone);\r\n if (detected && detected.code !== country?.code) {\r\n setCountry(detected);\r\n }\r\n }\r\n }, [phone, autoDetect, country?.code]);\r\n\r\n // Format phone number\r\n const formattedPhone = useMemo(() => {\r\n if (formatOnType) {\r\n return formatPhone(phone, country);\r\n }\r\n return phone;\r\n }, [phone, country, formatOnType]);\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(\r\n () => validatePhone(phone, country, validator),\r\n [phone, country, validator]\r\n );\r\n\r\n // Filtered countries for dropdown\r\n const filteredCountries = useMemo(\r\n () => filterCountries(availableCountries, searchQuery, preferredCountries),\r\n [availableCountries, searchQuery, preferredCountries]\r\n );\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?.(includeDialCode ? addDialCode(unformatted, country) : unformatted, country);\r\n },\r\n [isControlled, onChange, country, includeDialCode]\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 onChange?.(includeDialCode ? addDialCode(phone, newCountry) : phone, newCountry);\r\n }\r\n },\r\n [phone, onChange, includeDialCode]\r\n );\r\n\r\n // Select country from dropdown\r\n const selectCountry = useCallback(\r\n (selectedCountry: Country) => {\r\n setCountry(selectedCountry);\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n onChange?.(\r\n includeDialCode ? addDialCode(phone, selectedCountry) : phone,\r\n selectedCountry\r\n );\r\n },\r\n [phone, onChange, includeDialCode]\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?.('', country);\r\n }, [isControlled, onChange, country]);\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 unformatted = unformatPhone(rawValue);\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 return {\r\n // State\r\n phone,\r\n fullPhone,\r\n country,\r\n isValid,\r\n isOpen,\r\n searchQuery,\r\n // Actions\r\n setPhone,\r\n setCountry: setCountryByCode,\r\n toggleDropdown,\r\n openDropdown,\r\n closeDropdown,\r\n setSearchQuery,\r\n clear,\r\n // Props\r\n inputProps: {\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': !isValid,\r\n },\r\n countryButtonProps: {\r\n onClick: toggleDropdown,\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'listbox',\r\n },\r\n filteredCountries,\r\n selectCountry,\r\n };\r\n}\r\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","normalizeDialCode","root","suffix","normalizedRoot","digitsOnlySuffix","buildDialCodes","country","dialCodes","dialCode","getCountryFormat","code","example","getExampleNumber","examples","getCountryPriority","index","generatedCountries","worldCountries","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","formatPhone","AsYouType","unformatPhone","formattedPhone","validatePhoneLength","validateLength","validatePhone","customValidator","countryCode","isValidPhoneNumber","isPossiblePhoneNumber","addDialCode","removeDialCode","dialDigits","filterCountries","query","preferredCountries","lowerQuery","b","aPreferred","bPreferred","getCountryDisplayName","getPlaceholder","countDigitsBeforePosition","value","position","getCaretPositionFromDigitCount","digitCount","seenDigits","usePhoneInput","options","controlledValue","defaultValue","onChange","onBlur","onFocus","defaultCountry","excludeCountries","onlyCountries","autoDetect","formatOnType","includeDialCode","validator","labels","isControlled","inputRef","useRef","pendingCaretDigitIndexRef","availableCountries","useMemo","filtered","c","localizedCountries","resolvedLabels","initialCountry","candidate","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","useEffect","nextCountry","detected","fullPhone","isValid","localizedCountry","filteredCountries","getOutputCountry","useCallback","useLayoutEffect","nextDigitIndex","input","caretPosition","setPhone","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","rawCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur","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());\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 buildDialCodes(country: (typeof worldCountries)[number]) {\r\n const root = country.idd?.root;\r\n if (!root) {\r\n return [];\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(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 = worldCountries\r\n .filter((country) => supportedCountries.has(country.cca2 as CountryCode))\r\n .map<Country | null>((country) => {\r\n const code = country.cca2 as CountryCode;\r\n const dialCodes = buildDialCodes(country);\r\n const dialCode = `+${getCountryCallingCode(code)}`;\r\n\r\n if (!country.flag || dialCodes.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n code,\r\n name: country.name.common,\r\n dialCode,\r\n dialCodes,\r\n flag: country.flag,\r\n format: getCountryFormat(code),\r\n } satisfies Country;\r\n })\r\n .filter((country): country is Country => country !== null)\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 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 { AsYouType, isPossiblePhoneNumber, isValidPhoneNumber, validatePhoneNumberLength as validateLength, type CountryCode } from 'libphonenumber-js';\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: Country | undefined): CountryCode | undefined {\r\n return country?.code as CountryCode | undefined;\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: Country | undefined): 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: Country | undefined): 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: Country | undefined,\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);\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: Country | undefined): 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: Country | undefined): string {\r\n if (!country) return phone;\r\n\r\n const normalized = normalizePhoneInput(phone);\r\n const digits = cleanPhone(normalized);\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: Country | undefined): 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","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,\r\n getPlaceholder,\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 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 onBlur,\r\n onFocus,\r\n defaultCountry = 'US',\r\n preferredCountries,\r\n excludeCountries,\r\n onlyCountries,\r\n autoDetect = true,\r\n formatOnType = true,\r\n includeDialCode = false,\r\n validator,\r\n locale,\r\n labels,\r\n } = options;\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\r\n // Filter available countries\r\n const availableCountries = useMemo(() => {\r\n let filtered = countries;\r\n \r\n if (onlyCountries?.length) {\r\n filtered = filtered.filter(c => onlyCountries.includes(c.code));\r\n }\r\n \r\n if (excludeCountries?.length) {\r\n filtered = filtered.filter(c => !excludeCountries.includes(c.code));\r\n }\r\n \r\n return filtered;\r\n }, [onlyCountries, excludeCountries]);\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 useEffect(() => {\r\n const nextCountry = availableCountries.find((candidate) => candidate.code === defaultCountry) || availableCountries[0];\r\n if (nextCountry && nextCountry.code !== country?.code) {\r\n setCountry(nextCountry);\r\n }\r\n }, [defaultCountry, availableCountries, country?.code]);\r\n\r\n // Auto-detect country from phone\r\n useEffect(() => {\r\n if (autoDetect && 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 }\r\n }\r\n }, [availableCountries, autoDetect, phone, country?.code]);\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 // Validation\r\n const isValid = useMemo(\r\n () => validatePhone(phone, country, validator),\r\n [phone, country, validator]\r\n );\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 const getOutputCountry = useCallback(\r\n (nextCountry: Country | undefined) => localizeCountry(nextCountry, locale),\r\n [locale]\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 onChange?.(\r\n includeDialCode ? addDialCode(phone, newCountry) : phone,\r\n getOutputCountry(newCountry)\r\n );\r\n }\r\n },\r\n [phone, onChange, 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 onChange?.(\r\n includeDialCode ? addDialCode(phone, rawCountry) : phone,\r\n getOutputCountry(rawCountry)\r\n );\r\n },\r\n [phone, onChange, 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 return {\r\n // State\r\n phone,\r\n fullPhone,\r\n country: localizedCountry,\r\n isValid,\r\n isOpen,\r\n searchQuery,\r\n labels: resolvedLabels,\r\n // Actions\r\n setPhone,\r\n setCountry: setCountryByCode,\r\n toggleDropdown,\r\n openDropdown,\r\n 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 ? !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 filteredCountries,\r\n selectCountry,\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 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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@input-kit/phone",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Headless phone
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Headless phone input with full world country codes, libphonenumber formatting, and TypeScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -44,15 +44,6 @@
|
|
|
44
44
|
],
|
|
45
45
|
"author": "Harshit",
|
|
46
46
|
"license": "MIT",
|
|
47
|
-
"repository": {
|
|
48
|
-
"type": "git",
|
|
49
|
-
"url": "git+https://github.com/yourusername/input-kit.git",
|
|
50
|
-
"directory": "packages/phone"
|
|
51
|
-
},
|
|
52
|
-
"bugs": {
|
|
53
|
-
"url": "https://github.com/yourusername/input-kit/issues"
|
|
54
|
-
},
|
|
55
|
-
"homepage": "https://github.com/yourusername/input-kit/tree/main/packages/phone#readme",
|
|
56
47
|
"engines": {
|
|
57
48
|
"node": ">=18.0.0"
|
|
58
49
|
},
|
|
@@ -71,5 +62,9 @@
|
|
|
71
62
|
"tsup": "^8.3.5",
|
|
72
63
|
"typescript": "^5.7.3",
|
|
73
64
|
"vitest": "^3.0.4"
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"libphonenumber-js": "^1.12.41",
|
|
68
|
+
"world-countries": "^5.1.0"
|
|
74
69
|
}
|
|
75
70
|
}
|