Shareable Vue transitions library
npm install @morev/vue-transitions!Promo image of @morev/vue-transitions package
!Stability of "master" branch

!Last commit
!Release version
!GitHub Release Date
!Keywords
Reusable interface transitions for Vue 2 and Vue 3 with no CSS needed ❤️
✔️ Highly customizable via props; \
✔️ Correctly works with grid/flex layouts in group mode; \
✔️ Considers initial styles of animated elements such as transform or opacity; \
✔️ Even more easy-to-use with universal Nuxt 2 and Nuxt 3 module.
* Demo
* Installation
* Requirements
* Using yarn
* Using npm
* Using pnpm
* Using bun
* Usage
* Global registration
* Custom options
* Direct import of components
* Usage with Nuxt
* IntelliSense
* List of transitions
* TransitionFade
* TransitionExpand
* TransitionSlide
* TransitionScale
* Props
* Common props
* Unique props of TransitionExpand
* Unique props of TransitionSlide
* Unique props of TransitionScale
* Events
* Node version: >= 18.0.0
* Nuxt version (if used): >= 2.17.0 || >= 3.5.0
The plugin will not work if you are using a Node or Nuxt version less than the specified ones.
---
``bash`
yarn add @morev/vue-transitions
---
`bash`
npm install @morev/vue-transitions
---
`bash`
pnpm add @morev/vue-transitions
---
`bash`
bun add @morev/vue-transitions
❗ Important note for Bun users
The package relies on postinstall hook to determine the Vue version and provide proper components. \trustedDependencies
By default, Bun does not execute lifecycle hooks,
so to make it work you need to manually add the package to the after installing and run bun install again.
`json`
{
"trustedDependencies": ["@morev/vue-transitions"]
}
---
> You may skip the following paragraphs if you are going to use the library with Nuxt. \
> Go to "Usage with Nuxt" section.
Package exports two versions of components:
* Version for Vue2 available with named export /vue2Vue3
* Version for available with named export /vue3
However, there is also a default export mapped to local version of Vue being used. \
Underhood, it utilized the postinstall npm hook. \
After installing the package, the script will start to check the installed Vue version
and redirect the exports to based on the local Vue version.
It feels pretty robust, but if you're worried about, prefer an explicit named import according to the version you're using.
> By the way, you can change default export after installation: just run the command vue-transitions-version-switch yarn
>
> * Example using : yarn vue-transitions-version-switch 2npx
> * Example using : npx vue-transitions-version-switch 3
#### Using Vue3
`js
import { createApp } from 'vue';
import { plugin as vueTransitionsPlugin } from '@morev/vue-transitions';
import '@morev/vue-transitions/styles';
const app = createApp(App);
app.use(vueTransitionsPlugin({
// Plugin options (optional, described below)
}));
`
#### Using Vue2
`js
import Vue from 'vue';
import { plugin as vueTransitionsPlugin } from '@morev/vue-transitions';
import '@morev/vue-transitions/styles';
Vue.use(vueTransitionsPlugin, {
// Plugin options (optional, described below)
});
`
😥 I got an error "This dependency was not found"
For environments that can't resolve exports field (such as Nuxt 2)
just replace styles import with direct path to file:
`diff`
- import '@morev/vue-transitions/styles';
+ import '@morev/vue-transitions/dist/index.css';
---
#### Custom options
> It's recommended to use the named export plugin instead of default export when setting custom options to get proper type information.
Custom options allows to change default property values. \
To change the defaults, pass the defaultProps key to the plugin settings, listing the key-value pairs of desired props. \componentDefaultProps
You may also change default props per-component, to do so just pass the key to plugin settings.
> Important: these props are not validated, so make sure you define them with right values.
`js
import { createApp } from 'vue';
import { plugin as vueTransitionsPlugin } from '@morev/vue-transitions';
import '@morev/vue-transitions/styles';
const app = createApp(App);
app.use(vueTransitionsPlugin({
// Default duration for all transitions now is 200
defaultProps: {
duration: 200,
},
// But for default duration is 500`
componentDefaultProps: {
TransitionExpand: {
duration: 500,
}
}
}));
---
`vue
Fade transition
`
The library exports a ready-to-use universal module for Nuxt 2 and 3 via named export /nuxt. \
Using Nuxt, it's recommended to use the module instead of manual installation because:
1. Nuxt allows to auto-import components on demand instead of global registration, which is a more performant option.
1. It's just faster to do :)
To use, add @morev/vue-transitions/nuxt to the modules section of your nuxt.config.ts / nuxt.config.js:
`ts`
export default defineNuxtConfig({
modules: [
'@morev/vue-transitions/nuxt',
],
vueTransitions: {
// The same options as in the plugin itself.
// You will get an autocomplete using Nuxt 3.
}
});
Enjoy you transition components! 🎉
> You may skip this section using Nuxt module - it does it for you.
>
> This section only applies to VSCode setup and global registration of components.
Using Vue 2 with Vetur
extension installed all components should provide hints as it, no actions required:
!Example of IntelliSense with VSCode and Vetur
Using Vue 3 with Volar
extension installed all components should provide hints as it, no actions required:
!Example of IntelliSense with VSCode and Volar
Basic transition that changes element opacity. Pretty simple.
Show code
`vue
...
`
---
Transition that manipulates with actual element size. \
If you are old enough you may know this transition as jQuery slideUp/slideDown. \
It also can work with X axis like slideLeft and slideRight
(although it's hard for me to come up with a scenario where it will really be needed).
Has unique prop: axis
---
Transition that manipulates with element position via transform: translate(). \offset
It requires prop to calculate desired element position and can work with percentage values.
Examples how to work with
offset prop
`vue
enter: [0, '-100%'],
leave: [0, '100%']
}"
>
`
It respects the transform applied to element itself via CSS and merges it with defined offset. \
It's very useful, for example, when you are trying to make centered dropdown.
👀 Show example of transform
merging
`vue
...
`
Has unique prop: offset
---
Transition that manipulates with element transform: scale(). \scale(1)
By default, it scales element from to scale(0), but this behavior can be customized via :scale prop. \
It works with different axis via axis prop.
Has unique props: scale, axis, origin
Show example of code
`vue
`
Those properties are related to each transition:
group
Whether the component should be a transition-group component.
`ts`
export type TransitionGroup = boolean; // Default: false
Example:
`vue`
...
tag
Transition tag, in the case of using a transition-group component.
`ts`
export type TransitionTag = string; // Default: 'span'
Example:
` vue`
appear
Whether to apply a transition on the initial render of a node.
Acts literally the same as original
Vue transition appear prop
`ts`
export type TransitionAppear = boolean; // Default: undefined
Example:
`vue`
...
mode
`ts`
export type TransitionMode = 'in-out' | 'out-in' | undefined; // Default: undefined
Example:
`vue`
duration
Transition animation duration, ms. \
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts`
// Default: 300
export type TransitionDuration = number | { enter: number, leave: number }
Example:
` vue`
...
...
move-duration
Duration of animation of elements positions changing, in the case of using a transition-group.
Although Vue does not have a native way to set the duration of the move animation via props, this task can be done using
CSS Custom Properties.
👀 Show explanation
`html`
`css`
.scale-move {
transition-duration: var(--move-duration, 300ms);
}
`ts`
// Default: 300
export type TransitionMoveDuration = number;
delay
Transition animation delay, ms.\
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts`
// Default: 300
export type TransitionDelay = number | { enter: number, leave: number };
Example:
` vue`
...
...
easing
Transition animation easing. Should be a valid CSS transition timing function. \
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts`
export type TransitionEasing = string; // Default: 'cubic-bezier(.25, .8, .5, 1)'
Example:
` vue`
...
enter: 'cubic-bezier(0.6, 0, 0.4, 2)',
leave: 'ease-out'
}"
>
...
no-opacity
Whether to not animate the element opacity.
By default, each transition manipulates opacity in addition to the main property. \
However, sometimes this is not required - for example, when implementing modal panels that appear from the edge of the screen.
> The prop is obviously not applicable to transition-fade component.
`ts`
export type TransitionNoOpacity = boolean; // Default: false
Example:
`vue
...
`
no-move
Whether to not animate elements positions changing, in the case of using a transition-group.
By default, when using group mode, when an element is removed, the remaining elements smoothly change their position. \
They are given absolute positioning and dropped out of the flow, so the parent container collapses in height.
Usually this is not a problem, but sometimes - for example, when using transition-expand and
sequentially placed elements under each other, it looks rough. \
With this option, you can achieve a more pleasant behavior of the elements in this situation.
`ts`
export type TransitionNoMove = boolean; // Default: false
Example:
`vue`
---
axis
Axis by which the element should expand. \
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts`
type ExpandAxisValue = 'x' | 'y'; // Default: 'y'
export type TransitionExpandAxis = ExpandAxisValue | { enter: ExpandAxisValue, leave: ExpandAxisValue }
---
offset
The element offset by x and y axis before/after the transition. \'100%'
Should be an integer or a string representation of percentage value (e.g. ).
Number values treats as px offset, string values ending with % sign treats as percentage of the element width / height. \
Examples and explanation
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts
type SlideOffsetValue = [number | string, number | string];
// Default: [0, -16]
export type TransitionSlideOffset = SlideOffsetValue | { enter: SlideOffsetValue, leave: SlideOffsetValue }
`
---
axis
Scale axis to be animated.
* both (uses transform: scale())x
* (uses transform: scaleX())y
* (uses transform: scaleY())
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts
type ScaleAxisValue = 'x' | 'y' | 'both';
// Default: 'both'
export type TransitionScaleAxis = ScaleAxisValue | { enter: ScaleAxisValue, leave: ScaleAxisValue }
`
origin
transform-origin CSS property applied to element(s). \
If an object given then enter and leave values will be used for enter and leave transition respectively.
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts`
// Default: '50% 50%'
export type TransitionScaleAxis = string | { enter: string, leave: string }
scale
The element scale value before/after the transition. Should be a number between 0 and 1.
If an object given then enter and leave values will be used for enter and leave transition respectively.
If an object given then enter and leave values will be used for enter and leave transition respectively.
`ts`
// Default: 0
export type TransitionScaleScale = number | { enter: number, leave: number }
---
Components do not provide any special events,
but trigger all standard transition events:
* before-enterenter
* after-enter
* enter-cancelled
* before-leave
* leave
* after-leave
* enter-leave`
*