@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 CHANGED
@@ -1,17 +1,15 @@
1
1
  # @input-kit/phone
2
2
 
3
- Phone number input component for React with country selection, formatting, and validation.
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
- - **70+ Countries** - Built-in country data with flags
8
- - **Headless** - Bring your own styles
9
- - **Auto-format** - Format as user types
10
- - **Auto-detect** - Detect country from phone number
11
- - **Search** - Search countries by name or code
12
- - **Accessible** - ARIA attributes and keyboard support
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, countries } from '@input-kit/phone';
42
+ import { usePhoneInput } from '@input-kit/phone';
26
43
 
27
- function MyComponent() {
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, country) => console.log(phone, country),
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(c => (
50
- <button key={c.code} onClick={() => selectCountry(c)}>
51
- {c.flag} {c.name} {c.dialCode}
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
- ## API Reference
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
- ### `usePhoneInput(options)`
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
- #### Options
108
+ ## `usePhoneInput(options)`
69
109
 
70
110
  | Option | Type | Default | Description |
71
- |--------|------|---------|-------------|
72
- | `defaultCountry` | `string` | `'US'` | Default country code |
73
- | `preferredCountries` | `string[]` | - | Show these countries first |
74
- | `excludeCountries` | `string[]` | - | Exclude these countries |
75
- | `onlyCountries` | `string[]` | - | Only show these countries |
76
- | `searchable` | `boolean` | `true` | Enable country search |
77
- | `autoDetect` | `boolean` | `true` | Auto-detect country from phone |
78
- | `formatOnType` | `boolean` | `true` | Format as user types |
79
- | `includeDialCode` | `boolean` | `false` | Include dial code in value |
80
-
81
- #### Returns
82
-
83
- | Property | Type | Description |
84
- |----------|------|-------------|
85
- | `phone` | `string` | Phone number (without dial code) |
86
- | `fullPhone` | `string` | Phone with dial code |
87
- | `country` | `Country` | Selected country |
88
- | `isValid` | `boolean` | Whether phone is valid |
89
- | `isOpen` | `boolean` | Whether dropdown is open |
90
- | `filteredCountries` | `Country[]` | Filtered country list |
91
- | `inputProps` | `object` | Props for input element |
92
- | `countryButtonProps` | `object` | Props for country button |
111
+ |------|------|---------|-------------|
112
+ | `defaultCountry` | `string` | `'US'` | Default selected country |
113
+ | `preferredCountries` | `string[]` | - | Countries shown first in search results |
114
+ | `excludeCountries` | `string[]` | - | Countries to exclude |
115
+ | `onlyCountries` | `string[]` | - | Restrict selection to these countries |
116
+ | `autoDetect` | `boolean` | `true` | Detect country from international numbers |
117
+ | `formatOnType` | `boolean` | `true` | Apply live formatting |
118
+ | `includeDialCode` | `boolean` | `false` | Return values with dial code included |
119
+ | `validator` | `(phone, country) => boolean` | - | Custom validation override |
120
+
121
+ Important returned fields:
122
+
123
+ - `phone`
124
+ - `fullPhone`
125
+ - `country`
126
+ - `isValid`
127
+ - `isOpen`
128
+ - `searchQuery`
129
+ - `filteredCountries`
130
+ - `inputProps`
131
+ - `countryButtonProps`
132
+ - `setPhone()`
133
+ - `setCountry()`
134
+ - `selectCountry()`
135
+ - `openDropdown()`
136
+ - `closeDropdown()`
137
+ - `toggleDropdown()`
138
+ - `setSearchQuery()`
139
+ - `clear()`
140
+
141
+ ## Notes
142
+
143
+ - Country coverage now comes from current `libphonenumber-js` supported regions instead of a short hand-maintained list.
144
+ - Formatting and validation behavior follows `libphonenumber-js`, similar to libraries like `react-phone-number-input`.
145
+ - The selector keeps a separate country button and number field, which matches the common multi-country pattern used by larger phone-input packages.
93
146
 
94
147
  ## License
95
148
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var react=require('react');var C=[{code:"US",name:"United States",dialCode:"+1",flag:"\u{1F1FA}\u{1F1F8}",format:"(###) ###-####"},{code:"GB",name:"United Kingdom",dialCode:"+44",flag:"\u{1F1EC}\u{1F1E7}",format:"#### ######"},{code:"CA",name:"Canada",dialCode:"+1",flag:"\u{1F1E8}\u{1F1E6}",format:"(###) ###-####"},{code:"AU",name:"Australia",dialCode:"+61",flag:"\u{1F1E6}\u{1F1FA}",format:"#### ### ###"},{code:"DE",name:"Germany",dialCode:"+49",flag:"\u{1F1E9}\u{1F1EA}",format:"#### #######"},{code:"FR",name:"France",dialCode:"+33",flag:"\u{1F1EB}\u{1F1F7}",format:"# ## ## ## ##"},{code:"IT",name:"Italy",dialCode:"+39",flag:"\u{1F1EE}\u{1F1F9}",format:"### ### ####"},{code:"ES",name:"Spain",dialCode:"+34",flag:"\u{1F1EA}\u{1F1F8}",format:"### ### ###"},{code:"JP",name:"Japan",dialCode:"+81",flag:"\u{1F1EF}\u{1F1F5}",format:"## #### ####"},{code:"CN",name:"China",dialCode:"+86",flag:"\u{1F1E8}\u{1F1F3}",format:"### #### ####"},{code:"IN",name:"India",dialCode:"+91",flag:"\u{1F1EE}\u{1F1F3}",format:"##### #####"},{code:"BR",name:"Brazil",dialCode:"+55",flag:"\u{1F1E7}\u{1F1F7}",format:"(##) #####-####"},{code:"MX",name:"Mexico",dialCode:"+52",flag:"\u{1F1F2}\u{1F1FD}",format:"### ### ####"},{code:"RU",name:"Russia",dialCode:"+7",flag:"\u{1F1F7}\u{1F1FA}",format:"(###) ###-##-##"},{code:"KR",name:"South Korea",dialCode:"+82",flag:"\u{1F1F0}\u{1F1F7}",format:"## #### ####"},{code:"NL",name:"Netherlands",dialCode:"+31",flag:"\u{1F1F3}\u{1F1F1}",format:"# ## ## ## ##"},{code:"BE",name:"Belgium",dialCode:"+32",flag:"\u{1F1E7}\u{1F1EA}",format:"### ## ## ##"},{code:"SE",name:"Sweden",dialCode:"+46",flag:"\u{1F1F8}\u{1F1EA}",format:"## ### ## ##"},{code:"CH",name:"Switzerland",dialCode:"+41",flag:"\u{1F1E8}\u{1F1ED}",format:"## ### ## ##"},{code:"AT",name:"Austria",dialCode:"+43",flag:"\u{1F1E6}\u{1F1F9}",format:"### ######"},{code:"PL",name:"Poland",dialCode:"+48",flag:"\u{1F1F5}\u{1F1F1}",format:"### ### ###"},{code:"UA",name:"Ukraine",dialCode:"+380",flag:"\u{1F1FA}\u{1F1E6}",format:"## ### ## ##"},{code:"TR",name:"Turkey",dialCode:"+90",flag:"\u{1F1F9}\u{1F1F7}",format:"(###) ### ## ##"},{code:"SA",name:"Saudi Arabia",dialCode:"+966",flag:"\u{1F1F8}\u{1F1E6}",format:"# ### ####"},{code:"ZA",name:"South Africa",dialCode:"+27",flag:"\u{1F1FF}\u{1F1E6}",format:"## ### ####"},{code:"EG",name:"Egypt",dialCode:"+20",flag:"\u{1F1EA}\u{1F1EC}",format:"### ### ####"},{code:"NG",name:"Nigeria",dialCode:"+234",flag:"\u{1F1F3}\u{1F1EC}",format:"### ### ####"},{code:"KE",name:"Kenya",dialCode:"+254",flag:"\u{1F1F0}\u{1F1EA}",format:"### ######"},{code:"AE",name:"UAE",dialCode:"+971",flag:"\u{1F1E6}\u{1F1EA}",format:"## ### ####"},{code:"IL",name:"Israel",dialCode:"+972",flag:"\u{1F1EE}\u{1F1F1}",format:"## ### ####"},{code:"IR",name:"Iran",dialCode:"+98",flag:"\u{1F1EE}\u{1F1F7}",format:"### ### ####"},{code:"PK",name:"Pakistan",dialCode:"+92",flag:"\u{1F1F5}\u{1F1F0}",format:"### #######"},{code:"BD",name:"Bangladesh",dialCode:"+880",flag:"\u{1F1E7}\u{1F1E9}",format:"#### ######"},{code:"VN",name:"Vietnam",dialCode:"+84",flag:"\u{1F1FB}\u{1F1F3}",format:"## #### ###"},{code:"TH",name:"Thailand",dialCode:"+66",flag:"\u{1F1F9}\u{1F1ED}",format:"## ### ####"},{code:"MY",name:"Malaysia",dialCode:"+60",flag:"\u{1F1F2}\u{1F1FE}",format:"## ### ####"},{code:"PH",name:"Philippines",dialCode:"+63",flag:"\u{1F1F5}\u{1F1ED}",format:"### ### ####"},{code:"SG",name:"Singapore",dialCode:"+65",flag:"\u{1F1F8}\u{1F1EC}",format:"#### ####"},{code:"ID",name:"Indonesia",dialCode:"+62",flag:"\u{1F1EE}\u{1F1E9}",format:"### ### ####"},{code:"NZ",name:"New Zealand",dialCode:"+64",flag:"\u{1F1F3}\u{1F1FF}",format:"## ### ####"},{code:"AR",name:"Argentina",dialCode:"+54",flag:"\u{1F1E6}\u{1F1F7}",format:"## #### ####"},{code:"CL",name:"Chile",dialCode:"+56",flag:"\u{1F1E8}\u{1F1F1}",format:"# #### ####"},{code:"CO",name:"Colombia",dialCode:"+57",flag:"\u{1F1E8}\u{1F1F4}",format:"### ### ####"},{code:"PE",name:"Peru",dialCode:"+51",flag:"\u{1F1F5}\u{1F1EA}",format:"### ### ###"},{code:"VE",name:"Venezuela",dialCode:"+58",flag:"\u{1F1FB}\u{1F1EA}",format:"### ### ####"},{code:"PT",name:"Portugal",dialCode:"+351",flag:"\u{1F1F5}\u{1F1F9}",format:"### ### ###"},{code:"GR",name:"Greece",dialCode:"+30",flag:"\u{1F1EC}\u{1F1F7}",format:"### ### ####"},{code:"DK",name:"Denmark",dialCode:"+45",flag:"\u{1F1E9}\u{1F1F0}",format:"## ## ## ##"},{code:"FI",name:"Finland",dialCode:"+358",flag:"\u{1F1EB}\u{1F1EE}",format:"## ### ## ##"},{code:"NO",name:"Norway",dialCode:"+47",flag:"\u{1F1F3}\u{1F1F4}",format:"### ## ###"},{code:"IE",name:"Ireland",dialCode:"+353",flag:"\u{1F1EE}\u{1F1EA}",format:"## ### ####"},{code:"CZ",name:"Czech Republic",dialCode:"+420",flag:"\u{1F1E8}\u{1F1FF}",format:"### ### ###"},{code:"HU",name:"Hungary",dialCode:"+36",flag:"\u{1F1ED}\u{1F1FA}",format:"## ### ####"},{code:"RO",name:"Romania",dialCode:"+40",flag:"\u{1F1F7}\u{1F1F4}",format:"### ### ###"},{code:"BG",name:"Bulgaria",dialCode:"+359",flag:"\u{1F1E7}\u{1F1EC}",format:"### ### ###"},{code:"HR",name:"Croatia",dialCode:"+385",flag:"\u{1F1ED}\u{1F1F7}",format:"## ### ####"},{code:"RS",name:"Serbia",dialCode:"+381",flag:"\u{1F1F7}\u{1F1F8}",format:"## ### ####"},{code:"SK",name:"Slovakia",dialCode:"+421",flag:"\u{1F1F8}\u{1F1F0}",format:"### ### ###"},{code:"SI",name:"Slovenia",dialCode:"+386",flag:"\u{1F1F8}\u{1F1EE}",format:"## ### ###"},{code:"LT",name:"Lithuania",dialCode:"+370",flag:"\u{1F1F1}\u{1F1F9}",format:"### #####"},{code:"LV",name:"Latvia",dialCode:"+371",flag:"\u{1F1F1}\u{1F1FB}",format:"## ### ###"},{code:"EE",name:"Estonia",dialCode:"+372",flag:"\u{1F1EA}\u{1F1EA}",format:"#### ####"}],ne=new Map(C.map(e=>[e.code,e]));function S(e){return ne.get(e.toUpperCase())}function te(e){return C.find(a=>a.dialCode===e)}function w(e){let a=e.replace(/\D/g,""),n=[...C].sort((o,t)=>t.dialCode.length-o.dialCode.length);for(let o of n){let t=o.dialCode.replace("+","");if(a.startsWith(t))return o}}function g(e){return e.replace(/\D/g,"")}function N(e,a){if(!e||!a?.format)return e;let n=g(e),o=a.format,t="",u=0;for(let f=0;f<o.length&&u<n.length;f++)o[f]==="#"?(t+=n[u],u++):t+=o[f];return t}function R(e){return g(e)}function k(e,a){if(!e||!a)return false;let n=g(e),o={US:{min:10,max:10},CA:{min:10,max:10},GB:{min:10,max:11},AU:{min:9,max:9},DE:{min:10,max:11},FR:{min:9,max:9},IT:{min:9,max:10},ES:{min:9,max:9},JP:{min:10,max:11},CN:{min:11,max:11},IN:{min:10,max:10},BR:{min:11,max:11},MX:{min:10,max:10},RU:{min:10,max:10},KR:{min:9,max:11},NL:{min:9,max:9},BE:{min:9,max:9},SE:{min:9,max:9},CH:{min:9,max:9},AT:{min:9,max:13},PL:{min:9,max:9}},t=a.code?o[a.code]:void 0;return t?n.length>=t.min&&n.length<=t.max:n.length>=7&&n.length<=15}function b(e,a,n){return e?n?n(e,a):k(e,a):false}function p(e,a){if(!a)return e;let n=g(e);return `${a.dialCode}${n}`}function re(e,a){if(!a)return e;let n=g(e),o=a.dialCode.replace("+","");return n.startsWith(o)?n.slice(o.length):n}function F(e,a,n){let o=a.toLowerCase().trim();return o?e.filter(t=>t.name.toLowerCase().includes(o)||t.code.toLowerCase().includes(o)||t.dialCode.includes(o)):n?.length?[...e].sort((t,u)=>{let f=n.indexOf(t.code),s=n.indexOf(u.code);return f!==-1&&s!==-1?f-s:f!==-1?-1:s!==-1?1:t.name.localeCompare(u.name)}):e}function T(e){return e?.format?e.format.replace(/#/g,"0"):"Phone number"}function ie(e={}){let{value:a,defaultValue:n="",onChange:o,onBlur:t,onFocus:u,defaultCountry:f="US",preferredCountries:s,excludeCountries:E,onlyCountries:v,autoDetect:O=true,formatOnType:M=true,includeDialCode:c=false,validator:G}=e,h=a!==void 0,D=react.useMemo(()=>{let r=C;return v?.length&&(r=r.filter(l=>v.includes(l.code))),E?.length&&(r=r.filter(l=>!E.includes(l.code))),r},[v,E]),z=S(f)||D[0],[Z,K]=react.useState(n),[i,A]=react.useState(z),[P,x]=react.useState(false),[U,I]=react.useState(""),d=h?a:Z;react.useEffect(()=>{if(O&&d){let r=w(d);r&&r.code!==i?.code&&A(r);}},[d,O,i?.code]);let J=react.useMemo(()=>M?N(d,i):d,[d,i,M]),Q=react.useMemo(()=>c&&i?p(d,i):d,[d,i,c]),V=react.useMemo(()=>b(d,i,G),[d,i,G]),W=react.useMemo(()=>F(D,U,s),[D,U,s]),L=react.useCallback(r=>{let l=R(r);h||K(l),o?.(c?p(l,i):l,i);},[h,o,i,c]),X=react.useCallback(r=>{let l=S(r);l&&(A(l),o?.(c?p(d,l):d,l));},[d,o,c]),$=react.useCallback(r=>{A(r),x(false),I(""),o?.(c?p(d,r):d,r);},[d,o,c]),H=react.useCallback(()=>{x(r=>!r),P&&I("");},[P]),Y=react.useCallback(()=>{x(true);},[]),j=react.useCallback(()=>{x(false),I("");},[]),q=react.useCallback(()=>{h||K(""),o?.("",i);},[h,o,i]),_=react.useCallback(r=>{let l=r.target.value,ae=R(l);L(ae);},[L]),ee=react.useCallback(()=>{u?.();},[u]),oe=react.useCallback(()=>{t?.();},[t]);return {phone:d,fullPhone:Q,country:i,isValid:V,isOpen:P,searchQuery:U,setPhone:L,setCountry:X,toggleDropdown:H,openDropdown:Y,closeDropdown:j,setSearchQuery:I,clear:q,inputProps:{value:J,onChange:_,onFocus:ee,onBlur:oe,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:T(i),"aria-invalid":!V},countryButtonProps:{onClick:H,"aria-expanded":P,"aria-haspopup":"listbox"},filteredCountries:W,selectCountry:$}}exports.addDialCode=p;exports.cleanPhone=g;exports.countries=C;exports.detectCountryFromPhone=w;exports.filterCountries=F;exports.formatPhone=N;exports.getCountryByCode=S;exports.getCountryByDialCode=te;exports.getPlaceholder=T;exports.removeDialCode=re;exports.unformatPhone=R;exports.usePhoneInput=ie;exports.validatePhone=b;exports.validatePhoneLength=k;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var react=require('react'),libphonenumberJs=require('libphonenumber-js'),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
@@ -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 {useMemo,useState,useEffect,useCallback}from'react';var C=[{code:"US",name:"United States",dialCode:"+1",flag:"\u{1F1FA}\u{1F1F8}",format:"(###) ###-####"},{code:"GB",name:"United Kingdom",dialCode:"+44",flag:"\u{1F1EC}\u{1F1E7}",format:"#### ######"},{code:"CA",name:"Canada",dialCode:"+1",flag:"\u{1F1E8}\u{1F1E6}",format:"(###) ###-####"},{code:"AU",name:"Australia",dialCode:"+61",flag:"\u{1F1E6}\u{1F1FA}",format:"#### ### ###"},{code:"DE",name:"Germany",dialCode:"+49",flag:"\u{1F1E9}\u{1F1EA}",format:"#### #######"},{code:"FR",name:"France",dialCode:"+33",flag:"\u{1F1EB}\u{1F1F7}",format:"# ## ## ## ##"},{code:"IT",name:"Italy",dialCode:"+39",flag:"\u{1F1EE}\u{1F1F9}",format:"### ### ####"},{code:"ES",name:"Spain",dialCode:"+34",flag:"\u{1F1EA}\u{1F1F8}",format:"### ### ###"},{code:"JP",name:"Japan",dialCode:"+81",flag:"\u{1F1EF}\u{1F1F5}",format:"## #### ####"},{code:"CN",name:"China",dialCode:"+86",flag:"\u{1F1E8}\u{1F1F3}",format:"### #### ####"},{code:"IN",name:"India",dialCode:"+91",flag:"\u{1F1EE}\u{1F1F3}",format:"##### #####"},{code:"BR",name:"Brazil",dialCode:"+55",flag:"\u{1F1E7}\u{1F1F7}",format:"(##) #####-####"},{code:"MX",name:"Mexico",dialCode:"+52",flag:"\u{1F1F2}\u{1F1FD}",format:"### ### ####"},{code:"RU",name:"Russia",dialCode:"+7",flag:"\u{1F1F7}\u{1F1FA}",format:"(###) ###-##-##"},{code:"KR",name:"South Korea",dialCode:"+82",flag:"\u{1F1F0}\u{1F1F7}",format:"## #### ####"},{code:"NL",name:"Netherlands",dialCode:"+31",flag:"\u{1F1F3}\u{1F1F1}",format:"# ## ## ## ##"},{code:"BE",name:"Belgium",dialCode:"+32",flag:"\u{1F1E7}\u{1F1EA}",format:"### ## ## ##"},{code:"SE",name:"Sweden",dialCode:"+46",flag:"\u{1F1F8}\u{1F1EA}",format:"## ### ## ##"},{code:"CH",name:"Switzerland",dialCode:"+41",flag:"\u{1F1E8}\u{1F1ED}",format:"## ### ## ##"},{code:"AT",name:"Austria",dialCode:"+43",flag:"\u{1F1E6}\u{1F1F9}",format:"### ######"},{code:"PL",name:"Poland",dialCode:"+48",flag:"\u{1F1F5}\u{1F1F1}",format:"### ### ###"},{code:"UA",name:"Ukraine",dialCode:"+380",flag:"\u{1F1FA}\u{1F1E6}",format:"## ### ## ##"},{code:"TR",name:"Turkey",dialCode:"+90",flag:"\u{1F1F9}\u{1F1F7}",format:"(###) ### ## ##"},{code:"SA",name:"Saudi Arabia",dialCode:"+966",flag:"\u{1F1F8}\u{1F1E6}",format:"# ### ####"},{code:"ZA",name:"South Africa",dialCode:"+27",flag:"\u{1F1FF}\u{1F1E6}",format:"## ### ####"},{code:"EG",name:"Egypt",dialCode:"+20",flag:"\u{1F1EA}\u{1F1EC}",format:"### ### ####"},{code:"NG",name:"Nigeria",dialCode:"+234",flag:"\u{1F1F3}\u{1F1EC}",format:"### ### ####"},{code:"KE",name:"Kenya",dialCode:"+254",flag:"\u{1F1F0}\u{1F1EA}",format:"### ######"},{code:"AE",name:"UAE",dialCode:"+971",flag:"\u{1F1E6}\u{1F1EA}",format:"## ### ####"},{code:"IL",name:"Israel",dialCode:"+972",flag:"\u{1F1EE}\u{1F1F1}",format:"## ### ####"},{code:"IR",name:"Iran",dialCode:"+98",flag:"\u{1F1EE}\u{1F1F7}",format:"### ### ####"},{code:"PK",name:"Pakistan",dialCode:"+92",flag:"\u{1F1F5}\u{1F1F0}",format:"### #######"},{code:"BD",name:"Bangladesh",dialCode:"+880",flag:"\u{1F1E7}\u{1F1E9}",format:"#### ######"},{code:"VN",name:"Vietnam",dialCode:"+84",flag:"\u{1F1FB}\u{1F1F3}",format:"## #### ###"},{code:"TH",name:"Thailand",dialCode:"+66",flag:"\u{1F1F9}\u{1F1ED}",format:"## ### ####"},{code:"MY",name:"Malaysia",dialCode:"+60",flag:"\u{1F1F2}\u{1F1FE}",format:"## ### ####"},{code:"PH",name:"Philippines",dialCode:"+63",flag:"\u{1F1F5}\u{1F1ED}",format:"### ### ####"},{code:"SG",name:"Singapore",dialCode:"+65",flag:"\u{1F1F8}\u{1F1EC}",format:"#### ####"},{code:"ID",name:"Indonesia",dialCode:"+62",flag:"\u{1F1EE}\u{1F1E9}",format:"### ### ####"},{code:"NZ",name:"New Zealand",dialCode:"+64",flag:"\u{1F1F3}\u{1F1FF}",format:"## ### ####"},{code:"AR",name:"Argentina",dialCode:"+54",flag:"\u{1F1E6}\u{1F1F7}",format:"## #### ####"},{code:"CL",name:"Chile",dialCode:"+56",flag:"\u{1F1E8}\u{1F1F1}",format:"# #### ####"},{code:"CO",name:"Colombia",dialCode:"+57",flag:"\u{1F1E8}\u{1F1F4}",format:"### ### ####"},{code:"PE",name:"Peru",dialCode:"+51",flag:"\u{1F1F5}\u{1F1EA}",format:"### ### ###"},{code:"VE",name:"Venezuela",dialCode:"+58",flag:"\u{1F1FB}\u{1F1EA}",format:"### ### ####"},{code:"PT",name:"Portugal",dialCode:"+351",flag:"\u{1F1F5}\u{1F1F9}",format:"### ### ###"},{code:"GR",name:"Greece",dialCode:"+30",flag:"\u{1F1EC}\u{1F1F7}",format:"### ### ####"},{code:"DK",name:"Denmark",dialCode:"+45",flag:"\u{1F1E9}\u{1F1F0}",format:"## ## ## ##"},{code:"FI",name:"Finland",dialCode:"+358",flag:"\u{1F1EB}\u{1F1EE}",format:"## ### ## ##"},{code:"NO",name:"Norway",dialCode:"+47",flag:"\u{1F1F3}\u{1F1F4}",format:"### ## ###"},{code:"IE",name:"Ireland",dialCode:"+353",flag:"\u{1F1EE}\u{1F1EA}",format:"## ### ####"},{code:"CZ",name:"Czech Republic",dialCode:"+420",flag:"\u{1F1E8}\u{1F1FF}",format:"### ### ###"},{code:"HU",name:"Hungary",dialCode:"+36",flag:"\u{1F1ED}\u{1F1FA}",format:"## ### ####"},{code:"RO",name:"Romania",dialCode:"+40",flag:"\u{1F1F7}\u{1F1F4}",format:"### ### ###"},{code:"BG",name:"Bulgaria",dialCode:"+359",flag:"\u{1F1E7}\u{1F1EC}",format:"### ### ###"},{code:"HR",name:"Croatia",dialCode:"+385",flag:"\u{1F1ED}\u{1F1F7}",format:"## ### ####"},{code:"RS",name:"Serbia",dialCode:"+381",flag:"\u{1F1F7}\u{1F1F8}",format:"## ### ####"},{code:"SK",name:"Slovakia",dialCode:"+421",flag:"\u{1F1F8}\u{1F1F0}",format:"### ### ###"},{code:"SI",name:"Slovenia",dialCode:"+386",flag:"\u{1F1F8}\u{1F1EE}",format:"## ### ###"},{code:"LT",name:"Lithuania",dialCode:"+370",flag:"\u{1F1F1}\u{1F1F9}",format:"### #####"},{code:"LV",name:"Latvia",dialCode:"+371",flag:"\u{1F1F1}\u{1F1FB}",format:"## ### ###"},{code:"EE",name:"Estonia",dialCode:"+372",flag:"\u{1F1EA}\u{1F1EA}",format:"#### ####"}],ne=new Map(C.map(e=>[e.code,e]));function S(e){return ne.get(e.toUpperCase())}function te(e){return C.find(a=>a.dialCode===e)}function w(e){let a=e.replace(/\D/g,""),n=[...C].sort((o,t)=>t.dialCode.length-o.dialCode.length);for(let o of n){let t=o.dialCode.replace("+","");if(a.startsWith(t))return o}}function g(e){return e.replace(/\D/g,"")}function N(e,a){if(!e||!a?.format)return e;let n=g(e),o=a.format,t="",u=0;for(let f=0;f<o.length&&u<n.length;f++)o[f]==="#"?(t+=n[u],u++):t+=o[f];return t}function R(e){return g(e)}function k(e,a){if(!e||!a)return false;let n=g(e),o={US:{min:10,max:10},CA:{min:10,max:10},GB:{min:10,max:11},AU:{min:9,max:9},DE:{min:10,max:11},FR:{min:9,max:9},IT:{min:9,max:10},ES:{min:9,max:9},JP:{min:10,max:11},CN:{min:11,max:11},IN:{min:10,max:10},BR:{min:11,max:11},MX:{min:10,max:10},RU:{min:10,max:10},KR:{min:9,max:11},NL:{min:9,max:9},BE:{min:9,max:9},SE:{min:9,max:9},CH:{min:9,max:9},AT:{min:9,max:13},PL:{min:9,max:9}},t=a.code?o[a.code]:void 0;return t?n.length>=t.min&&n.length<=t.max:n.length>=7&&n.length<=15}function b(e,a,n){return e?n?n(e,a):k(e,a):false}function p(e,a){if(!a)return e;let n=g(e);return `${a.dialCode}${n}`}function re(e,a){if(!a)return e;let n=g(e),o=a.dialCode.replace("+","");return n.startsWith(o)?n.slice(o.length):n}function F(e,a,n){let o=a.toLowerCase().trim();return o?e.filter(t=>t.name.toLowerCase().includes(o)||t.code.toLowerCase().includes(o)||t.dialCode.includes(o)):n?.length?[...e].sort((t,u)=>{let f=n.indexOf(t.code),s=n.indexOf(u.code);return f!==-1&&s!==-1?f-s:f!==-1?-1:s!==-1?1:t.name.localeCompare(u.name)}):e}function T(e){return e?.format?e.format.replace(/#/g,"0"):"Phone number"}function ie(e={}){let{value:a,defaultValue:n="",onChange:o,onBlur:t,onFocus:u,defaultCountry:f="US",preferredCountries:s,excludeCountries:E,onlyCountries:v,autoDetect:O=true,formatOnType:M=true,includeDialCode:c=false,validator:G}=e,h=a!==void 0,D=useMemo(()=>{let r=C;return v?.length&&(r=r.filter(l=>v.includes(l.code))),E?.length&&(r=r.filter(l=>!E.includes(l.code))),r},[v,E]),z=S(f)||D[0],[Z,K]=useState(n),[i,A]=useState(z),[P,x]=useState(false),[U,I]=useState(""),d=h?a:Z;useEffect(()=>{if(O&&d){let r=w(d);r&&r.code!==i?.code&&A(r);}},[d,O,i?.code]);let J=useMemo(()=>M?N(d,i):d,[d,i,M]),Q=useMemo(()=>c&&i?p(d,i):d,[d,i,c]),V=useMemo(()=>b(d,i,G),[d,i,G]),W=useMemo(()=>F(D,U,s),[D,U,s]),L=useCallback(r=>{let l=R(r);h||K(l),o?.(c?p(l,i):l,i);},[h,o,i,c]),X=useCallback(r=>{let l=S(r);l&&(A(l),o?.(c?p(d,l):d,l));},[d,o,c]),$=useCallback(r=>{A(r),x(false),I(""),o?.(c?p(d,r):d,r);},[d,o,c]),H=useCallback(()=>{x(r=>!r),P&&I("");},[P]),Y=useCallback(()=>{x(true);},[]),j=useCallback(()=>{x(false),I("");},[]),q=useCallback(()=>{h||K(""),o?.("",i);},[h,o,i]),_=useCallback(r=>{let l=r.target.value,ae=R(l);L(ae);},[L]),ee=useCallback(()=>{u?.();},[u]),oe=useCallback(()=>{t?.();},[t]);return {phone:d,fullPhone:Q,country:i,isValid:V,isOpen:P,searchQuery:U,setPhone:L,setCountry:X,toggleDropdown:H,openDropdown:Y,closeDropdown:j,setSearchQuery:I,clear:q,inputProps:{value:J,onChange:_,onFocus:ee,onBlur:oe,type:"tel",inputMode:"tel",autoComplete:"tel",placeholder:T(i),"aria-invalid":!V},countryButtonProps:{onClick:H,"aria-expanded":P,"aria-haspopup":"listbox"},filteredCountries:W,selectCountry:$}}export{p as addDialCode,g as cleanPhone,C as countries,w as detectCountryFromPhone,F as filterCountries,N as formatPhone,S as getCountryByCode,te as getCountryByDialCode,T as getPlaceholder,re as removeDialCode,R as unformatPhone,ie as usePhoneInput,b as validatePhone,k as validatePhoneLength};//# sourceMappingURL=index.js.map
1
+ import {forwardRef,useRef,useState,useId,useCallback,useEffect,useImperativeHandle,useMemo}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.0",
4
- "description": "Headless phone number input component with country selection, auto-detection, and TypeScript",
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
  }