##clojurescript
My first experiences with ClojureScript culminated in Pinot a library the provided the basic building blocks for creating websites in CLJS. It was, however, a monolithic conglomeration of all the random things I built along the way. To cure this, I broke Pinot apart into the following libraries:
##jayq
Pronounced “jake” is a jquery wrapper that makes jquery objects work just like normal clojure collections.
(ns myapp
(:use [jayq.core :only [$ css inner]]))
(def $interface ($ :#interface))
(-> $interface
(css {:background "blue"})
(inner "Loading!"))
##waltz
A state management library that lets you build very complex interactions without ending up in the tar pit.
(def me (state/machine "cool")
(defstate me :loading
(in [] (show $loading))
(out [] (hide $loading)))
(defstate me :normal
(in [v]
(inner $value v)
(wait delay #(transition me :update))))
(deftrans me :update []
(state/set me :loading)
(store/latest [:metrics (:metric params)]
#(transition me :set %)))
(deftrans me :set [v]
(state/unset me :loading)
(state/set me :normal v))
(transition me :update)
##fetch
A library to make client/server interaction painless. Includes the pinot.remotes stuff as well as the start of a lazy-store implementation that works like a map where the values are fetched from the server lazily.
(ns playground.client.test
(:require [fetch.remotes :as remotes])
(:require-macros [fetch.macros :as fm]))
(fm/remote (adder 2 5 6) [result]
(js/alert result))
(fm/remote (get-user 2) [{:keys [username age]}]
(js/alert (str "Name: " username ", Age: " age)))
;; for a much nicer experience, use letrem
(fm/letrem [a (adder 3 4)
b (adder 5 6)]
(js/alert (str "a: " a " b: " b)))
##crate
An implementation of hiccup over dom objects.
(ns overtoneinterface.client.main
(:require [crate.core :as crate])
(:use-macros [crate.macros :only [defpartial]]))
(defpartial button [{:keys [label action param]}]
[:a.button {:href "#" :data-action action :data-param param} label])
##monet
A visual library for ClojureScript to make it easier (and performant) to work with canvas/visuals.
(ns game.core
(:require [monet.canvas :as canvas])
(canvas/add-entity :background
(canvas/entity {:x 0 :y 0 :w 600 :h 600}
nil ;;update function
(fn [ctx box]
(-> ctx
(canvas/fill-style "#191d21")
(canvas/rect box)))))
(canvas/init (.get ($ :#canvas) 0))