Vue component that simulates a user typing, selecting, and erasing text.
Play with vue-typer in this interactive demo.
VueTyper has a single dependency to lodash.split to support emojis and other multi-codepoint Unicode characters. Apart from this, VueTyper does not have any direct dependencies to any other library or framework -- not even to Vue itself! All required Vue API calls are made through Vue's
this.$*
context methods. This means VueTyper can only execute within a Vue application context, but in exchange, it does not need to pull in Vue, which keeps VueTyper lightweight.
Use this method if you wish to import/require VueTyper as a module.
npm install --save vue-typer
Use this method if you wish to access VueTyper globally via window.VueTyper
.
<script src="https://unpkg.com/vue-typer/dist/vue-typer.min.js"></script>
After installing VueTyper, you may choose to register it either globally or locally. What's the difference? See the Vue documentation here.
// ES6
import { VueTyper } from 'vue-typer'
// CommonJS
var VueTyper = require('vue-typer').VueTyper
// Global
var VueTyper = window.VueTyper.VueTyper
var MyComponent = {
// ...
components: {
// ES6; property shorthand + Vue should automatically dasherize the key for us
VueTyper
// pre-ES6
'vue-typer': VueTyper
}
}
<vue-typer text='Hello World! I was registered locally!'></vue-typer>
// ES6
import VueTyperPlugin from 'vue-typer'
// CommonJS
var VueTyperPlugin = require('vue-typer').default
// Global
var VueTyperPlugin = window.VueTyper.default
Vue.use(VueTyperPlugin)
<vue-typer text='Hello World! I was registered globally!'></vue-typer>
It may be helpful to play around with these props in the interactive demo.
text
type: String || Array
required
validator: Non-empty
Usage:
<vue-typer text='watermelon'></vue-typer>
Either a single string, or an ordered list of strings, for VueTyper to type. Strings will not be trimmed.
Note: Dynamically changing this value after VueTyper has mounted will cause VueTyper to reset itself and start typing from scratch.
See also: shuffle
repeat
type: Number
default: Infinity
validator: Non-negative
Usage:
<vue-typer text='watermelon' :repeat='0'></vue-typer>
Number of extra times to type text
after the first time. Setting 0 will type text
once; 1 will type twice; Infinity will type forever.
Note: Dynamically changing this value after VueTyper has mounted will cause VueTyper to reset itself and start typing from scratch.
shuffle
type: Boolean
default: false
Usage:
<vue-typer text='watermelon' :shuffle='true'></vue-typer>
Randomly shuffles text
(using the Fisher-Yates shuffle) before typing it. If repeat > 0
, text
will always be shuffled before repeated typings. text
is not shuffled after every word is typed. This implies that:
text
will be typed the same number of times, but just in a shuffled ordertext=['a','b']
, a,b will be printed 50% of the time, and b,a the other 50%text=['a','b','c']
, there are 3!=6 possible permutations, and they will each be printed 100%/6=16.7% of the timetext
contains duplicate strings, orrepeat > 0
, text
is typed where the last word is W, and the next repeat typing shuffled text
such that it starts with W.Note: Dynamically changing this value after VueTyper has mounted will cause VueTyper to reset itself and start typing from scratch.
initialAction
type: String
default: "typing"
validator: "typing"
|| "erasing"
Usage:
<vue-typer text='watermelon' initial-action='erasing'></vue-typer>
typing
starts VueTyper off in the "typing" state; there will be empty space as VueTyper begins to type the first string in text
.
erasing
starts VueTyper off in the "erasing" state; the first string in text
will already be typed and visible as VueTyper begins to erase it.
preTypeDelay
type: Number
default: 70
validator: Non-negative
Usage:
<vue-typer text='watermelon' pre-type-delay='1000'></vue-typer>
Milliseconds to wait before typing the first character of every string in text
.
This is useful to have an idle period to show a blank space for a period of time before VueTyper types the first character.
typeDelay
type: Number
default: 70
validator: Non-negative
Usage:
<vue-typer text='watermelon' type-delay='100'></vue-typer>
Milliseconds to wait after typing a character, until the next character is typed.
preEraseDelay
type: Number
default: 2000
validator: Non-negative
Usage:
<vue-typer text='watermelon' pre-erase-delay='1000'></vue-typer>
Milliseconds to wait after a string is fully typed, until the first erase action (i.e. backspace, highlight) is performed.
This is useful to have an idle period that gives users time to read the typed string before it is erased.
eraseDelay
type: Number
default: 250
validator: Non-negative
Usage:
<vue-typer text='watermelon' erase-delay='70'></vue-typer>
Milliseconds to wait after performing an erase action (i.e. backspace, highlight), until the next erase action can start.
eraseStyle
type: String
default: "select-all"
validator: "backspace"
|| "select-back"
|| "select-all"
|| "clear"
Usage:
<vue-typer text='watermelon' erase-style='backspace'></vue-typer>
backspace
erases one character at a time, simulating the backspace key.
select-back
highlights backward one character at a time, simulating Shift+LeftArrow, and erases everything once all characters are highlighted.
select-all
immediately highlights all characters at once, simulating Ctrl/Cmd+A, and erases all characters afterwards.
clear
immediately erases all characters at once; the typed string simply disappears.
eraseOnComplete
type: Boolean
default: false
Usage:
<vue-typer text='watermelon' :erase-on-complete='true'></vue-typer>
By default, after VueTyper completes all its typing (i.e. it finishes typing all strings in text
, repeat+1
times), the last typed string will not be erased and stay visible. Enabling this flag will tell VueTyper to erase the final string as well.
Note: Has no effect if repeat === Infinity
.
caretAnimation
type: String
default: "blink"
validator: "solid"
|| "blink"
|| "smooth"
|| "phase"
|| "expand"
Usage:
<vue-typer text='watermelon' caret-animation='smooth'></vue-typer>
Specifies a built-in caret animation to use, similar to Sublime and VS Code animations.
Note: Alternatively, custom animations can be applied via CSS.
See also: Styles, Example Custom Caret Animation
typed
Event data:
String
typedStringUsage:
<vue-typer text='watermelon' @typed='onTyped'></vue-typer>
{
...
methods: {
onTyped: function(typedString) {
// handle typed string
}
}
}
Emitted everytime VueTyper finishes typing a string.
typed-char
Event data:
String
typedCharNumber
typedCharIndexUsage:
<vue-typer text='watermelon' @typed-char='onTypedChar'></vue-typer>
{
...
methods: {
onTypedChar: function(typedChar, typedCharIndex) {
// handle typed character at the given index
// call #1: 'w', 0
// call #2: 'a', 1
// call #3: 't', 2
// ...
}
}
}
Emitted everytime VueTyper finishes typing a single character.
erased
Event data:
String
erasedStringUsage:
<vue-typer text='watermelon' @erased='onErased'></vue-typer>
{
...
methods: {
onErased: function(erasedString) {
// handle erased string
}
}
}
Emitted everytime VueTyper finishes erasing a string.
completed
Usage:
<vue-typer text='watermelon' @completed='onComplete'></vue-typer>
{
...
methods: {
onComplete: function() {
// handle event when VueTyper has finished all typing/erasing
}
}
}
Emitted when VueTyper has finished typing all words in text
, repeat
+1
times.
Note: If eraseOnComplete
is enabled, the final typed string must also be erased before this event is emitted.
To keep the separation of concern between component code and styles, VueTyper can be fully styled through CSS (as opposed to props).
The following is a skeleton selector structure to override the style of each component of VueTyper.
Usage:
/* SCSS */
.vue-typer {
/* Styles for the vue-typer container
e.g. font-family, font-size */
.custom.char {
/* Styles for each character
e.g. color, background-color */
&.typed {
/* Styles specific to typed characters
i.e. characters to the left of the caret */
}
&.selected {
/* Styles specific to selected characters
i.e. characters to the right of the caret while VueTyper's
'eraseStyle' is set to a selection-based style */
}
&.erased {
/* Styles specific to erased characters
i.e. characters to the right of the caret while VueTyper's
'eraseStyle' is set to a non-selection-based style */
}
}
.custom.caret {
/* Styles for the caret
e.g. background-color, animation, display */
&.pre-type {
/* Styles for the caret when it is idle before typing
i.e. before a string starts being typed, during 'preTypeDelay' */
}
&.pre-erase {
/* Styles for the caret when it is idle before erasing
i.e. before a string starts being erased, during 'preEraseDelay' */
}
&.idle {
/* Styles for the caret when it is idle, but VueTyper has not yet completed typing
i.e. when 'pre-type' or 'pre-erase' is set, but not 'complete' */
}
&.typing {
/* Styles for the caret while VueTyper is typing
i.e. when the caret is moving forwards */
}
&.selecting {
/* Styles for the caret while VueTyper is selecting
i.e. when the caret is moving backwards and 'eraseStyle' is
set to a selection-based style */
}
&.erasing {
/* Styles for the caret while VueTyper is erasing
i.e. when the caret is moving backwards and 'eraseStyle' is
set to a non-selection-based style */
}
&.complete {
/* Styles for the idle caret when VueTyper has finished all typing/erasing */
}
}
}
Note: Some of the default styles above make things hidden using display: none;
. If you wish to make it visible again, use display: inline-block;
. Do not use block
.
See also: CSS Examples
develop
branch.Changes for each release will be documented here.
Copyright © 2016-Present, Chris Nguyen. All rights reserved.