Skip to content

A lightweight, dependency-free Vanilla JS library for international phone masking and validation. A high-performance, compact alternative to intl-tel-input

License

Notifications You must be signed in to change notification settings

axxler/IntlPhoneMask

Repository files navigation

EN - RU

IntlPhoneMask 🌍

Ultra-lightweight Vanilla JavaScript library for international phone inputs with automatic flag detection, masking, and validation.

πŸš€ Open Live Demo

IntlPhoneMask Preview


ENGLISH

Overview

IntlPhoneMask is a high-performance, dependency-free alternative to intl-tel-input focused on modern UX and minimal bundle size. It supports automatic country detection by dial code, smart masking, real-time validation, and a fully customizable UI.

Features

  • Zero dependencies, pure Vanilla JS.
  • Tiny footprint compared to typical intl phone libraries.
  • Smart masking based on selected country or typed digits.
  • Live search by country name (RU/EN) or dial code.
  • Real-time validation with CSS states for valid/invalid.
  • SVG flags loaded via CDN, no local image assets.
  • Easy styling of dropdown, flags, and input via CSS.

Installation

You can include the compiled files directly via <link> and <script>.

<link rel="stylesheet" href="intl-phone-mask.css">
<script src="intl-phone-mask.min.js"></script>

Basic Usage

1. HTML

Use a regular input field and an optional element for validation status.

<input type="text" id="phone" placeholder="Enter phone number">
<div id="status"></div>

2. Initialization

Call IntlPhoneMask.init with a CSS selector and options.

IntlPhoneMask.init('#phone', {
  lang: 'en',          // 'en' or 'ru'
  fixedWidth: true,    // optional: fix dropdown width to 350px
  statusSelector: '#status' // optional: selector for validation text
});

You can pass any CSS selector (class, id, or attribute) and multiple inputs will be initialized if they match.


Configuration

Option Type Default Description
lang string 'ru' UI language, supports 'en' and 'ru'.
fixedWidth boolean false If true, country list width is fixed to 350px.
statusSelector string null CSS selector for an element that shows status text.

Validation States

IntlPhoneMask automatically toggles CSS classes on the input depending on mask completeness.

  • .state-valid: the number length matches the current country mask.
  • .state-invalid: the number is incomplete or too short.

Status text (e.g., β€œValid”, β€œIncomplete”, β€œWaiting…”) is localized according to the lang option and shown in the statusSelector element if configured.


Styling

Core layout and visual styles are controlled by CSS classes such as:

  • .intl-wrapper – outer container.
  • .intl-select – flag + dial code selector.
  • .intl-list / .intl-list.fixed-width – dropdown list.
  • .intl-item – country row in the list.
  • .intl-input-field – the enhanced input element.

You can override these classes in your own stylesheet to fully match your design system.


License

IntlPhoneMask is distributed under the GNU GPL-3.0 license. You must keep the license text and notices in derivative works.


Contributing

  • Open issues for bugs, edge cases with specific country formats, or UX suggestions.
  • Submit pull requests with clear descriptions and, if possible, small focused changes.
  • Include minimal HTML examples when reporting or fixing UI issues.

Performance Notes

  • No runtime dependencies (no jQuery, no frameworks), which keeps the script extremely small.
  • Uses a precomputed list of country codes and masks, avoiding extra network requests at runtime.


Π Π£Π‘Π‘ΠšΠ˜Π™

ΠžΠ±Π·ΠΎΡ€

IntlPhoneMask β€” это Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° чистом JavaScript для Π²Π²ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ² с автоматичСским ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ страны, маской ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠ΅ΠΉ. Она создана ΠΊΠ°ΠΊ лёгкая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° intl-tel-input с соврСмСнным интСрфСйсом ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±Π°Π½Π΄Π»Π°.

πŸš€ ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²

