Awesome
ominate
Animation for Om components
NOTE: This is still alpha - the API should not yet be considered stable! Suggestions welcome.
Usage
In your project.clj file, add
[ominate "0.1.2"]
Then require the namespaces:
(require '[ominate.core :refer [ominate]])
- the API entry point.
(require '[ominate.easing :as ease])
- easing functions (optional, defaults to
linear).
(require '[ominate.anims :as anims])
- pre-built animations (optional,
defaults to fading opacity).
Example
(ns example.core
(:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true]
[cljs.core.async :as async]
[ominate.core :refer [ominate]]
[ominate.easing :as ease]
[ominate.anims :as anims]))
(def animate (async/chan))
(def app-state (atom {:message "Hello, this is a test component!"}))
(defn example-component [props owner opts]
(om/component
(dom/div #js {:style #js {:width 500 :height 300 :background-color "#00f"}
:onClick #(async/put! animate true)}
(:message props))))
(om/root
(ominate
example-component
{:ch animate ; Channel used to trigger animation
:duration 5000 ; Animation will take 5 seconds to complete
:easing ease/sine-in ; Sine wave based easing function
:anim anims/fade ; Fade opacity of component
:repeat 2}) ; Repeat animation twice (total duration 10 seconds)
app-state
{:target (. js/document (getElementById "example-id"))})
Documentation
ominate
(defn ominate [component config]
...)
Animate Om component component
, applying options from map config
.
Wrap this function around the component you wish to animate before passing to
om/build
, om/build-all
or om/root
.
All config
options options have reasonable defaults and can be omitted. The
following options are available:
:ch
- a core.async channel used to trigger animations.
:duration
- the duration of the animation in milliseconds. Defaults to 1000.
:repeat
- the number of times to repeat the animation. Defaults to 0. Note
that the total length of time that the animation plays for will be :repeat
times :duration
.
:easing
- the easing funciton to apply. Defaults to ease/linear
.
:anim
- the animation to play. Defaults to anims/fade
.
:watch
- a predicate function to apply to the app-state cursor: (fn [props] ...)
. When the cursor's state is modified and this function returns true, the
animation will be triggered.
:notify
- a function (fn [name] ...)
that is called when the animation has
completed.
:name
- allows the animation to be named, so that notify functions can be used
for multiple animations and tell which animation completed. Also appended to the
om/IDisplayName
string.
Easing
The default easing function is ease/linear
.
Available easing funcitons are liner
, quad-*
, cube-*
, quart-*
,
quint-*
, sine-*
, circular-*
, exp-*
, elastic-*
, back-*
and
bounce-*
where *
can be one of in
, out
or in-out
.
Easing functions are functions take take in a value between 0 and 1 and return a
new modified value that is passed to the animations, eg (defn quad-in [v] (* v v))
.
The animation can be reversed by composing the easing function with
ease/reverse
.
For example: (comp ease/cube-in ease/reverse)
To play the animation one direction for the first half of the duration and then
reverse the direction for the second half of the duration, compose the easing
function with ease/forward-back
or ease/back-forward
.
Animations
Animations can be functions (fn [value dom-node] ...)
or maps:
{:on-frame (fn [value dom-node state] ...)
:on-begin (fn [dom-node] ...)
:on-end (fn [dom-node state] ...)}
Available animations are:
anims/fade
- fade the opacity of the component.
(anims/fade-color color)
- create a color overlay and fade its opacity
To apply any animation to an overlay, the (defn with-overlay [anim-fn style] ...)
is
provided. For example, anims/fade-color
is defined as:
(defn fade-color [color] (anims/with-overlay anim/fade {:background-color color :opacity 0}))
with-overlay
uses .-clientWidth
and .-clientHeight
to size the overlay, so it is the components responsibility to make sure these will return the correct size.
Known Bugs
The ease/elastic-*
and ease/bounce-*
easing functions are known to not be
working.
License
Copyright © 2014 Dan Kersten
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.