ngx-mask
Version:
Input masking for modern Angular — Reactive, template-driven and Signal Forms, zoneless and SSR ready. Dates, numbers, separators, custom patterns.
261 lines (178 loc) • 7.61 kB
Markdown
<h1 align="center">ngx-mask</h1>
<p align="center">
A powerful Angular directive for input masking with customizable patterns
</p>
<p align="center">
<a href="https://github.com/NepipenkoIgor/ngx-mask/actions/workflows/quality-check.yml">
<img src="https://github.com/NepipenkoIgor/ngx-mask/actions/workflows/quality-check.yml/badge.svg?branch=develop" alt="CI">
</a>
<a href="https://www.npmjs.com/package/ngx-mask">
<img src="https://img.shields.io/npm/v/ngx-mask.svg" alt="npm version">
</a>
<a href="https://npmjs.org/ngx-mask">
<img src="https://img.shields.io/npm/dt/ngx-mask.svg" alt="npm downloads">
</a>
<a href="https://www.npmjs.com/package/ngx-mask">
<img src="https://img.shields.io/npm/dm/ngx-mask.svg" alt="npm monthly downloads">
</a>
<a href="https://bundlephobia.com/package/ngx-mask">
<img src="https://img.shields.io/bundlephobia/minzip/ngx-mask.svg" alt="Bundle size">
</a>
<a href="https://www.npmjs.com/package/ngx-mask">
<img src="https://img.shields.io/npm/types/ngx-mask.svg" alt="TypeScript support">
</a>
<a href="https://github.com/NepipenkoIgor/ngx-mask/blob/develop/LICENSE">
<img src="https://img.shields.io/npm/l/ngx-mask.svg" alt="License">
</a>
<a href="https://github.com/NepipenkoIgor/ngx-mask">
<img src="https://img.shields.io/github/contributors/NepipenkoIgor/ngx-mask.svg?style=flat" alt="GitHub contributors">
</a>
<a href="https://github.com/NepipenkoIgor/ngx-mask">
<img src="https://img.shields.io/github/stars/NepipenkoIgor/ngx-mask.svg?label=GitHub%20Stars&style=flat" alt="GitHub Stars">
</a>
</p>
`ngx-mask` is the input-masking library built for modern Angular. One standalone directive (`NgxMaskDirective`) and pipe (`NgxMaskPipe`) cover all three form models — **Reactive Forms, template-driven, and the new Signal Forms** — through a first-class `ControlValueAccessor`, and run cleanly in **zoneless** and SSR applications. You get production-ready masks out of the box: dates and times with validity checking, numbers with thousand separators and decimal precision, IP, CPF/CNPJ, secure/hidden input, plus fully custom patterns with prefixes, suffixes and multi-mask expressions. No runtime dependencies beyond Angular, ~15 KB gzipped — provide it once, bind `mask`, done.
## Table of Contents
- [Features](#features)
- [Demo](#demo)
- [Installation](#installation)
- [Version Compatibility](#version-compatibility)
- [Quick Start](#quick-start)
- [Standalone Applications](#standalone-applications)
- [NgModule-based Applications](#ngmodule-based-applications)
- [Contributing](#contributing)
## Features
NGX-MASK is a feature-rich input mask directive for Angular applications that provides:
<table>
<tr>
<td width="33%" valign="top">
### 🎯 Masking Patterns
• Custom patterns & expressions
• Multiple mask patterns (|)
• Built-in common patterns
• Prefix & suffix support
</td>
<td width="33%" valign="top">
### 🔢 Number Formatting
• Thousand separators
• Decimal markers
• Negative numbers
• Leading zeros
</td>
<td width="33%" valign="top">
### ⚡ Input Control
• Real-time validation
• Clear on non-match
• Show/hide mask typing
• Keep character positions
</td>
</tr>
<tr>
<td width="33%" valign="top">
### 📅 Date & Time
• Leading zero handling
• AM/PM support
• Custom separators
• Multiple formats
</td>
<td width="33%" valign="top">
### 🛠️ Customization
• Custom placeholders
• Special characters
• Transform functions
• Custom validation
</td>
<td width="33%" valign="top">
### 📋 Form Integration
• Reactive Forms
• ControlValueAccessor
• Built-in validation
• Standalone support
</td>
</tr>
</table>
## Demo
Check out our [live documentation and examples](https://nepipenkoigor.github.io/ngx-mask/)
## Installation
```bash
# For Angular 17 and above
$ npm install ngx-mask # Using npm
$ bun add ngx-mask # Using bun
# For specific Angular versions:
# Angular 16.x.x
$ npm install ngx-mask@16.4.2 # Using npm
$ bun add ngx-mask@16.4.2 # Using bun
# Angular 15.x.x
$ npm install ngx-mask@15.2.3 # Using npm
$ bun add ngx-mask@15.2.3 # Using bun
# Angular 14.x.x
$ npm install ngx-mask@14.3.3 # Using npm
$ bun add ngx-mask@14.3.3 # Using bun
# Angular 13.x.x or 12.x.x
$ npm install ngx-mask@13.2.2 # Using npm
$ bun add ngx-mask@13.2.2 # Using bun
```
> **Package Manager Note**: You can use either npm or bun based on your preference. Both package managers will work equally well with ngx-mask.
## Version Compatibility
NGX-MASK follows Angular's official support policy, supporting Active and LTS versions. Currently supported:
- Angular 17 and newer (latest features and updates)
- For older Angular versions, use the corresponding NGX-MASK version as specified above
> **Note**: Versions for Angular older than v17 will not receive new features or updates.
## Quick Start
`ngx-mask` ships as a standalone directive (`NgxMaskDirective`) and pipe (`NgxMaskPipe`) — there is no `NgxMaskModule` in current versions. Configuration is registered through one of two provider functions:
- **`provideEnvironmentNgxMask(config?)`** — application-wide config. Use it once in `bootstrapApplication` / `app.config.ts` (or a root `NgModule`'s `providers`).
- **`provideNgxMask(config?)`** — injector-level config. Use it in a component's or feature's `providers` to configure/override the options for that subtree only.
Directive inputs (e.g. `[thousandSeparator]`) always override any provider config. See [USAGE.md](USAGE.md#configuration) for the full decision guide, examples, and common pitfalls.
### Standalone Applications
#### Application-wide Setup with Default Config
```typescript
bootstrapApplication(AppComponent, { providers: [provideEnvironmentNgxMask()] }).catch((err) =>
console.error(err)
);
```
#### With Custom Configuration
```typescript
import { NgxMaskConfig } from 'ngx-mask';
const maskConfig: Partial<NgxMaskConfig> = { validation: false };
bootstrapApplication(AppComponent, { providers: [provideEnvironmentNgxMask(maskConfig)] }).catch(
(err) => console.error(err)
);
```
#### Feature-level Configuration
```typescript
@Component({
selector: 'my-feature',
standalone: true,
imports: [NgxMaskDirective],
providers: [provideNgxMask()],
})
export class MyFeatureComponent {}
```
### NgModule-based Applications
Module-based apps import the standalone directive/pipe into `imports` and register the provider function:
```typescript
import { NgxMaskDirective, NgxMaskPipe, provideEnvironmentNgxMask } from 'ngx-mask';
@NgModule({
imports: [NgxMaskDirective, NgxMaskPipe],
exports: [NgxMaskDirective, NgxMaskPipe],
providers: [provideEnvironmentNgxMask()],
})
export class AppModule {}
```
#### Migrating from ngx-mask ≤ 14 (`NgxMaskModule`)
`NgxMaskModule.forRoot()` / `forChild()` only exist in ngx-mask 14.x and older (Angular < 15):
```typescript
// Before (ngx-mask <= 14)
@NgModule({ imports: [NgxMaskModule.forRoot(maskConfig)] })
export class AppModule {}
// After (current ngx-mask)
@NgModule({
imports: [NgxMaskDirective],
providers: [provideEnvironmentNgxMask(maskConfig)],
})
export class AppModule {}
```
## Contributing
We welcome contributions! Please read our [contributing guidelines](CONTRIBUTING.md) to learn about our development process and how you can propose bugfixes and improvements.
---
<p align="center">Maintained by <a href="https://software.novines.eu">Igor Nepipenko</a></p>