Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/novaday-co/otp-input-vue

Fully customizable OTP input for web apps, compatible with Vue 2.x
https://github.com/novaday-co/otp-input-vue

input otp-input vue vuejs

Last synced: 10 days ago
JSON representation

Fully customizable OTP input for web apps, compatible with Vue 2.x

Awesome Lists containing this project

README

        




vue-logo


OTP-INPUT




Fully customizable OTP input for web apps, compatible with Vue 2.x




stars


license


forks


issues




Key Features
Installation
Props
Events
Styling
Contribute
License



otp-input.gif


## Key Features

- [x] Dynamic display modes - **Group** and **Separate**

- [x] Fully customizable style - **Input** , **wrapper** , **Active Input**, **Errors**

- [x] Direction of inputs - **RTL** / **LTR**

- [x] Dynamic Type - **Number** and **Text**

- [x] Dynamic **Number of inputs**

- [x] Your desired character as input **placeholder**

- [x] Controllable **gap** between inputs

- [x] **Disabled** inputs

- [x] **Error handling** - with customizable text

- [x] **Auto Focus** on inputs

- [x] **Password** input type

- [ ] **web-otp** - auto fill input from sms *(Coming soon ... )*

- [ ] **Vue 3.x** - compatible with vue 3.x *(Coming soon ... )*





## Installation


To install the latest stable version:

```bash
npm i otp-input-vue2
```

Basic Example :




just import to your component :

``` html



There is an error



import OtpInput from "otp-input-vue2";

export default {
name:"yourComponent",
components:{
OtpInput,
},
data(){
return {
isCodeValid: true,
};
},
methods: {
onCompleteHandler(code){
console.log("code completed", code);
this.isCodeValid = false;
},

onChangedHandler(lastEnteredCode){
console.log("code changed", lastEnteredCode);
this.isCodeValid = true;
},

onPasteHandler(code){
console.log("code pasted", code);
},
},

};


```

Expected output :



otp-input-error

## Props


Name
Type
Default
Description


id
String
"otp"
Id of opt input when you have multiple otp-inputs in a page.


digits
Number
5
Number of OTP inputs to be rendered.


mode
String
"separate"
Way of showing opt input, options: separate , group


type
String
"number"
Type of input data , options : number, text, password


placeholder
String
"-"
Placeholder of inputs where data places


radius
Number
5
Border radius of inputs (in both modes)


gap
Number
10
Gap between inputs (in both modes)


isDisabled
Boolean
false
Whether the input are Disabled or not


isValid
Boolean
true
Whether the entered value is valid or not

rtl
Boolean
false
Whether the input is RTL or not


autoFocus
Boolean
true
The input should be focused-on when page rendered or not


separateInputClass
String
-
Single input class in separate mode


separateWrapperClass
String
-
Inputs wrapper class in separate mode


groupInputClass
String
-
Single input class in group mode


groupWrapperClass
String
-
Inputs wrapper class in group mode


activeInputClass
String
-
Style of single input when its focused


activeWrapperClass
String
-
Style of inputs wrapper when its focused on one input


> **Note**
> Don't Panic! 😁 There is a guide to how use class props and style inputs as you wish, [see this guide](#styling).


## Events


Name
Description


on-complete
Return OTP value typed in inputs when all digits are completed


on-changed
Return Last single OTP value in inputs after typing


on-paste
its triggered when paste value in inputs




## Styling
To customize the appearance of the inputs, we can pass our classes to the component as props:

First we should know how to pass class to otp component and use it . there is several approach, we focus on **scoped CSS** with *deep selector* (you can do yours😉) :

Separate Mode :

template :
``` html

```
css :
``` CSS

.vue-otp-input >>> .separate-input-class {
text-align: center;
font-weight: bold;
font-size: 20px;
background-color: aquamarine;
color: blue;
border: solid 2px red;
width: 48px;
height: 48px;
}

.vue-otp-input >>> .separate-wrapper-class {
border: solid 3px green;
}

```
output:

Screenshot-2022-08-12-181410

Group Mode :



template :

``` html

```

css :

``` CSS

.vue-otp-input >>> .group-wrapper-class {
border: solid 3px green;
background-color: blue;
}

.vue-otp-input >>> .group-input-class {
background-color: blue;
border: none;
text-align: center;
font-weight: bold;
font-size: 20px;
color: #fff;
width: 48px;
height: 48px;
}

```

output :

Screenshot-2022-08-12-182437

---

Error Message :

template :
``` html


There is an error

```

css :
``` CSS

.vue-otp-input >>> .error-class {
color: #66ff00;
line-height: 1.5em;
font-weight: bold;
}

```
output :

Screenshot-2022-08-12-205308


Active input (focus) :




template :

``` html


```
css :
``` CSS

.vue-otp-input >>> .active-input-class {
text-align: center;
border-color: red !important;
transform: scale(1.2);
}

```

output :

Screenshot-2022-08-12-215955

or in group mode with `activeWrapperClass` prop :

Screenshot-2022-08-12-220828




## Contribute

You can help me and contribute for :

- New options

- Bug Fix

- Better exceptions

## License
MIT