          :width width
          :height height}]))))
 
-(def ^:static selrect
+(def ^:const ^:private selrect
   (mx/component
    {:render selrect-render
     :name "selrect"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defn selrect->rect
  [data]
  (let [start (:start data)
        current (:current data )
        start-x (min (:x start) (:x current))
        start-y (min (:y start) (:y current))
        current-x (max (:x start) (:x current))
        current-y (max (:y start) (:y current))
        width (- current-x start-x)
        height (- current-y start-y)]
    {:x start-x
     :y start-y
     :width (- current-x start-x)
     :height (- current-y start-y)}))

(define-once :selrect-subscriptions
  (letfn [(on-value [pos]
            (swap! selrect-pos assoc :current pos))

          (translate-selrect [selrect]
            (assoc selrect
                   :x (- (:x selrect) wb/canvas-start-x)
                   :y (- (:y selrect) wb/canvas-start-y)))

          (on-complete []
            (let [selrect (selrect->rect @selrect-pos)
                  selrect' (translate-selrect selrect)]
              (rs/emit! (dw/select-shapes selrect'))
              (reset! selrect-pos nil)))


            [uxbox.ui.workspace.base :as wb]
            [uxbox.ui.mixins :as mx]
            [uxbox.util.geom.point :as gpt]
            [uxbox.util.geom.matrix :as gmx]
            [uxbox.util.dom :as dom]))

(defonce selrect-pos (atom nil))

(def ^:const ^:private zoom-l
  (-> (l/in [:workspace :zoom])
      (l/focus-atom st/state)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Component
