simple-phone-mask
Version:
A lightweight and customizable phone number input mask with country flags, search, validation and dark theme.
212 lines (165 loc) β’ 7.12 kB
Markdown
A lightweight and customizable phone number input mask with country flags, search, validation and dark theme.
[](https://www.npmjs.com/package/simple-phone-mask)
[](https://github.com/mykulyncom/simple-phone-mask/blob/main/LICENSE)
- π Country flag display with optional country selection
- π Search field inside the country dropdown
- π Dark theme support
- β
Built-in phone number validation
- β Preferred (pinned) countries at the top of the list
- π Automatic country detection by IP address
- π± Automatic phone number formatting based on country
- π― Custom mask patterns support
- π No dependencies
- π¦ Lightweight
Check out the <a href="https://mykulyn.com/simple-phone-mask/" target="_blank" rel="noopener noreferrer">online demo</a> to see it in action!
```bash
npm install simple-phone-mask
```
```html
<!-- JavaScript -->
<script src="https://unpkg.com/simple-phone-mask@1.0.5/dist/simple-phone-mask.min.js"></script>
<!-- CSS -->
<link href="https://unpkg.com/simple-phone-mask@1.0.5/dist/simple-phone-mask.min.css" rel="stylesheet" />
```
```html
<input type="tel" id="phone" />
```
```javascript
// Basic usage with default settings (Ukraine)
new SimplePhoneMask('#phone');
// With country flag and selection
new SimplePhoneMask('#phone', {
countryCode: 'UA',
showFlag: true,
allowCountrySelect: true,
});
// With flag but without country selection
new SimplePhoneMask('#phone', {
countryCode: 'US',
showFlag: true,
allowCountrySelect: false,
});
// Without flag
new SimplePhoneMask('#phone', {
countryCode: 'PL',
showFlag: false,
});
// With custom mask pattern
new SimplePhoneMask('#phone', {
countryCode: '+48',
maskPattern: '___ ___ ___',
showFlag: true,
allowCountrySelect: false,
});
// Auto-detect country by IP
new SimplePhoneMask('#phone', {
detectIP: true,
showFlag: true,
allowCountrySelect: true,
});
// Dark theme
new SimplePhoneMask('#phone', {
countryCode: 'UA',
showFlag: true,
allowCountrySelect: true,
darkTheme: true,
});
// With search in dropdown
new SimplePhoneMask('#phone', {
countryCode: 'UA',
showFlag: true,
allowCountrySelect: true,
showSearch: true,
});
// With validation
new SimplePhoneMask('#phone', {
countryCode: 'UA',
showFlag: true,
validate: true,
onValidate: (isValid, value) => {
console.log('Valid:', isValid, 'Value:', value);
},
});
// Programmatic validation (e.g. on form submit)
const mask = new SimplePhoneMask('#phone', {
countryCode: 'UA',
validate: true,
});
document.querySelector('form').addEventListener('submit', (e) => {
if (!mask.validate()) {
e.preventDefault();
}
});
// Preferred (pinned) countries
new SimplePhoneMask('#phone', {
countryCode: 'UA',
showFlag: true,
allowCountrySelect: true,
preferredCountries: ['UA', 'US', 'GB', 'PL'],
});
```
| Option | Type | Default | Description |
| -------------------- | ---------- | ------- | -------------------------------------------------------------------------------------------------------------- |
| `countryCode` | `string` | `"UA"` | Country code (e.g., `'UA'`, `'US'`) or phone code (e.g., `'+380'`, `'+1'`) |
| `maskPattern` | `string` | `null` | Custom mask pattern (overrides default country mask) |
| `showFlag` | `boolean` | `true` | Show country flag button |
| `allowCountrySelect` | `boolean` | `true` | Allow country selection from dropdown |
| `detectIP` | `boolean` | `false` | Auto-detect country by IP. Overrides `countryCode` when enabled. |
| `darkTheme` | `boolean` | `false` | Enable dark theme for the dropdown |
| `showSearch` | `boolean` | `true` | Show a search field inside the dropdown (only when `allowCountrySelect: true`) |
| `validate` | `boolean` | `false` | Enable phone validation β shows valid/invalid state on blur and creates a hint message below the input |
| `onValidate` | `function` | `null` | Callback fired on every validation check. Receives `(isValid: boolean, value: string)` |
| `errorMessage` | `string` | `'Please enter a complete phone number.'` | Custom message shown when number is incomplete |
| `successMessage` | `string` | `'β Looks good!'` | Custom message shown when number is valid |
| `preferredCountries` | `string[]` | `[]` | Array of ISO country codes to pin at the top of the dropdown (e.g., `['UA', 'US', 'GB']`) |
## Methods
| Method | Returns | Description |
| ------------ | --------- | --------------------------------------------------------------------------- |
| `validate()` | `boolean` | Runs validation on all matched inputs and returns `true` if all are valid |
| `destroy()` | `void` | Removes all event listeners and cleans up |
## Changelog
### 1.0.5
- β¨ Added **dark theme** (`darkTheme: true`)
- π Added **search field** in dropdown (`showSearch: true`)
- β
Added **validation** with inline message and `onValidate` callback
- β Added **preferred countries** pinned at the top (`preferredCountries: ['UA', 'US']`)
- π Minor dropdown UX improvements (border-radius, selected highlight, focus restore)
### 1.0.4
- Initial public release
## Supported Countries
The library supports phone number formatting for 50+ countries including:
- πΊπ¦ Ukraine (+380)
- πΊπΈ United States (+1)
- π¬π§ United Kingdom (+44)
- π©πͺ Germany (+49)
- π«π· France (+33)
- π΅π± Poland (+48)
- And many moreβ¦
## Browser Support
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Opera (latest)
## Contributing
1. Fork it!
2. Create your feature branch: `git checkout -b feature/my-new-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin feature/my-new-feature`
5. Submit a pull request
## License
This project is licensed under the MIT License β see the [LICENSE](LICENSE) file for details.
## Author
Created by [Serhii Mykulyn](https://github.com/mykulyncom)
## Support
If you found this project useful, please consider giving it a βοΈ on [GitHub](https://github.com/mykulyncom/simple-phone-mask)!