@input-kit/phone 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Input Kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @input-kit/phone
2
+
3
+ Phone number input component for React with country selection, formatting, and validation.
4
+
5
+ ## Features
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
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install @input-kit/phone
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ```tsx
25
+ import { usePhoneInput, countries } from '@input-kit/phone';
26
+
27
+ function MyComponent() {
28
+ const {
29
+ inputProps,
30
+ country,
31
+ countryButtonProps,
32
+ filteredCountries,
33
+ selectCountry,
34
+ isOpen,
35
+ isValid,
36
+ } = usePhoneInput({
37
+ defaultCountry: 'US',
38
+ onChange: (phone, country) => console.log(phone, country),
39
+ });
40
+
41
+ return (
42
+ <div>
43
+ <button {...countryButtonProps}>
44
+ {country?.flag} {country?.dialCode}
45
+ </button>
46
+
47
+ {isOpen && (
48
+ <div>
49
+ {filteredCountries.map(c => (
50
+ <button key={c.code} onClick={() => selectCountry(c)}>
51
+ {c.flag} {c.name} {c.dialCode}
52
+ </button>
53
+ ))}
54
+ </div>
55
+ )}
56
+
57
+ <input {...inputProps} />
58
+ {!isValid && <span>Invalid phone</span>}
59
+ </div>
60
+ );
61
+ }
62
+ ```
63
+
64
+ ## API Reference
65
+
66
+ ### `usePhoneInput(options)`
67
+
68
+ #### Options
69
+
70
+ | 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 |
93
+
94
+ ## License
95
+
96
+ MIT © Input Kit
package/dist/index.cjs ADDED
@@ -0,0 +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
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,89 @@
1
+ import { InputHTMLAttributes } from 'react';
2
+
3
+ interface Country {
4
+ code: string;
5
+ name: string;
6
+ dialCode: string;
7
+ flag: string;
8
+ format?: string;
9
+ }
10
+ declare const countries: Country[];
11
+ declare function getCountryByCode(code: string): Country | undefined;
12
+ declare function getCountryByDialCode(dialCode: string): Country | undefined;
13
+ declare function detectCountryFromPhone(phone: string): Country | undefined;
14
+
15
+ interface PhoneInputOptions {
16
+ defaultCountry?: string;
17
+ preferredCountries?: string[];
18
+ excludeCountries?: string[];
19
+ onlyCountries?: string[];
20
+ searchable?: boolean;
21
+ autoDetect?: boolean;
22
+ formatOnType?: boolean;
23
+ includeDialCode?: boolean;
24
+ validator?: (phone: string, country: Country | undefined) => boolean;
25
+ }
26
+ interface PhoneInputState {
27
+ phone: string;
28
+ fullPhone: string;
29
+ country: Country | undefined;
30
+ isValid: boolean;
31
+ isOpen: boolean;
32
+ searchQuery: string;
33
+ }
34
+ interface PhoneInputActions {
35
+ setPhone: (phone: string) => void;
36
+ setCountry: (code: string) => void;
37
+ toggleDropdown: () => void;
38
+ openDropdown: () => void;
39
+ closeDropdown: () => void;
40
+ setSearchQuery: (query: string) => void;
41
+ clear: () => void;
42
+ }
43
+ interface UsePhoneInputReturn extends PhoneInputState, PhoneInputActions {
44
+ inputProps: InputHTMLAttributes<HTMLInputElement>;
45
+ countryButtonProps: {
46
+ onClick: () => void;
47
+ 'aria-expanded': boolean;
48
+ 'aria-haspopup': 'listbox';
49
+ };
50
+ filteredCountries: Country[];
51
+ selectCountry: (country: Country) => void;
52
+ }
53
+ interface PhoneInputProps extends PhoneInputOptions {
54
+ value?: string;
55
+ defaultValue?: string;
56
+ onChange?: (phone: string, country: Country | undefined) => void;
57
+ onBlur?: () => void;
58
+ onFocus?: () => void;
59
+ containerClassName?: string;
60
+ inputClassName?: string;
61
+ selectorClassName?: string;
62
+ placeholder?: string;
63
+ disabled?: boolean;
64
+ readOnly?: boolean;
65
+ name?: string;
66
+ id?: string;
67
+ 'aria-label'?: string;
68
+ 'aria-labelledby'?: string;
69
+ }
70
+
71
+ declare function usePhoneInput(options?: PhoneInputOptions & {
72
+ value?: string;
73
+ defaultValue?: string;
74
+ onChange?: (phone: string, country: Country | undefined) => void;
75
+ onBlur?: () => void;
76
+ onFocus?: () => void;
77
+ }): UsePhoneInputReturn;
78
+
79
+ declare function cleanPhone(phone: string): string;
80
+ declare function formatPhone(phone: string, country: Country | undefined): string;
81
+ declare function unformatPhone(formattedPhone: string): string;
82
+ declare function validatePhoneLength(phone: string, country: Country | undefined): boolean;
83
+ declare function validatePhone(phone: string, country: Country | undefined, customValidator?: (phone: string, country: Country | undefined) => boolean): boolean;
84
+ declare function addDialCode(phone: string, country: Country | undefined): string;
85
+ declare function removeDialCode(phone: string, country: Country | undefined): string;
86
+ declare function filterCountries(countries: Country[], query: string, preferredCountries?: string[]): Country[];
87
+ declare function getPlaceholder(country: Country | undefined): string;
88
+
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 };
@@ -0,0 +1,89 @@
1
+ import { InputHTMLAttributes } from 'react';
2
+
3
+ interface Country {
4
+ code: string;
5
+ name: string;
6
+ dialCode: string;
7
+ flag: string;
8
+ format?: string;
9
+ }
10
+ declare const countries: Country[];
11
+ declare function getCountryByCode(code: string): Country | undefined;
12
+ declare function getCountryByDialCode(dialCode: string): Country | undefined;
13
+ declare function detectCountryFromPhone(phone: string): Country | undefined;
14
+
15
+ interface PhoneInputOptions {
16
+ defaultCountry?: string;
17
+ preferredCountries?: string[];
18
+ excludeCountries?: string[];
19
+ onlyCountries?: string[];
20
+ searchable?: boolean;
21
+ autoDetect?: boolean;
22
+ formatOnType?: boolean;
23
+ includeDialCode?: boolean;
24
+ validator?: (phone: string, country: Country | undefined) => boolean;
25
+ }
26
+ interface PhoneInputState {
27
+ phone: string;
28
+ fullPhone: string;
29
+ country: Country | undefined;
30
+ isValid: boolean;
31
+ isOpen: boolean;
32
+ searchQuery: string;
33
+ }
34
+ interface PhoneInputActions {
35
+ setPhone: (phone: string) => void;
36
+ setCountry: (code: string) => void;
37
+ toggleDropdown: () => void;
38
+ openDropdown: () => void;
39
+ closeDropdown: () => void;
40
+ setSearchQuery: (query: string) => void;
41
+ clear: () => void;
42
+ }
43
+ interface UsePhoneInputReturn extends PhoneInputState, PhoneInputActions {
44
+ inputProps: InputHTMLAttributes<HTMLInputElement>;
45
+ countryButtonProps: {
46
+ onClick: () => void;
47
+ 'aria-expanded': boolean;
48
+ 'aria-haspopup': 'listbox';
49
+ };
50
+ filteredCountries: Country[];
51
+ selectCountry: (country: Country) => void;
52
+ }
53
+ interface PhoneInputProps extends PhoneInputOptions {
54
+ value?: string;
55
+ defaultValue?: string;
56
+ onChange?: (phone: string, country: Country | undefined) => void;
57
+ onBlur?: () => void;
58
+ onFocus?: () => void;
59
+ containerClassName?: string;
60
+ inputClassName?: string;
61
+ selectorClassName?: string;
62
+ placeholder?: string;
63
+ disabled?: boolean;
64
+ readOnly?: boolean;
65
+ name?: string;
66
+ id?: string;
67
+ 'aria-label'?: string;
68
+ 'aria-labelledby'?: string;
69
+ }
70
+
71
+ declare function usePhoneInput(options?: PhoneInputOptions & {
72
+ value?: string;
73
+ defaultValue?: string;
74
+ onChange?: (phone: string, country: Country | undefined) => void;
75
+ onBlur?: () => void;
76
+ onFocus?: () => void;
77
+ }): UsePhoneInputReturn;
78
+
79
+ declare function cleanPhone(phone: string): string;
80
+ declare function formatPhone(phone: string, country: Country | undefined): string;
81
+ declare function unformatPhone(formattedPhone: string): string;
82
+ declare function validatePhoneLength(phone: string, country: Country | undefined): boolean;
83
+ declare function validatePhone(phone: string, country: Country | undefined, customValidator?: (phone: string, country: Country | undefined) => boolean): boolean;
84
+ declare function addDialCode(phone: string, country: Country | undefined): string;
85
+ declare function removeDialCode(phone: string, country: Country | undefined): string;
86
+ declare function filterCountries(countries: Country[], query: string, preferredCountries?: string[]): Country[];
87
+ declare function getPlaceholder(country: Country | undefined): string;
88
+
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 };
package/dist/index.js ADDED
@@ -0,0 +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
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@input-kit/phone",
3
+ "version": "0.1.0",
4
+ "description": "Headless phone number input component with country selection, auto-detection, and TypeScript",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "sideEffects": false,
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "dev": "tsup --watch",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "typecheck": "tsc --noEmit",
28
+ "lint": "eslint src --ext .ts,.tsx",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "keywords": [
32
+ "react",
33
+ "phone",
34
+ "input",
35
+ "telephone",
36
+ "country",
37
+ "flag",
38
+ "international",
39
+ "typescript",
40
+ "headless",
41
+ "unstyled",
42
+ "accessible",
43
+ "validation"
44
+ ],
45
+ "author": "Harshit",
46
+ "license": "MIT",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/yourusername/input-kit.git",
50
+ "directory": "packages/phone"
51
+ },
52
+ "bugs": {
53
+ "url": "https://github.com/yourusername/input-kit/issues"
54
+ },
55
+ "homepage": "https://github.com/yourusername/input-kit/tree/main/packages/phone#readme",
56
+ "engines": {
57
+ "node": ">=18.0.0"
58
+ },
59
+ "peerDependencies": {
60
+ "react": "^18.0.0 || ^19.0.0",
61
+ "react-dom": "^18.0.0 || ^19.0.0"
62
+ },
63
+ "devDependencies": {
64
+ "@testing-library/react": "^16.3.2",
65
+ "@types/react": "^18.3.18",
66
+ "@types/react-dom": "^18.3.5",
67
+ "@vitejs/plugin-react": "^4.3.4",
68
+ "jsdom": "^26.0.0",
69
+ "react": "^18.3.1",
70
+ "react-dom": "^18.3.1",
71
+ "tsup": "^8.3.5",
72
+ "typescript": "^5.7.3",
73
+ "vitest": "^3.0.4"
74
+ }
75
+ }