     [orig-pos orig-x orig-y dest-pos dest-x dest-y]))
 
 
+(mf/defc interaction-marker
+  [{:keys [x y arrow-dir zoom] :as props}]
+  (let [arrow-pdata (case arrow-dir
+                      :right "M -5 0 l 8 0 l -4 -4 m 4 4 l -4 4"
+                      :left "M 5 0 l -8 0 l 4 -4 m -4 4 l 4 4"
+                      [])
+        inv-zoom (/ 1 zoom)]
+    [:*
+      [:circle {:cx 0
+                :cy 0
+                :r 8
+                :stroke "#31EFB8"
+                :stroke-width 2
+                :fill "#FFFFFF"
+                :transform (str
+                             "scale(" inv-zoom ", " inv-zoom ") "
+                             "translate(" (* zoom x) ", " (* zoom y) ")")}]
+      (when arrow-dir
+        [:path {:stroke "#31EFB8"
+                :fill "transparent"
+                :stroke-width 2
+                :d arrow-pdata
+                :transform (str
+                             "scale(" inv-zoom ", " inv-zoom ") "
+                             "translate(" (* zoom x) ", " (* zoom y) ")")}])]))
+
+
 (mf/defc interaction-path
-  [{:keys [orig-shape dest-shape dest-point selected selected?] :as props}]
+  [{:keys [orig-shape dest-shape dest-point selected selected? zoom] :as props}]
   (let [[orig-pos orig-x orig-y dest-pos dest-x dest-y]
         (if dest-shape
           (connect-to-shape orig-shape dest-shape)

                                  :orig-shape shape
                                  :dest-shape dest-shape
                                  :selected selected
                                  :selected? false}])))

      (if (and draw-interaction-to first-selected)
        [:& interaction-path {:key "interactive"
                              :orig-shape first-selected
                              :dest-point draw-interaction-to
                              :selected? true}]

        (for [shape selected-shapes]
          (let [interaction (get-click-interaction shape)

        path ["M" orig-x orig-y "C" (+ orig-x orig-dx) orig-y (+ dest-x dest-dx) dest-y dest-x dest-y]
        pdata (str/join " " path)

        arrow-dir (if (= dest-pos :left) :right :left)]

    (if-not selected?
      [:path {:stroke "#B1B2B5"
              :fill "transparent"
              :stroke-width (/ 2 zoom)
              :d pdata
              :on-mouse-down #(on-mouse-down % orig-shape selected)}]

      [:g {:on-mouse-down #(on-mouse-down % orig-shape selected)}
       [:path {:stroke "#31EFB8"
               :fill "transparent"
               :stroke-width (/ 2 zoom)
               :d pdata}]
       [:& interaction-marker {:x orig-x
                               :y orig-y
                               :arrow-dir nil
                               :zoom zoom}]
       [:& interaction-marker {:x dest-x
                               :y dest-y
                               :arrow-dir arrow-dir
                               :zoom zoom}]])))


(mf/defc interaction-handle
  [{:keys [shape selected zoom] :as props}]
  (let [shape-rect (geom/selection-rect-shape shape)
        handle-x (+ (:x shape-rect) (:width shape-rect))
        handle-y (+ (:y shape-rect) (/ (:height shape-rect) 2))]
    [:g {:on-mouse-down #(on-mouse-down % shape selected)}
     [:& interaction-marker {:x handle-x
                             :y handle-y
                             :arrow-dir :right
                             :zoom zoom}]]))


(mf/defc interactions
  [{:keys [selected] :as props}]
  (let [data (mf/deref refs/workspace-data)
        local (mf/deref refs/workspace-local)
        zoom (mf/deref refs/selected-zoom)
        current-transform (:transform local)
        objects (:objects data)
        active-shapes (filter #(first (get-click-interaction %)) (vals objects))
