@input-kit/phone 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -43
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
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')
|
|
1
|
+
'use strict';var react=require('react'),libphonenumberJs=require('libphonenumber-js'),be=require('libphonenumber-js/mobile/examples'),xe=require('world-countries'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var be__default=/*#__PURE__*/_interopDefault(be);var xe__default=/*#__PURE__*/_interopDefault(xe);var Ie=["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"],De=new Set(libphonenumberJs.getCountries());function Ne(e,t){let o=e.startsWith("+")?e:`+${e}`,n=t.replace(/\D/g,"");return `${o}${n}`}function we(e){let t=e.idd?.root;if(!t)return [];let n=(e.idd?.suffixes?.length?e.idd.suffixes:[""]).map(u=>Ne(t,u)).filter(u=>/^\+\d+$/.test(u));return Array.from(new Set(n))}function Re(e){let t=libphonenumberJs.getExampleNumber(e,be__default.default);return t?t.formatNational().replace(/\d/g,"#"):void 0}function ce(e){let t=Ie.indexOf(e);return t===-1?Number.MAX_SAFE_INTEGER:t}var Be=xe__default.default.filter(e=>De.has(e.cca2)).map(e=>{let t=e.cca2,o=we(e),n=`+${libphonenumberJs.getCountryCallingCode(t)}`;return !e.flag||o.length===0?null:{code:t,name:e.name.common,dialCode:n,dialCodes:o,flag:e.flag,format:Re(t)}}).filter(e=>e!==null).sort((e,t)=>{let o=ce(e.code)-ce(t.code);return o!==0?o:e.name.localeCompare(t.name)}),B=Be,ke=new Map(B.map(e=>[e.code,e])),Se=B.reduce((e,t)=>{for(let o of t.dialCodes){let n=e.get(o)??[];n.push(t),e.set(o,n);}return e},new Map),Ee=B.flatMap(e=>e.dialCodes.map(t=>({dialCode:t,country:e}))).sort((e,t)=>t.dialCode.length-e.dialCode.length);function Le(e){let t=e.replace(/\D/g,"");return t?`+${t}`:""}function k(e){return ke.get(e.toUpperCase())}function pe(e){return Se.get(Le(e))??[]}function $e(e){return pe(e)[0]}function re(e){let t=e.trim();if(!t)return;let o=t.startsWith("+")?`+${t.replace(/\D/g,"")}`:t.startsWith("00")?`+${t.slice(2).replace(/\D/g,"")}`:"";if(!o)return;let n=libphonenumberJs.parsePhoneNumberFromString(o);return n?.country?k(n.country):Ee.find(u=>o.startsWith(u.dialCode))?.country}function S(e){let t=e.trim(),o=R(t);return o?t.startsWith("+")?`+${o}`:o:""}function ie(e){return e?.code}function R(e){return e.replace(/\D/g,"")}function se(e,t){return e&&new libphonenumberJs.AsYouType(ie(t)).input(S(e))}function Q(e){return S(e)}function Ae(e,t){return !e||!t?false:e.trim().startsWith("+")?libphonenumberJs.validatePhoneNumberLength(S(e))===void 0:libphonenumberJs.validatePhoneNumberLength(R(e),ie(t))===void 0}function ae(e,t,o){if(!e)return false;if(o)return o(e,t);let n=S(e),u=ie(t);return u?n.startsWith("+")?libphonenumberJs.isValidPhoneNumber(n):libphonenumberJs.isValidPhoneNumber(R(n),u):libphonenumberJs.isPossiblePhoneNumber(n.startsWith("+")?n:`+${R(n)}`)}function E(e,t){if(!t)return e;let o=S(e);if(!o)return "";if(o.startsWith("+"))return o;let n=R(o);return t.dialCodes.find(c=>n.startsWith(c.replace("+","")))?`+${n}`:`${t.dialCode}${n}`}function G(e,t){if(!t)return e;let o=S(e),n=R(o);for(let u of t.dialCodes){let c=u.replace("+","");if(n.startsWith(c))return n.slice(c.length)}return n}function ue(e,t,o){let n=t.toLowerCase().trim();return n?e.filter(u=>u.name.toLowerCase().includes(n)||u.code.toLowerCase().includes(n)||u.dialCodes.some(c=>c.includes(n))):o?.length?[...e].sort((u,c)=>{let m=o.indexOf(u.code),P=o.indexOf(c.code);return m!==-1&&P!==-1?m-P:m!==-1?-1:P!==-1?1:u.name.localeCompare(c.name)}):e}function le(e){return e?.format?e.format.replace(/#/g,"0"):e?.dialCode?`${e.dialCode} 000 000 0000`:"Phone number"}function de(e={}){let{value:t,defaultValue:o="",onChange:n,onBlur:u,onFocus:c,defaultCountry:m="US",preferredCountries:P,excludeCountries:$,onlyCountries:W,autoDetect:z=true,formatOnType:U=true,includeDialCode:d=false,validator:H}=e,I=t!==void 0,g=react.useMemo(()=>{let i=B;return W?.length&&(i=i.filter(r=>W.includes(r.code))),$?.length&&(i=i.filter(r=>!$.includes(r.code))),i},[W,$]),_=k(m)||g[0],[X,V]=react.useState(o),[a,v]=react.useState(_),[f,p]=react.useState(false),[D,N]=react.useState(""),s=I?t:X;react.useEffect(()=>{let i=k(m)||g[0];i&&i.code!==a?.code&&v(i);},[m,g,a?.code]),react.useEffect(()=>{if(z&&s){let i=re(s);i&&g.some(r=>r.code===i.code)&&i.code!==a?.code&&v(i);}},[g,z,s,a?.code]);let b=react.useMemo(()=>U?se(d&&s.startsWith("+")?G(s,a):s,a):d&&s.startsWith("+")?G(s,a):s,[U,d,s,a]),C=react.useMemo(()=>d&&a?E(s,a):s,[s,a,d]),O=react.useMemo(()=>ae(s,a,H),[s,a,H]),Z=react.useMemo(()=>ue(g,D,P),[g,D,P]),A=react.useCallback(i=>{let r=Q(i);I||V(r),n?.(d?E(r,a):r,a);},[I,n,a,d]),j=react.useCallback(i=>{let r=k(i);r&&(v(r),n?.(d?E(s,r):s,r));},[s,n,d]),J=react.useCallback(i=>{v(i),p(false),N(""),n?.(d?E(s,i):s,i);},[s,n,d]),w=react.useCallback(()=>{p(i=>!i),f&&N("");},[f]),q=react.useCallback(()=>{p(true);},[]),ee=react.useCallback(()=>{p(false),N("");},[]),M=react.useCallback(()=>{I||V(""),n?.("",a);},[I,n,a]),te=react.useCallback(i=>{let r=i.target.value,y=r.trim().startsWith("+")?`+${r.replace(/\D/g,"")}`:Q(r);A(y);},[A]),ne=react.useCallback(()=>{c?.();},[c]),oe=react.useCallback(()=>{u?.();},[u]);return {phone:s,fullPhone:C,country:a,isValid:O,isOpen:f,searchQuery:D,setPhone:A,setCountry:j,toggleDropdown:w,openDropdown:q,closeDropdown:ee,setSearchQuery:N,clear:M,inputProps:{value:b,onChange:te,onFocus:ne,onBlur:oe,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:le(a),"aria-invalid":s?!O:void 0},countryButtonProps:{onClick:w,"aria-expanded":f,"aria-haspopup":"listbox"},filteredCountries:Z,selectCountry:J}}var He=({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"})}),Ve=({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"})}),Qe=react.forwardRef(function(t,o){let{value:n,defaultValue:u,onChange:c,onBlur:m,onFocus:P,inputClassName:$,selectorClassName:W,containerClassName:z,placeholder:U,disabled:d,readOnly:H,name:I,id:g,"aria-label":_,"aria-labelledby":X,...V}=t,a=react.useRef(null),v=react.useRef([]),[f,p]=react.useState(0),D=react.useId(),{inputProps:N,countryButtonProps:s,country:b,filteredCountries:C,isOpen:O,isValid:Z,searchQuery:A,setSearchQuery:j,setCountry:J,selectCountry:w,clear:q,openDropdown:ee,closeDropdown:M}=de({value:n,defaultValue:u,onChange:c,onBlur:m,onFocus:P,...V}),te=react.useCallback(()=>{a.current?.focus();},[]),ne=react.useCallback(()=>{a.current?.blur();},[]),oe=react.useCallback(r=>{w(r),p(0);},[w]),i=react.useCallback((r,y,x)=>{switch(r.key){case "Enter":case " ":r.preventDefault(),w(y),p(0);break;case "ArrowDown":if(r.preventDefault(),x<C.length-1){let F=x+1;p(F),v.current[F]?.focus();}break;case "ArrowUp":if(r.preventDefault(),x>0){let F=x-1;p(F),v.current[F]?.focus();}break;case "Escape":r.preventDefault(),M();break}},[w,C.length,M]);return react.useEffect(()=>{if(C.length===0){f!==0&&p(0);return}f>=C.length&&p(C.length-1);},[C.length,f]),react.useImperativeHandle(o,()=>({focus:te,blur:ne,clear:q,setCountry:J,getCountry:()=>b,open:ee,close:M})),jsxRuntime.jsxs("div",{className:z,"data-valid":Z,children:[jsxRuntime.jsxs("button",{...s,type:"button",className:W,disabled:d,tabIndex:d?-1:0,"aria-controls":D,children:[b?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"phone-input-flag",children:b.flag}),jsxRuntime.jsx("span",{className:"phone-input-dial-code",children:b.dialCode})]}):jsxRuntime.jsx("span",{className:"phone-input-placeholder",children:"Select"}),jsxRuntime.jsx("span",{className:"phone-input-arrow","aria-hidden":"true",children:O?jsxRuntime.jsx(He,{size:12}):jsxRuntime.jsx(Ve,{size:12})})]}),jsxRuntime.jsx("input",{...N,ref:a,id:g,name:I,className:$,placeholder:U||N.placeholder,disabled:d,readOnly:H,"aria-label":_,"aria-labelledby":X}),O&&jsxRuntime.jsxs("div",{className:"phone-input-dropdown",children:[jsxRuntime.jsx("div",{className:"phone-input-search",children:jsxRuntime.jsx("input",{type:"text",value:A,onChange:r=>j(r.target.value),placeholder:"Search countries...",autoFocus:true,"aria-controls":D,"aria-label":"Search countries"})}),jsxRuntime.jsxs("ul",{className:"phone-input-country-list",id:D,role:"listbox","aria-label":"Country options",children:[C.map((r,y)=>jsxRuntime.jsxs("li",{ref:x=>{v.current[y]=x;},role:"option","aria-selected":r.code===b?.code,className:`phone-input-country-option ${r.code===b?.code?"selected":""} ${y===f?"highlighted":""}`,onClick:()=>oe(r),onKeyDown:x=>i(x,r,y),onMouseEnter:()=>p(y),tabIndex:y===f?0:-1,children:[jsxRuntime.jsx("span",{className:"phone-input-flag",children:r.flag}),jsxRuntime.jsx("span",{className:"phone-input-country-name",children:r.name}),jsxRuntime.jsx("span",{className:"phone-input-dial-code",children:r.dialCode})]},r.code)),C.length===0&&jsxRuntime.jsx("li",{className:"phone-input-no-results",children:"No countries found"})]})]})]})});exports.PhoneInput=Qe;exports.addDialCode=E;exports.cleanPhone=R;exports.countries=B;exports.detectCountryFromPhone=re;exports.filterCountries=ue;exports.formatPhone=se;exports.getCountriesByDialCode=pe;exports.getCountryByCode=k;exports.getCountryByDialCode=$e;exports.getPlaceholder=le;exports.removeDialCode=G;exports.unformatPhone=Q;exports.usePhoneInput=de;exports.validatePhone=ae;exports.validatePhoneLength=Ae;//# 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/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","normalizeLookupDialCode","digits","getCountryByCode","getCountriesByDialCode","getCountryByDialCode","detectCountryFromPhone","phone","trimmed","normalized","parsedPhone","parsePhoneNumberFromString","entry","normalizePhoneInput","cleanPhone","getCountryCode","formatPhone","AsYouType","unformatPhone","formattedPhone","validatePhoneLength","validateLength","validatePhone","customValidator","countryCode","isValidPhoneNumber","isPossiblePhoneNumber","addDialCode","removeDialCode","dialDigits","filterCountries","query","preferredCountries","lowerQuery","a","b","aPreferred","bPreferred","getPlaceholder","usePhoneInput","options","controlledValue","defaultValue","onChange","onBlur","onFocus","defaultCountry","excludeCountries","onlyCountries","autoDetect","formatOnType","includeDialCode","validator","isControlled","availableCountries","useMemo","filtered","c","initialCountry","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","useEffect","nextCountry","detected","candidate","fullPhone","isValid","filteredCountries","setPhone","useCallback","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur","ChevronUpIcon","size","jsx","ChevronDownIcon","PhoneInput","forwardRef","props","ref","value","inputClassName","selectorClassName","containerClassName","placeholder","disabled","readOnly","name","id","ariaLabel","ariaLabelledBy","inputRef","useRef","optionRefs","highlightedIndex","setHighlightedIndex","listboxId","useId","inputProps","countryButtonProps","focus","blur","handleCountryClick","handleCountryKeyDown","e","nextIndex","useImperativeHandle","jsxs","Fragment","element"],"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}\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\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 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 { 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 (!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.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.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.dialCodes.some((dialCode) => 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 country?.dialCode ? `${country.dialCode} 000 000 0000` : '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 removeDialCode,\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 useEffect(() => {\r\n const nextCountry = getCountryByCode(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 // 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 = rawValue.trim().startsWith('+') ? `+${rawValue.replace(/\\D/g, '')}` : 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': phone ? !isValid : undefined,\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","import { forwardRef, useCallback, useEffect, useId, useImperativeHandle, useRef, useState } from 'react';\nimport { usePhoneInput } from './usePhoneInput';\nimport type { PhoneInputProps } from './types';\nimport type { Country } from './countries';\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 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);\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 } = usePhoneInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n ...options,\n });\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\">Select</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={inputRef}\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 <div className=\"phone-input-search\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search countries...\"\n autoFocus\n aria-controls={listboxId}\n aria-label=\"Search countries\"\n />\n </div>\n\n {/* Country List */}\n <ul className=\"phone-input-country-list\" id={listboxId} role=\"listbox\" aria-label=\"Country options\">\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\">{c.name}</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\">No countries found</li>\n )}\n </ul>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default PhoneInput;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
1
2
|
import { InputHTMLAttributes } 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;
|
|
9
11
|
}
|
|
10
12
|
declare const countries: Country[];
|
|
11
13
|
declare function getCountryByCode(code: string): Country | undefined;
|
|
14
|
+
declare function getCountriesByDialCode(dialCode: string): Country[];
|
|
12
15
|
declare function getCountryByDialCode(dialCode: string): Country | undefined;
|
|
13
16
|
declare function detectCountryFromPhone(phone: string): Country | undefined;
|
|
14
17
|
|
|
@@ -76,6 +79,17 @@ declare function usePhoneInput(options?: PhoneInputOptions & {
|
|
|
76
79
|
onFocus?: () => void;
|
|
77
80
|
}): UsePhoneInputReturn;
|
|
78
81
|
|
|
82
|
+
interface PhoneInputRef {
|
|
83
|
+
focus: () => void;
|
|
84
|
+
blur: () => void;
|
|
85
|
+
clear: () => void;
|
|
86
|
+
setCountry: (countryCode: string) => void;
|
|
87
|
+
getCountry: () => Country | undefined;
|
|
88
|
+
open: () => void;
|
|
89
|
+
close: () => void;
|
|
90
|
+
}
|
|
91
|
+
declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<PhoneInputRef>>;
|
|
92
|
+
|
|
79
93
|
declare function cleanPhone(phone: string): string;
|
|
80
94
|
declare function formatPhone(phone: string, country: Country | undefined): string;
|
|
81
95
|
declare function unformatPhone(formattedPhone: string): string;
|
|
@@ -86,4 +100,4 @@ declare function removeDialCode(phone: string, country: Country | undefined): st
|
|
|
86
100
|
declare function filterCountries(countries: Country[], query: string, preferredCountries?: string[]): Country[];
|
|
87
101
|
declare function getPlaceholder(country: Country | undefined): string;
|
|
88
102
|
|
|
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 };
|
|
103
|
+
export { type Country, PhoneInput, type PhoneInputActions, type PhoneInputOptions, type PhoneInputProps, type PhoneInputRef, type PhoneInputState, type UsePhoneInputReturn, addDialCode, cleanPhone, countries, detectCountryFromPhone, filterCountries, formatPhone, getCountriesByDialCode, getCountryByCode, getCountryByDialCode, getPlaceholder, removeDialCode, unformatPhone, usePhoneInput, validatePhone, validatePhoneLength };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
1
2
|
import { InputHTMLAttributes } 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;
|
|
9
11
|
}
|
|
10
12
|
declare const countries: Country[];
|
|
11
13
|
declare function getCountryByCode(code: string): Country | undefined;
|
|
14
|
+
declare function getCountriesByDialCode(dialCode: string): Country[];
|
|
12
15
|
declare function getCountryByDialCode(dialCode: string): Country | undefined;
|
|
13
16
|
declare function detectCountryFromPhone(phone: string): Country | undefined;
|
|
14
17
|
|
|
@@ -76,6 +79,17 @@ declare function usePhoneInput(options?: PhoneInputOptions & {
|
|
|
76
79
|
onFocus?: () => void;
|
|
77
80
|
}): UsePhoneInputReturn;
|
|
78
81
|
|
|
82
|
+
interface PhoneInputRef {
|
|
83
|
+
focus: () => void;
|
|
84
|
+
blur: () => void;
|
|
85
|
+
clear: () => void;
|
|
86
|
+
setCountry: (countryCode: string) => void;
|
|
87
|
+
getCountry: () => Country | undefined;
|
|
88
|
+
open: () => void;
|
|
89
|
+
close: () => void;
|
|
90
|
+
}
|
|
91
|
+
declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<PhoneInputRef>>;
|
|
92
|
+
|
|
79
93
|
declare function cleanPhone(phone: string): string;
|
|
80
94
|
declare function formatPhone(phone: string, country: Country | undefined): string;
|
|
81
95
|
declare function unformatPhone(formattedPhone: string): string;
|
|
@@ -86,4 +100,4 @@ declare function removeDialCode(phone: string, country: Country | undefined): st
|
|
|
86
100
|
declare function filterCountries(countries: Country[], query: string, preferredCountries?: string[]): Country[];
|
|
87
101
|
declare function getPlaceholder(country: Country | undefined): string;
|
|
88
102
|
|
|
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 };
|
|
103
|
+
export { type Country, PhoneInput, type PhoneInputActions, type PhoneInputOptions, type PhoneInputProps, type PhoneInputRef, type PhoneInputState, type UsePhoneInputReturn, addDialCode, cleanPhone, countries, detectCountryFromPhone, filterCountries, formatPhone, getCountriesByDialCode, getCountryByCode, getCountryByDialCode, getPlaceholder, removeDialCode, unformatPhone, usePhoneInput, validatePhone, validatePhoneLength };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {forwardRef,useRef,useState,useId,useCallback,useEffect,useImperativeHandle,useMemo}from'react';import {getCountries,getCountryCallingCode,getExampleNumber,parsePhoneNumberFromString,AsYouType,isValidPhoneNumber,isPossiblePhoneNumber,validatePhoneNumberLength}from'libphonenumber-js';import be from'libphonenumber-js/mobile/examples';import xe from'world-countries';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Ie=["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"],De=new Set(getCountries());function Ne(e,t){let o=e.startsWith("+")?e:`+${e}`,n=t.replace(/\D/g,"");return `${o}${n}`}function we(e){let t=e.idd?.root;if(!t)return [];let n=(e.idd?.suffixes?.length?e.idd.suffixes:[""]).map(u=>Ne(t,u)).filter(u=>/^\+\d+$/.test(u));return Array.from(new Set(n))}function Re(e){let t=getExampleNumber(e,be);return t?t.formatNational().replace(/\d/g,"#"):void 0}function ce(e){let t=Ie.indexOf(e);return t===-1?Number.MAX_SAFE_INTEGER:t}var Be=xe.filter(e=>De.has(e.cca2)).map(e=>{let t=e.cca2,o=we(e),n=`+${getCountryCallingCode(t)}`;return !e.flag||o.length===0?null:{code:t,name:e.name.common,dialCode:n,dialCodes:o,flag:e.flag,format:Re(t)}}).filter(e=>e!==null).sort((e,t)=>{let o=ce(e.code)-ce(t.code);return o!==0?o:e.name.localeCompare(t.name)}),B=Be,ke=new Map(B.map(e=>[e.code,e])),Se=B.reduce((e,t)=>{for(let o of t.dialCodes){let n=e.get(o)??[];n.push(t),e.set(o,n);}return e},new Map),Ee=B.flatMap(e=>e.dialCodes.map(t=>({dialCode:t,country:e}))).sort((e,t)=>t.dialCode.length-e.dialCode.length);function Le(e){let t=e.replace(/\D/g,"");return t?`+${t}`:""}function k(e){return ke.get(e.toUpperCase())}function pe(e){return Se.get(Le(e))??[]}function $e(e){return pe(e)[0]}function re(e){let t=e.trim();if(!t)return;let o=t.startsWith("+")?`+${t.replace(/\D/g,"")}`:t.startsWith("00")?`+${t.slice(2).replace(/\D/g,"")}`:"";if(!o)return;let n=parsePhoneNumberFromString(o);return n?.country?k(n.country):Ee.find(u=>o.startsWith(u.dialCode))?.country}function S(e){let t=e.trim(),o=R(t);return o?t.startsWith("+")?`+${o}`:o:""}function ie(e){return e?.code}function R(e){return e.replace(/\D/g,"")}function se(e,t){return e&&new AsYouType(ie(t)).input(S(e))}function Q(e){return S(e)}function Ae(e,t){return !e||!t?false:e.trim().startsWith("+")?validatePhoneNumberLength(S(e))===void 0:validatePhoneNumberLength(R(e),ie(t))===void 0}function ae(e,t,o){if(!e)return false;if(o)return o(e,t);let n=S(e),u=ie(t);return u?n.startsWith("+")?isValidPhoneNumber(n):isValidPhoneNumber(R(n),u):isPossiblePhoneNumber(n.startsWith("+")?n:`+${R(n)}`)}function E(e,t){if(!t)return e;let o=S(e);if(!o)return "";if(o.startsWith("+"))return o;let n=R(o);return t.dialCodes.find(c=>n.startsWith(c.replace("+","")))?`+${n}`:`${t.dialCode}${n}`}function G(e,t){if(!t)return e;let o=S(e),n=R(o);for(let u of t.dialCodes){let c=u.replace("+","");if(n.startsWith(c))return n.slice(c.length)}return n}function ue(e,t,o){let n=t.toLowerCase().trim();return n?e.filter(u=>u.name.toLowerCase().includes(n)||u.code.toLowerCase().includes(n)||u.dialCodes.some(c=>c.includes(n))):o?.length?[...e].sort((u,c)=>{let m=o.indexOf(u.code),P=o.indexOf(c.code);return m!==-1&&P!==-1?m-P:m!==-1?-1:P!==-1?1:u.name.localeCompare(c.name)}):e}function le(e){return e?.format?e.format.replace(/#/g,"0"):e?.dialCode?`${e.dialCode} 000 000 0000`:"Phone number"}function de(e={}){let{value:t,defaultValue:o="",onChange:n,onBlur:u,onFocus:c,defaultCountry:m="US",preferredCountries:P,excludeCountries:$,onlyCountries:W,autoDetect:z=true,formatOnType:U=true,includeDialCode:d=false,validator:H}=e,I=t!==void 0,g=useMemo(()=>{let i=B;return W?.length&&(i=i.filter(r=>W.includes(r.code))),$?.length&&(i=i.filter(r=>!$.includes(r.code))),i},[W,$]),_=k(m)||g[0],[X,V]=useState(o),[a,v]=useState(_),[f,p]=useState(false),[D,N]=useState(""),s=I?t:X;useEffect(()=>{let i=k(m)||g[0];i&&i.code!==a?.code&&v(i);},[m,g,a?.code]),useEffect(()=>{if(z&&s){let i=re(s);i&&g.some(r=>r.code===i.code)&&i.code!==a?.code&&v(i);}},[g,z,s,a?.code]);let b=useMemo(()=>U?se(d&&s.startsWith("+")?G(s,a):s,a):d&&s.startsWith("+")?G(s,a):s,[U,d,s,a]),C=useMemo(()=>d&&a?E(s,a):s,[s,a,d]),O=useMemo(()=>ae(s,a,H),[s,a,H]),Z=useMemo(()=>ue(g,D,P),[g,D,P]),A=useCallback(i=>{let r=Q(i);I||V(r),n?.(d?E(r,a):r,a);},[I,n,a,d]),j=useCallback(i=>{let r=k(i);r&&(v(r),n?.(d?E(s,r):s,r));},[s,n,d]),J=useCallback(i=>{v(i),p(false),N(""),n?.(d?E(s,i):s,i);},[s,n,d]),w=useCallback(()=>{p(i=>!i),f&&N("");},[f]),q=useCallback(()=>{p(true);},[]),ee=useCallback(()=>{p(false),N("");},[]),M=useCallback(()=>{I||V(""),n?.("",a);},[I,n,a]),te=useCallback(i=>{let r=i.target.value,y=r.trim().startsWith("+")?`+${r.replace(/\D/g,"")}`:Q(r);A(y);},[A]),ne=useCallback(()=>{c?.();},[c]),oe=useCallback(()=>{u?.();},[u]);return {phone:s,fullPhone:C,country:a,isValid:O,isOpen:f,searchQuery:D,setPhone:A,setCountry:j,toggleDropdown:w,openDropdown:q,closeDropdown:ee,setSearchQuery:N,clear:M,inputProps:{value:b,onChange:te,onFocus:ne,onBlur:oe,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:le(a),"aria-invalid":s?!O:void 0},countryButtonProps:{onClick:w,"aria-expanded":f,"aria-haspopup":"listbox"},filteredCountries:Z,selectCountry:J}}var He=({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"})}),Ve=({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"})}),Qe=forwardRef(function(t,o){let{value:n,defaultValue:u,onChange:c,onBlur:m,onFocus:P,inputClassName:$,selectorClassName:W,containerClassName:z,placeholder:U,disabled:d,readOnly:H,name:I,id:g,"aria-label":_,"aria-labelledby":X,...V}=t,a=useRef(null),v=useRef([]),[f,p]=useState(0),D=useId(),{inputProps:N,countryButtonProps:s,country:b,filteredCountries:C,isOpen:O,isValid:Z,searchQuery:A,setSearchQuery:j,setCountry:J,selectCountry:w,clear:q,openDropdown:ee,closeDropdown:M}=de({value:n,defaultValue:u,onChange:c,onBlur:m,onFocus:P,...V}),te=useCallback(()=>{a.current?.focus();},[]),ne=useCallback(()=>{a.current?.blur();},[]),oe=useCallback(r=>{w(r),p(0);},[w]),i=useCallback((r,y,x)=>{switch(r.key){case "Enter":case " ":r.preventDefault(),w(y),p(0);break;case "ArrowDown":if(r.preventDefault(),x<C.length-1){let F=x+1;p(F),v.current[F]?.focus();}break;case "ArrowUp":if(r.preventDefault(),x>0){let F=x-1;p(F),v.current[F]?.focus();}break;case "Escape":r.preventDefault(),M();break}},[w,C.length,M]);return useEffect(()=>{if(C.length===0){f!==0&&p(0);return}f>=C.length&&p(C.length-1);},[C.length,f]),useImperativeHandle(o,()=>({focus:te,blur:ne,clear:q,setCountry:J,getCountry:()=>b,open:ee,close:M})),jsxs("div",{className:z,"data-valid":Z,children:[jsxs("button",{...s,type:"button",className:W,disabled:d,tabIndex:d?-1:0,"aria-controls":D,children:[b?jsxs(Fragment,{children:[jsx("span",{className:"phone-input-flag",children:b.flag}),jsx("span",{className:"phone-input-dial-code",children:b.dialCode})]}):jsx("span",{className:"phone-input-placeholder",children:"Select"}),jsx("span",{className:"phone-input-arrow","aria-hidden":"true",children:O?jsx(He,{size:12}):jsx(Ve,{size:12})})]}),jsx("input",{...N,ref:a,id:g,name:I,className:$,placeholder:U||N.placeholder,disabled:d,readOnly:H,"aria-label":_,"aria-labelledby":X}),O&&jsxs("div",{className:"phone-input-dropdown",children:[jsx("div",{className:"phone-input-search",children:jsx("input",{type:"text",value:A,onChange:r=>j(r.target.value),placeholder:"Search countries...",autoFocus:true,"aria-controls":D,"aria-label":"Search countries"})}),jsxs("ul",{className:"phone-input-country-list",id:D,role:"listbox","aria-label":"Country options",children:[C.map((r,y)=>jsxs("li",{ref:x=>{v.current[y]=x;},role:"option","aria-selected":r.code===b?.code,className:`phone-input-country-option ${r.code===b?.code?"selected":""} ${y===f?"highlighted":""}`,onClick:()=>oe(r),onKeyDown:x=>i(x,r,y),onMouseEnter:()=>p(y),tabIndex:y===f?0:-1,children:[jsx("span",{className:"phone-input-flag",children:r.flag}),jsx("span",{className:"phone-input-country-name",children:r.name}),jsx("span",{className:"phone-input-dial-code",children:r.dialCode})]},r.code)),C.length===0&&jsx("li",{className:"phone-input-no-results",children:"No countries found"})]})]})]})});export{Qe as PhoneInput,E as addDialCode,R as cleanPhone,B as countries,re as detectCountryFromPhone,ue as filterCountries,se as formatPhone,pe as getCountriesByDialCode,k as getCountryByCode,$e as getCountryByDialCode,le as getPlaceholder,G as removeDialCode,Q as unformatPhone,de as usePhoneInput,ae as validatePhone,Ae 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/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","normalizeLookupDialCode","digits","getCountryByCode","getCountriesByDialCode","getCountryByDialCode","detectCountryFromPhone","phone","trimmed","normalized","parsedPhone","parsePhoneNumberFromString","entry","normalizePhoneInput","cleanPhone","getCountryCode","formatPhone","AsYouType","unformatPhone","formattedPhone","validatePhoneLength","validateLength","validatePhone","customValidator","countryCode","isValidPhoneNumber","isPossiblePhoneNumber","addDialCode","removeDialCode","dialDigits","filterCountries","query","preferredCountries","lowerQuery","a","b","aPreferred","bPreferred","getPlaceholder","usePhoneInput","options","controlledValue","defaultValue","onChange","onBlur","onFocus","defaultCountry","excludeCountries","onlyCountries","autoDetect","formatOnType","includeDialCode","validator","isControlled","availableCountries","useMemo","filtered","c","initialCountry","internalPhone","setInternalPhone","useState","setCountry","isOpen","setIsOpen","searchQuery","setSearchQuery","useEffect","nextCountry","detected","candidate","fullPhone","isValid","filteredCountries","setPhone","useCallback","newPhone","unformatted","setCountryByCode","newCountry","selectCountry","selectedCountry","toggleDropdown","prev","openDropdown","closeDropdown","clear","handleInputChange","event","rawValue","handleFocus","handleBlur","ChevronUpIcon","size","jsx","ChevronDownIcon","PhoneInput","forwardRef","props","ref","value","inputClassName","selectorClassName","containerClassName","placeholder","disabled","readOnly","name","id","ariaLabel","ariaLabelledBy","inputRef","useRef","optionRefs","highlightedIndex","setHighlightedIndex","listboxId","useId","inputProps","countryButtonProps","focus","blur","handleCountryClick","handleCountryKeyDown","e","nextIndex","useImperativeHandle","jsxs","Fragment","element"],"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}\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\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 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 { 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 (!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.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.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.dialCodes.some((dialCode) => 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 country?.dialCode ? `${country.dialCode} 000 000 0000` : '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 removeDialCode,\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 useEffect(() => {\r\n const nextCountry = getCountryByCode(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 // 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 = rawValue.trim().startsWith('+') ? `+${rawValue.replace(/\\D/g, '')}` : 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': phone ? !isValid : undefined,\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","import { forwardRef, useCallback, useEffect, useId, useImperativeHandle, useRef, useState } from 'react';\nimport { usePhoneInput } from './usePhoneInput';\nimport type { PhoneInputProps } from './types';\nimport type { Country } from './countries';\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 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);\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 } = usePhoneInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n ...options,\n });\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\">Select</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={inputRef}\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 <div className=\"phone-input-search\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search countries...\"\n autoFocus\n aria-controls={listboxId}\n aria-label=\"Search countries\"\n />\n </div>\n\n {/* Country List */}\n <ul className=\"phone-input-country-list\" id={listboxId} role=\"listbox\" aria-label=\"Country options\">\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\">{c.name}</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\">No countries found</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.1",
|
|
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",
|
|
@@ -71,5 +71,9 @@
|
|
|
71
71
|
"tsup": "^8.3.5",
|
|
72
72
|
"typescript": "^5.7.3",
|
|
73
73
|
"vitest": "^3.0.4"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"libphonenumber-js": "^1.12.41",
|
|
77
|
+
"world-countries": "^5.1.0"
|
|
74
78
|
}
|
|
75
79
|
}
|