ВозмоТности

  • Π‘Π΅Π· зависимостСй, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чистый JavaScript.
  • ΠžΡ‡Π΅Π½ΡŒ нСбольшой Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ для Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ².
  • Умная маска Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ страны ΠΈΠ»ΠΈ Π½Π°Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
  • Π–ΠΈΠ²ΠΎΠΉ поиск ΠΏΠΎ названию страны (RU/EN) ΠΈΠ»ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ.
  • Валидация Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‡Π΅Ρ€Π΅Π· CSS-состояния поля Π²Π²ΠΎΠ΄Π°.
  • SVG-Ρ„Π»Π°Π³ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ с CDN, Π½Π΅ занимая мСсто Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.
  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ кастомизация Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка ΠΈ ΠΈΠ½ΠΏΡƒΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· CSS.

Установка

Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ Π½Π° страницу ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‡Π΅Ρ€Π΅Π· <link> ΠΈ <script>.

<link rel="stylesheet" href="intl-phone-mask.css">
<script src="intl-phone-mask.min.js"></script>

Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ использованиС

1. HTML

ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ для статуса Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ.

<input type="text" id="phone" placeholder="Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°">
<div id="status"></div>

2. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ IntlPhoneMask.init с CSS-сСлСктором ΠΈ опциями.

IntlPhoneMask.init('#phone', {
  lang: 'ru',          // 'ru' ΠΈΠ»ΠΈ 'en'
  fixedWidth: true,    // опция: фиксированная ΡˆΠΈΡ€ΠΈΠ½Π° списка (350px)
  statusSelector: '#status' // опция: элСмСнт для тСкста статуса
});

МоТно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ любой CSS-сСлСктор; всС подходящиС ΠΈΠ½ΠΏΡƒΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.


ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π’ΠΈΠΏ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ОписаниС
lang string 'ru' Π―Π·Ρ‹ΠΊ интСрфСйса: 'en' ΠΈΠ»ΠΈ 'ru.
fixedWidth boolean false Если true, список стран ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ 350px.
statusSelector string null CSS-сСлСктор элСмСнта для Π²Ρ‹Π²ΠΎΠ΄Π° тСкста Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ.

Бостояния Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° автоматичСски ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ CSS-классы Π½Π° ΠΈΠ½ΠΏΡƒΡ‚Π΅ Π² зависимости ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ маски.

  • .state-valid: Π½ΠΎΠΌΠ΅Ρ€ соотвСтствуСт Π΄Π»ΠΈΠ½Π΅ маски Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ страны.
  • .state-invalid: Π½ΠΎΠΌΠ΅Ρ€ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ слишком ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ.

ВСкст статуса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΒ», «НСполный Π½ΠΎΠΌΠ΅Ρ€Β», Β«ΠžΠΆΠΈΠ΄Π°Π½ΠΈΠ΅β€¦Β») отобраТаСтся Π² элСмСнтС statusSelector ΠΈ локализуСтся ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ lang.


Бтилизация

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ классы вёрстки ΠΈ стилСй:

  • .intl-wrapper β€” внСшний ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.
  • .intl-select β€” Π·ΠΎΠ½Π° Π²Ρ‹Π±ΠΎΡ€Π° Ρ„Π»Π°Π³Π° ΠΈ ΠΊΠΎΠ΄Π°.
  • .intl-list / .intl-list.fixed-width β€” Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ список стран.
  • .intl-item β€” строка с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ страной.
  • .intl-input-field β€” ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°.

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠΉΡ‚Π΅ эти классы Π² своём CSS, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.


ЛицСнзия

IntlPhoneMask распространяСтся ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU GPL-3.0. Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ тСкста Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ распространСнии.


Π’ΠΊΠ»Π°Π΄ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

  • Π‘ΠΎΠΎΠ±Ρ‰Π°ΠΉΡ‚Π΅ ΠΎ Π±Π°Π³Π°Ρ…, странных Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… стран ΠΈ UX-ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ….
  • ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠΉΡ‚Π΅ pull request’ы с нСбольшими, Ρ…ΠΎΡ€ΠΎΡˆΠΎ описанными измСнСниями.
  • ΠŸΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… интСрфСйса ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ HTML-ΠΏΡ€ΠΈΠΌΠ΅Ρ€ воспроизвСдСния.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

  • НСт Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй, поэтому скрипт остаётся ΠΎΡ‡Π΅Π½ΡŒ Π»Ρ‘Π³ΠΊΠΈΠΌ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ список стран ΠΈ масок, Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.