 
 ;; ## Attributes, Styles & Events
 
+(defn- set-attr! [elem attr-name attr-value]
+  (.setAttribute elem attr-name attr-value))
+
+(defn- remove-attr! [elem attr-name]
+  (.removeAttribute elem attr-name))
+
 (defn- set-style-prop! [elem prop-name prop-value]
-  (let [prop-name (name prop-name)]
-    (aset (.-style elem) prop-name (str prop-value))))
-
-(defn- set-attr! [elem attr-name attr-value]
-  (let [attr-name (name attr-name)]
-    (.setAttribute elem attr-name attr-value)))
+  (aset (.-style elem) prop-name (str prop-value)))
+
+(defn- remove-style-prop! [elem prop-name]
+  (js-delete (.-style elem) prop-name))
 
 (defn- on-value-ref-invalidated* [set-fn element state-prefix attr-name ref node-state]
   (when-let [[add-watch* remove-watch*] (r/get-add-remove-watch* ref)]

(defn- do-show-element [parent new-elem cur-elem]
  (when new-elem
    (let [show (get-transition new-elem :node-attached)
          new-elem (replace-or-append-child parent new-elem cur-elem)]
      (when show
        (show new-elem)
        new-elem)

  (let [virtual-dom (get-virtual-dom elem-spec)
        node
        (if (string? virtual-dom)
          (.createTextNode js/document virtual-dom)
          (let [virtual-dom (normalize-virtual-element virtual-dom)
                node (create-dom-node (first virtual-dom))
                state (init-element-state! node elem-spec)
                attrs? (second virtual-dom)
                attrs (when (map? attrs?) attrs?)
