Skip to content

hyperse-io/hero-tel-input

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

47 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

@hyperse/hero-tel-input

build stable version GitHub top language Licence

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 example
  • website/ - Documentation website

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

About

A phone number input designed for the React library Hero UI

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published

Contributors 3

  •  
  •  
  •