Skip to content

Commit

Permalink
api updates
Browse files Browse the repository at this point in the history
  • Loading branch information
ludbek committed Apr 28, 2016
1 parent 3fd7a76 commit 0f71c7e
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 30 deletions.
2 changes: 1 addition & 1 deletion dist/mithril-fx.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 45 additions & 12 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ var getArray = function (arrayLike) {
return args
}

var events = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'
var events = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend'

module.exports = function () {
// fx(node, attrs, data)
if (_.isString(arguments[0]) && arguments.length >= 2) {
module.exports = {
// fx.mount(node, attrs, data)
mount: function () {
var vdom = getVDOM(arguments)

var animate = function (el, initialized, ctx) {
Expand All @@ -37,9 +37,11 @@ module.exports = function () {
}

return m(vdom.tag, vdom.attrs, vdom.children)
}
// fx(boolean, node, attrs, data)
else if (_.isBoolean(arguments[0])) {
},

// fx.toggle(boolean, node, attrs, data)
toggle: function () {
if (!_.isBoolean(arguments[0])) throw "The first argument to fx.toggle must be a boolean value."
var value = arguments[0]
var vdom = getVDOM(getArray(arguments))

Expand All @@ -58,13 +60,13 @@ module.exports = function () {

if (ctx.state === value) return
if (value) {
var className = 'fx show'
var className = 'fx true'
dom.css('display', 'block')
dom.addClass(className)
.one(events, function () {dom.removeClass(className)})
}
else {
var className = 'fx hide'
var className = 'fx false'
dom.addClass(className)
.one(events, function () {
dom.removeClass(className)
Expand All @@ -82,9 +84,12 @@ module.exports = function () {
}

return m(vdom.tag, vdom.attrs, vdom.children)
}
// fx(array, callback)
else if(_.isArray(arguments[0], arguments.length === 2)) {
},

// fx.map(array, callback)
map: function () {
if (!_.isArray(arguments[0])) throw "The first argument to fx.map() must be an array."
if (!_.isFunction(arguments[1])) throw "The second argument to fx.map() must be a function."
var data = arguments[0], callback = arguments[1]

var elements = _.map(data, callback)
Expand Down Expand Up @@ -135,5 +140,33 @@ module.exports = function () {

return delement
})
},

change: function () {
var value = arguments[0]
var vdom = getVDOM(getArray(arguments))

var animate = function (el, initialized, ctx) {
if (ctx.state === value) return

var dom = $(el)
var changeClass = 'fx change'

if (ctx.state && !_.isEqual(ctx.data, value)) {
dom.addClass(changeClass)
.one(events, function () {dom.removeClass(changeClass)})
}

ctx.state = _.clone(value, true)
}

var originalConfig = vdom.attrs.config
vdom.attrs.config = function (el, init, ctx, dom) {
if (originalConfig) originalConfig.call(vdom, el, init, ctx, dom)
animate.call(vdom, el, init, ctx, dom)
}

return m(vdom.tag, vdom.attrs, vdom.children)

}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mithril-fx",
"version": "1.0.1",
"version": "2.0.0",
"description": "UI animation for Mithril.js",
"main": "index.js",
"scripts": {
Expand Down
41 changes: 30 additions & 11 deletions playground/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@
<script type="text/javascript" src="../node_modules/mithril/mithril.min.js"></script>
<script type="text/javascript" src="../node_modules/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="../node_modules/lodash/lodash.min.js"></script>
<script type="text/javascript" src="../dist/mithril.fx.js"></script>
<script type="text/javascript" src="../dist/mithril-fx.js"></script>
<style type="text/css">
div.box {
height: 70px;
width: 70px;
background-color: #f23;
}

.list {
position: relative;
}

.fx {
animation-duration: 0.3s;
}
Expand All @@ -24,11 +28,11 @@
animation-name: slideInRight;
}

.fx.hide {
.fx.false {
animation-name: bounceOut;
}

.fx.show {
.fx.true {
animation-name: bounceIn;
}

Expand All @@ -38,12 +42,19 @@
h2.fx.change {
animation-name: shake;
}
h2.fx.move.high {
h2 {
/*transition:top 1s linear;*/
}
.list h2.fx.move.high {
animation-name: slideInUp;
}
h2.fx.move.low {
.list h2.fx.move.low {
animation-name: slideInDown;
}

h3.date.fx.change {
animation-name: shake;
}
</style>
</head>
<body>
Expand All @@ -55,6 +66,7 @@
toggleDisplay: function () {
this.display = !this.display
},
date: Date.now(),
data: [
{id: 1, name: "Sun"},
{id: 2, name: "Moon"},
Expand All @@ -69,24 +81,31 @@
},
swapContents: function () {
var tmp = this.data[0]
this.data[0] = this.data[2]
this.data[2] = tmp
this.data[0] = this.data[1]
this.data[1] = tmp
},
changeData: function () {
this.date = Date.now()
}
}
},
view: function (c) {
return fx('.root',
return fx.mount('.root',
m("h1", "TOGGLE ANIMATION"),
m("button", {onclick: c.toggleDisplay.bind(c)}, "Toggle"),
fx(c.display, "div.box", "Toggle this element."),
fx.toggle(c.display, "div.box", "Toggle this element."),
m("h1", "CHANGE IN DATA"),
m("button", {onclick: c.changeData.bind(c)}, "Change"),
fx.change(c.date, "h3.date", c.date),
m("h1", "LIST"),
m("div",
m("button", {onclick: c.addContent.bind(c)}, "Add"),
m("button", {onclick: c.changeContent.bind(c)}, "Change"),
m("button", {onclick: c.swapContents.bind(c)}, "Swap")),
fx(c.data, function (planet) {
m(".list",
fx.map(c.data, function (planet) {
return m("h2", planet.name)
}))
})))
}
}

Expand Down
13 changes: 8 additions & 5 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
var fx = require('mithril-fx')

// Mount - animates fresh element being attached to DOM
fx(tag, attrs, data)
fx.mount(tag, attrs, children)

// Toggle - animates an element based upon the a boolean value
fx(boolean, tag, attrs, data)
// Toggle - animates an element based upon a boolean value
fx.toggle(boolean, tag, attrs, children)

// List - animates elements being added, changed, moved
fx(list, callback)
// Data change - animates when data bound to an element changes
fx.change(data, tag, attrs, children)

// Array - animates elements being added, changed, moved
fx.map(array, callback)
```

# TODO
Expand Down

0 comments on commit 0f71c7e

Please sign in to comment.