transitions
Version:
promise-based transition util
124 lines (92 loc) • 3.57 kB
Markdown
[](http://github.com/badges/stability-badges)
Using promises for cleaner animation and transitional states.
This handles [views](
A view might look like this:
```js
var view = {
create: function(data) {
//e.g. render a template with data
},
show: function(data) {
//e.g. animate in a DIV
return Promise.delay(1000)
},
hide: function(data) {
//e.g. animate out a DIV
}
}
```
Now you can sequence events for this view by using `transitions`:
```js
//get a "state" which gracefully wraps missing functions
var state = transition(view, { /* template data */ })
//first we initialize the state
state.create()
//then we can animate it in
.then(state.show)
//and do some stuff while it's visible
.then(function() {
return Promise.delay(1000)
})
//and then animate out
.then(state.hide)
//and dispose of it
.then(state.dispose)
//and handle the callback when it's all done
.then(function() {
t.ok(true, 'async finished')
})
```
A "view" is just an object which may or may not expose any of the following asynchronous methods:
- `create` - called to instantiate the element
- `show` - called to show (animate in) the element
- `hide` - called to hide (animate out) the element
- `dispose` - called to dispose/destroy the element
## Usage
[](https://nodei.co/npm/transitions/)
#### `transitions(view[, data])`
Returns a new object with the functions `create`, `show`, `hide`, `dispose`. Calling any of them will return a promise for that view's function (or a fulfilled Promise if none exist).
```js
transition(view, { name: 'foo' }).create()
.then(function() {
console.log("view created")
})
```
Calls a view's `create()`, `show()`, etc functions with the specified `data`. If the view doesn't define the function, this will return a resolved Promise so it can be treated in the same way.
This is a convenience function to handle an array of views (or a single view) in parallel. The same can be achieved with `map` and `Promise.all`. Simple example:
```js
//say we are sending our "app" context as data to the views
var states = transitions.all(views, app)
states.create()
.then( states.show )
.then( app.doSomethingCool )
.then( states.hide )
.then( states.dispose )
```
If `views` is not an array, it will be made into a single-element array.
See the [test.js](test.js) and [demo](demo/index.js) for more examples of animating in parallel and in series.
The real beauty comes from composing transitions together in a functional manner. For example, a typical "carousel" might requires previous states to animate out and be disposed before animating in the next state.
```js
function carousel(prev, next) {
//previous and next views, or "dummy" views if they don't exist
var prevState = Transition(prev||{}, this)
var nextState = Transition(next||{}, this)
//sequencing
return prevState.hide()
.then(prevState.dispose)
.then(nextState.create)
.then(nextState.show)
}
coursel(views[i], views[i+1])
.then(doSomething)
```
MIT, see [LICENSE.md](http://github.com/mattdesl/transitions/blob/master/LICENSE.md) for details.