diff --git a/resources/public/index.html b/resources/public/index.html index a422a72..123a00f 100644 --- a/resources/public/index.html +++ b/resources/public/index.html @@ -8,7 +8,7 @@
- - + + \ No newline at end of file diff --git a/src/clojure/freactive/dom.cljs b/src/clojure/freactive/dom.cljs index f22e418..12ac29c 100644 --- a/src/clojure/freactive/dom.cljs +++ b/src/clojure/freactive/dom.cljs @@ -261,7 +261,7 @@ (defn- bind-style-prop! [element attr-name attr-value node-state] (let [setter (fn [v] - (println "setting style" element attr-name v) + ;(println "setting style" element attr-name v) (set-style-prop! element attr-name v))] (if (satisfies? cljs.core/IDeref attr-value) (bind-attr* setter element "style" attr-name attr-value node-state) @@ -331,9 +331,11 @@ (fn [attr-value] (.setAttribute element attr-name - (if (.-substring attr-value) - attr-value - (.toString attr-value)))))) + (if attr-value + (if (.-substring attr-value) + attr-value + (.toString attr-value)) + ""))))) (defn- bind-attr! [element attr-name attr-value node-state] (let [attr-name (name attr-name)] @@ -541,7 +543,8 @@ (defn- try-diff [parent vdom cur-dom-node top-level] (let [cur-vdom (get-virtual-dom cur-dom-node) - vdom (normalize-virtual-element vdom)] + ;;vdom (normalize-virtual-element vdom) + ] (if (keyword-identical? (first vdom) (first cur-vdom)) (let [old-attrs? (second cur-vdom) new-attrs? (second vdom) @@ -643,12 +646,12 @@ ;; Reactive Element Handling -;(def ^:private auto-reactive-id 0) -; -;(defn- new-reactive-id [] -; (let [id auto-reactive-id] -; (set! auto-reactive-id (inc auto-reactive-id)) -; (str "-r." id))) +(def ^:private auto-reactive-id 0) + +(defn- new-reactive-id [] + (let [id auto-reactive-id] + (set! auto-reactive-id (inc auto-reactive-id)) + (str "-r." id))) (deftype ReactiveElement [id parent cur-element dirty updating disposed animate invalidate] IRemove @@ -659,9 +662,10 @@ (when-let [parent-state (get-element-state parent)] (unregister-from-parent-state parent-state id)))) -(defn- bind-child [parent child-ref before] +(defn- bind-child* [parent child-ref before insert-child* replace-child* remove*] (if-let [[add-watch* remove-watch*] (r/get-add-remove-watch* child-ref)] - (let [state (ReactiveElement. nil parent nil false false false nil nil) + (let [id (new-reactive-id) + state (ReactiveElement. id parent nil false false false nil nil) get-new-elem (fn [] (set! (.-dirty state) false) @@ -671,8 +675,8 @@ show-new-elem (fn [new-elem cur] (let [new-node (if cur - (replace-child parent new-elem cur true) - (append-or-insert-child parent new-elem before))] + (replace-child* parent new-elem cur true) + (insert-child* parent new-elem before))] (set! (.-cur-element state) new-node) (set! (.-updating state) false) (when (.-dirty state) @@ -694,7 +698,7 @@ (fn [] (if (.-disposed state) (do - (remove-dom-node cur) + (remove* cur) (set! (.-updating cur) false)) (let [new-elem (if (.-dirty state) (get-new-elem) @@ -718,21 +722,18 @@ (when-let [binding-disposed (get (meta child-ref) :binding-disposed)] (set! (.-disposed-callback state) binding-disposed)) (when-let [parent-state (get-element-state parent)] - (register-with-parent-state parent-state "-reactive" state)) + (register-with-parent-state parent-state (str "-reactive" id) state)) (when-let [binding-initialized (get (meta child-ref) :binding-initialized)] (binding-initialized)) (set! (.-updating state) false) - ;(let [new-node (append-or-insert-child parent (get-new-elem) before)] - ; (set! (.-cur-element state) new-node) - ; (when-let [node-mounted (get-transition new-node :node-attached)] - ; (node-mounted new-node)) - ; (when (.-dirty state) - ; (queue-animation (.-animate state)))) (show-new-elem (get-new-elem) nil) state) (mount-element parent @child-ref before))) +(defn bind-child [parent child before] + (bind-child* parent child before append-or-insert-child replace-child remove-dom-node)) + ;; Building Elements (defn insert-child! [parent child before] @@ -756,7 +757,7 @@ (defn build-element [elem-spec] (let [virtual-dom (get-virtual-dom elem-spec)] - (println virtual-dom) + ;(println virtual-dom) (cond (string? virtual-dom) (.createTextNode js/document virtual-dom) diff --git a/src/clojure/freactive/units.cljs b/src/clojure/freactive/units.cljs new file mode 100644 index 0000000..de9226d --- /dev/null +++ b/src/clojure/freactive/units.cljs @@ -0,0 +1,74 @@ +(ns freactive.units) + +(defprotocol IUnit + (-read-value [this cur-value-str]) + (-get-writer [this]) + (-cur-value [this])) + +(deftype Pixel [x] + Object + (toString [_] (str x "px")) + + IUnit + (-get-writer [_] (fn [y] (str y "px"))) + (-read-value [this cur-value-str]) + (-cur-value [_] x)) + +(defn px [x] (Pixel. x)) + +(deftype Translate [x y] + Object + (toString [_] (str "translate(" x "px," y "px")) + + IUnit + (-get-writer [_] (fn [v] (str "translate(" (aget v 0) "px," (aget v 1) "px"))) + (-read-value [this cur-value-str]) + (-cur-value [_] #js [x y])) + +(defn translate [x y] (Translate. x y)) + + +(deftype Scale [x] + Object + (toString [_] (str "scale(" x ")")) + + IUnit + (-get-writer [_] (fn [y] (str "scale(" y ")"))) + (-read-value [this cur-value-str]) + (-cur-value [_] x)) + +(defn scale [x] (Scale. x)) + +(deftype Rotate [x] + Object + (toString [_] (str "rotate(" x "deg)")) + + IUnit + (-get-writer [_] (fn [y] (str "rotate(" y "deg)"))) + (-read-value [this cur-value-str]) + (-cur-value [_] x)) + +(defn rotate [x] (Rotate. x)) + +;(defn transform []) + +(deftype SVGTranslateX [x] + Object + (toString [_] (str "translate(" x ")")) + + IUnit + (-get-writer [_] (fn [x] (str "translate(" x ")"))) + (-read-value [this cur-value-str]) + (-cur-value [_] x)) + +(deftype SVGTranslate [x y] + Object + (toString [_] (str "translate(" x "," y ")")) + + IUnit + (-get-writer [_] (fn [v] (str "translate(" (aget v 0) "," (aget v 1) ""))) + (-read-value [this cur-value-str]) + (-cur-value [_] #js [x y])) + +(defn svg-translate +