Licence
SEE LICENSE IN FILE 'LICENSE'
Version
1.4.2
Deps
2
Size
122 kB
Vulns
0
Weekly
0
@hyperse/hero-tel-input
A modern, accessible, and feature-rich international telephone input component built with React and HeroUI. Perfect for forms that require phone number input with country selection.
Features
- International Support: Supports all countries with their respective calling codes
- HeroUI Integration: Built on top of HeroUI for consistent design and theming
- Smart Formatting: Automatic phone number formatting based on country
- Country Search: Easy country selection with search functionality
- TypeScript: Full TypeScript support with comprehensive type definitions
- Accessible: WCAG compliant with proper ARIA attributes
- Form Integration: Works seamlessly with React Hook Form and other form libraries
- Customizable: Extensive customization options for flags, styling, and behavior
- Lightweight: Minimal bundle size with tree-shaking support
Installation
npm install @hyperse/hero-tel-input
# or
yarn add @hyperse/hero-tel-input
# or
pnpm add @hyperse/hero-tel-input
Quick Start
import { HeroTelInput } from '@hyperse/hero-tel-input';
function MyForm() {
const [phoneNumber, setPhoneNumber] = useState('');
return (
<HeroTelInput
value={phoneNumber}
onChange={(value, info) => {
setPhoneNumber(value);
console.log('Phone info:', info);
}}
defaultCountry="US"
placeholder="Enter phone number"
/>
);
}
Basic Usage
Simple Implementation
import { HeroTelInput } from '@hyperse/hero-tel-input';
function PhoneInput() {
return (
<HeroTelInput
label="Phone Number"
placeholder="Enter your phone number"
defaultCountry="CN"
onChange={(value, info) => {
console.log('Value:', value);
console.log('Country:', info.countryCode);
console.log('Calling Code:', info.countryCallingCode);
}}
/>
);
}
With React Hook Form
import { Controller, useForm } from 'react-hook-form';
import { HeroTelInput, matchIsValidTel } from '@hyperse/hero-tel-input';
function PhoneForm() {
const { control, handleSubmit } = useForm();
const onSubmit = (data) => {
console.log('Form data:', data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Controller
name="phoneNumber"
control={control}
rules={{
validate: (value) => matchIsValidTel(value) || 'Invalid phone number',
}}
render={({ field, fieldState }) => (
<HeroTelInput
{...field}
label="Phone Number"
defaultCountry="US"
isInvalid={fieldState.invalid}
errorMessage={fieldState.error?.message}
/>
)}
/>
<button type="submit">Submit</button>
</form>
);
}
API Reference
Props
| Prop | Type | Default | Description |
|---|---|---|---|
value |
string |
'' |
The phone number value |
defaultCountry |
HeroTelInputCountry |
- | Default country to select |
forceCallingCode |
boolean |
false |
Force the calling code to be included |
onlyCountries |
HeroTelInputCountry[] |
- | Only allow these countries |
excludedCountries |
HeroTelInputCountry[] |
- | Exclude these countries |
preferredCountries |
HeroTelInputCountry[] |
- | Show these countries at the top |
continents |
HeroTelInputContinent[] |
- | Only allow countries in these continents |
langOfCountryName |
string |
- | Language for country names |
disableFormatting |
boolean |
false |
Disable phone number formatting |
disableDropdown |
boolean |
false |
Disable country dropdown |
focusOnSelectCountry |
boolean |
- | Focus input after country selection |
onChange |
(value: string, info: HeroTelInputInfo) => void |
- | Callback when value changes |
onBlur |
(event, info: HeroTelInputInfo) => void |
- | Callback when input loses focus |
unknownFlagElement |
React.ReactNode |
- | Element for unknown flags |
HeroTelInputInfo
interface HeroTelInputInfo {
countryCode: HeroTelInputCountry | null; // ISO country code (e.g., 'CN')
countryCallingCode: string | null; // Calling code (e.g., '86')
nationalNumber: string | null; // National number part
numberType: NumberType | null; // Number type (e.g., 'MOBILE')
numberValue: string | null; // E.164 formatted value
reason: 'country' | 'input' | 'blur'; // Change reason
}
Advanced Examples
Custom Country Filtering
<HeroTelInput
onlyCountries={['US', 'CA', 'MX']}
preferredCountries={['US']}
defaultCountry="US"
label="North American Phone"
/>
Force Calling Code
<HeroTelInput
forceCallingCode
defaultCountry="CN"
label="Chinese Phone (with +86)"
/>
Custom Styling
<HeroTelInput
defaultCountry="FR"
classNames={{
base: 'custom-dropdown-base',
trigger: 'custom-trigger',
content: 'custom-content',
}}
/>
Form Validation
import { matchIsValidTel } from '@hyperse/hero-tel-input';
const validatePhone = (value: string) => {
if (!value) return 'Phone number is required';
if (!matchIsValidTel(value)) return 'Invalid phone number';
return true;
};
Supported Countries
The component supports all countries with their respective calling codes. You can:
- Filter by specific countries using
onlyCountries - Exclude countries using
excludedCountries - Set preferred countries using
preferredCountries - Filter by continents using
continents
Available Continents
'AF'- Africa'AS'- Asia'EU'- Europe'NA'- North America'OC'- Oceania'SA'- South America
Examples
Check out the examples in the examples/ directory:
example-nextjs/- Next.js integration examplewebsite/- Documentation website
License
This project is licensed under the MIT License - see the LICENSE file for details.