     (move-camera-on-swipe! gesture-manager current-state animation-subject)
     (switch-zoom-on-spacebar! current-state animation-subject)
     (zoom-on-pinch! gesture-manager current-state animation-subject)
-    (zoom-in-on-tap! gesture-manager current-state animation-subject)
-    (select-node-on-tap! gesture-manager current-state animation-subject)))
+    (zoom-and-select-on-tap! gesture-manager current-state animation-subject)))

    {:node @closest-node
     :distance (js/Math.sqrt @closest-distance-sq)}))

(defn select-node-on-tap! [manager current-state animation-observable]
  (let [taps (tap-observable manager)]
    (-> taps
        (suppress-while-animating animation-observable)
        (.map #(closest-node @current-state %))
        (.filter #(< (:distance %) (/ hitbox-size 2)))
        (.subscribe (fn [{:keys [node]}]
                      (if (= (:projection @current-state) :fisheye)
                        (select-and-zoom-to-node! current-state node)))))))

;; Exported function to do magic


  (.map (gesture-observable manager "tap")
        (fn [e] (v/create (-> e .-center .-x) (-> e .-center .-y)))))

(defn svg-element-position [svg elem]
  (let [box (.getBoundingClientRect elem)
        center-x (+ (.-left box) (/ (.-width box) 2))
