Ominate
Library to animate Om components
Install / Use
/learn @danielytics/OminateREADME
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.
Related Skills
node-connect
351.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
