Skip to content

danielytics/ominate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

Library to animate Om components

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published