mirror of
https://github.com/penpot/penpot.git
synced 2025-02-02 20:39:09 -05:00
119 lines
3.4 KiB
Clojure
119 lines
3.4 KiB
Clojure
(ns uxbox.ui.workspace.rules
|
|
(:require [sablono.core :as html :refer-macros [html]]
|
|
[rum.core :as rum]
|
|
[cuerdas.core :as str]
|
|
[beicon.core :as rx]
|
|
[uxbox.state :as s]
|
|
[uxbox.ui.dom :as dom]
|
|
[uxbox.ui.workspace.base :as wb]
|
|
[uxbox.ui.mixins :as mx]
|
|
[uxbox.ui.util :as util]))
|
|
|
|
(def ^:static zoom 1)
|
|
(def ^:static padding 20)
|
|
(def ^:static step-size 10)
|
|
(def ^:static start-width wb/document-start-x)
|
|
(def ^:static start-height wb/document-start-y)
|
|
(def ^:static big-ticks-mod (/ 100 zoom))
|
|
(def ^:static mid-ticks-mod (/ 50 zoom))
|
|
(def ^:static scroll-left 0)
|
|
(def ^:static scroll-top 0)
|
|
|
|
(defn h-line
|
|
[position value]
|
|
(cond
|
|
(< (mod value big-ticks-mod) step-size)
|
|
(html
|
|
[:g {:key position}
|
|
[:line {:x1 position :x2 position :y1 5 :y2 padding :stroke "#7f7f7f"}]
|
|
[:text {:x (+ position 2) :y 13 :fill "#7f7f7f" :style {:font-size "12px"}} value]])
|
|
|
|
(< (mod value mid-ticks-mod) step-size)
|
|
(html
|
|
[:line {:key position :x1 position :x2 position :y1 10 :y2 padding :stroke "#7f7f7f"}])
|
|
|
|
:else
|
|
(html
|
|
[:line {:key position :x1 position :x2 position :y1 15 :y2 padding :stroke "#7f7f7f"}])))
|
|
|
|
(defn v-line
|
|
[position value]
|
|
(cond
|
|
(< (mod value big-ticks-mod) step-size)
|
|
(html
|
|
[:g {:key position}
|
|
[:line {:y1 position
|
|
:y2 position
|
|
:x1 5
|
|
:x2 padding
|
|
:stroke "#7f7f7f"}]
|
|
[:text {:y position
|
|
:x 5
|
|
:transform (str/format "rotate(90 0 %s)" position)
|
|
:fill "#7f7f7f"
|
|
:style {:font-size "12px"}}
|
|
value]])
|
|
|
|
(< (mod value mid-ticks-mod) step-size)
|
|
(html
|
|
[:line {:key position
|
|
:y1 position
|
|
:y2 position
|
|
:x1 10
|
|
:x2 padding
|
|
:stroke "#7f7f7f"}])
|
|
|
|
:else
|
|
(html
|
|
[:line {:key position
|
|
:y1 position
|
|
:y2 position
|
|
:x1 15
|
|
:x2 padding
|
|
:stroke "#7f7f7f"}])))
|
|
|
|
(defn h-rule-render
|
|
[own]
|
|
(let [width wb/viewport-width
|
|
ticks (concat (range (- padding start-width) 0 step-size)
|
|
(range 0 (- width start-width padding) step-size))]
|
|
(html
|
|
[:svg.horizontal-rule
|
|
{:width 3000
|
|
:height 3000
|
|
:style {:left (str (- (- scroll-left wb/document-start-x)) "px")}}
|
|
[:g
|
|
[:rect {:x padding :y 0 :width width :height padding :fill "#bab7b7"}]
|
|
[:rect {:x 0 :y 0 :width padding :height padding :fill "#bab7b7"}]]
|
|
[:g
|
|
(for [tick ticks
|
|
:let [pos (* (+ tick start-width) zoom)]]
|
|
(h-line pos tick))]])))
|
|
|
|
(def h-rule
|
|
(util/component
|
|
{:render h-rule-render
|
|
:name "h-rule"
|
|
:mixins [mx/static rum/reactive]}))
|
|
|
|
(defn v-rule-render
|
|
[own]
|
|
(let [height wb/viewport-height
|
|
ticks (concat (range (- padding start-height) 0 step-size)
|
|
(range 0 (- height start-height padding) step-size))]
|
|
(html
|
|
[:svg.vertical-rule
|
|
{:width 3000
|
|
:height 3000
|
|
:style {:top (str (- 0 scroll-top) "px")}}
|
|
[:g
|
|
[:rect {:x 0 :y padding :height height :width padding :fill "#bab7b7"}]
|
|
(for [tick ticks
|
|
:let [pos (* (+ tick start-height) zoom)]]
|
|
(v-line pos tick))]])))
|
|
|
|
(def v-rule
|
|
(util/component
|
|
{:render v-rule-render
|
|
:name "v-rule"
|
|
:mixins [mx/static rum/reactive]}))
|