mirror of
https://github.com/penpot/penpot.git
synced 2025-06-07 13:01:40 +02:00
✨ Fixes issues with some shapes
This commit is contained in:
parent
9f0a443b5c
commit
4bb832b597
12 changed files with 101 additions and 62 deletions
|
@ -102,6 +102,13 @@ ul.palette-menu .color-bullet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.color-data .color-bullet.multiple {
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.color-data .color-bullet {
|
.color-data .color-bullet {
|
||||||
background-color: $color-gray-30;
|
background-color: $color-gray-30;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
(defonce ^:private default-square-params
|
(defonce ^:private default-square-params
|
||||||
{:size 16
|
{:size 16
|
||||||
:color {:value "#59B9E2"
|
:color {:color "#59B9E2"
|
||||||
:opacity 0.2}})
|
:opacity 0.2}})
|
||||||
|
|
||||||
(defonce ^:private default-layout-params
|
(defonce ^:private default-layout-params
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
:item-length nil
|
:item-length nil
|
||||||
:gutter 8
|
:gutter 8
|
||||||
:margin 0
|
:margin 0
|
||||||
:color {:value "#DE4762"
|
:color {:color "#DE4762"
|
||||||
:opacity 0.1}})
|
:opacity 0.1}})
|
||||||
|
|
||||||
(defonce default-grid-params
|
(defonce default-grid-params
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
[app.main.data.workspace.common :as dwc]
|
[app.main.data.workspace.common :as dwc]
|
||||||
|
[app.main.data.modal :as md]
|
||||||
[app.main.streams :as ms]
|
[app.main.streams :as ms]
|
||||||
[app.main.worker :as uw]))
|
[app.main.worker :as uw]))
|
||||||
|
|
||||||
|
@ -123,9 +124,14 @@
|
||||||
(ptk/reify ::deselect-all
|
(ptk/reify ::deselect-all
|
||||||
ptk/UpdateEvent
|
ptk/UpdateEvent
|
||||||
(update [_ state]
|
(update [_ state]
|
||||||
(update state :workspace-local #(-> %
|
|
||||||
|
;; Only deselect if there is no modal openned
|
||||||
|
(cond-> state
|
||||||
|
(not (::md/modal state))
|
||||||
|
(update :workspace-local
|
||||||
|
#(-> %
|
||||||
(assoc :selected (d/ordered-set))
|
(assoc :selected (d/ordered-set))
|
||||||
(dissoc :selected-frame))))))
|
(dissoc :selected-frame)))))))
|
||||||
|
|
||||||
;; --- Select Shapes (By selrect)
|
;; --- Select Shapes (By selrect)
|
||||||
|
|
||||||
|
|
|
@ -9,32 +9,20 @@
|
||||||
|
|
||||||
(ns app.main.ui.components.color-bullet
|
(ns app.main.ui.components.color-bullet
|
||||||
(:require
|
(:require
|
||||||
#_[beicon.core :as rx]
|
|
||||||
#_[goog.events :as events]
|
|
||||||
#_[okulary.core :as l]
|
|
||||||
[rumext.alpha :as mf]
|
[rumext.alpha :as mf]
|
||||||
[app.util.color :as uc]
|
[app.util.color :as uc]))
|
||||||
#_[cuerdas.core :as str]
|
|
||||||
#_[app.common.math :as mth]
|
|
||||||
#_[app.main.data.colors :as mdc]
|
|
||||||
#_[app.main.data.workspace :as udw]
|
|
||||||
#_[app.main.store :as st]
|
|
||||||
#_[app.main.ui.components.dropdown :refer [dropdown]]
|
|
||||||
#_[app.main.ui.icons :as i]
|
|
||||||
#_[app.main.ui.keyboard :as kbd]
|
|
||||||
#_[app.util.color :refer [hex->rgb]]
|
|
||||||
#_[app.util.dom :as dom]
|
|
||||||
#_[app.util.object :as obj]
|
|
||||||
#_[app.main.refs :as refs]
|
|
||||||
#_[app.util.i18n :as i18n :refer [t]]))
|
|
||||||
|
|
||||||
(mf/defc color-bullet [{:keys [color on-click]}]
|
(mf/defc color-bullet [{:keys [color on-click]}]
|
||||||
|
(if (uc/multiple? color)
|
||||||
|
[:div.color-bullet.multiple {:on-click #(when on-click (on-click %))}]
|
||||||
|
|
||||||
|
;; No multiple selection
|
||||||
(let [color (if (string? color) {:color color :opacity 1} color)]
|
(let [color (if (string? color) {:color color :opacity 1} color)]
|
||||||
[:div.color-bullet {:on-click #(when on-click (on-click %))}
|
[:div.color-bullet {:on-click #(when on-click (on-click %))}
|
||||||
(when (not (:gradient color))
|
(when (not (:gradient color))
|
||||||
[:div.color-bullet-left {:style {:background (uc/color->background (assoc color :opacity 1))}}])
|
[:div.color-bullet-left {:style {:background (uc/color->background (assoc color :opacity 1))}}])
|
||||||
|
|
||||||
[:div.color-bullet-right {:style {:background (uc/color->background color)}}]]))
|
[:div.color-bullet-right {:style {:background (uc/color->background color)}}]])))
|
||||||
|
|
||||||
(defn gradient-type->string [{:keys [type]}]
|
(defn gradient-type->string [{:keys [type]}]
|
||||||
(case type
|
(case type
|
||||||
|
|
|
@ -25,8 +25,9 @@
|
||||||
(str/fmt "url(#$0)" [filter-id])))
|
(str/fmt "url(#$0)" [filter-id])))
|
||||||
|
|
||||||
(mf/defc color-matrix
|
(mf/defc color-matrix
|
||||||
[{:keys [color opacity]}]
|
[{:keys [color]}]
|
||||||
(let [[r g b a] (color/hex->rgba color opacity)
|
(let [{:keys [color opacity]} color
|
||||||
|
[r g b a] (color/hex->rgba color opacity)
|
||||||
[r g b] [(/ r 255) (/ g 255) (/ b 255)]]
|
[r g b] [(/ r 255) (/ g 255) (/ b 255)]]
|
||||||
[:feColorMatrix
|
[:feColorMatrix
|
||||||
{:type "matrix"
|
{:type "matrix"
|
||||||
|
@ -36,7 +37,7 @@
|
||||||
[{:keys [filter-id filter shape]}]
|
[{:keys [filter-id filter shape]}]
|
||||||
|
|
||||||
(let [{:keys [x y width height]} (:selrect shape)
|
(let [{:keys [x y width height]} (:selrect shape)
|
||||||
{:keys [id in-filter color opacity offset-x offset-y blur spread]} filter]
|
{:keys [id in-filter color offset-x offset-y blur spread]} filter]
|
||||||
[:*
|
[:*
|
||||||
[:feColorMatrix {:in "SourceAlpha" :type "matrix"
|
[:feColorMatrix {:in "SourceAlpha" :type "matrix"
|
||||||
:values "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}]
|
:values "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}]
|
||||||
|
@ -48,7 +49,7 @@
|
||||||
|
|
||||||
[:feOffset {:dx offset-x :dy offset-y}]
|
[:feOffset {:dx offset-x :dy offset-y}]
|
||||||
[:feGaussianBlur {:stdDeviation (/ blur 2)}]
|
[:feGaussianBlur {:stdDeviation (/ blur 2)}]
|
||||||
[:& color-matrix {:color color :opacity opacity}]
|
[:& color-matrix {:color color}]
|
||||||
|
|
||||||
[:feBlend {:mode "normal"
|
[:feBlend {:mode "normal"
|
||||||
:in2 in-filter
|
:in2 in-filter
|
||||||
|
@ -58,7 +59,7 @@
|
||||||
[{:keys [filter-id filter shape]}]
|
[{:keys [filter-id filter shape]}]
|
||||||
|
|
||||||
(let [{:keys [x y width height]} (:selrect shape)
|
(let [{:keys [x y width height]} (:selrect shape)
|
||||||
{:keys [id in-filter color opacity offset-x offset-y blur spread]} filter]
|
{:keys [id in-filter color offset-x offset-y blur spread]} filter]
|
||||||
[:*
|
[:*
|
||||||
[:feColorMatrix {:in "SourceAlpha" :type "matrix"
|
[:feColorMatrix {:in "SourceAlpha" :type "matrix"
|
||||||
:values "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
:values "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||||
|
@ -78,7 +79,7 @@
|
||||||
:k2 "-1"
|
:k2 "-1"
|
||||||
:k3 "1"}]
|
:k3 "1"}]
|
||||||
|
|
||||||
[:& color-matrix {:color color :opacity opacity}]
|
[:& color-matrix {:color color}]
|
||||||
|
|
||||||
[:feBlend {:mode "normal"
|
[:feBlend {:mode "normal"
|
||||||
:in2 in-filter
|
:in2 in-filter
|
||||||
|
|
|
@ -155,7 +155,9 @@
|
||||||
(st/emit! (dc/select-gradient-stop offset)))))
|
(st/emit! (dc/select-gradient-stop offset)))))
|
||||||
|
|
||||||
on-select-library-color
|
on-select-library-color
|
||||||
(fn [color] (reset! state (data->state color)))
|
(fn [color]
|
||||||
|
(reset! dirty? true)
|
||||||
|
(reset! state (data->state color)))
|
||||||
|
|
||||||
on-add-library-color
|
on-add-library-color
|
||||||
(fn [color] (st/emit! (dwl/add-color (state->data @state))))
|
(fn [color] (st/emit! (dwl/add-color (state->data @state))))
|
||||||
|
@ -216,7 +218,7 @@
|
||||||
(handle-change-color {:hex hex
|
(handle-change-color {:hex hex
|
||||||
:r r :g g :b b
|
:r r :g g :b b
|
||||||
:h h :s s :v v
|
:h h :s s :v v
|
||||||
:alpha alpha})))))
|
:alpha (/ alpha 255)})))))
|
||||||
|
|
||||||
;; Changes when another gradient handler is selected
|
;; Changes when another gradient handler is selected
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
|
@ -297,6 +299,8 @@
|
||||||
:on-change handle-change-color}]
|
:on-change handle-change-color}]
|
||||||
|
|
||||||
[:& libraries {:current-color current-color
|
[:& libraries {:current-color current-color
|
||||||
|
:disable-gradient disable-gradient
|
||||||
|
:disable-opacity disable-opacity
|
||||||
:on-select-color on-select-library-color
|
:on-select-color on-select-library-color
|
||||||
:on-add-library-color on-add-library-color}]
|
:on-add-library-color on-add-library-color}]
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,8 @@
|
||||||
[app.main.ui.workspace.colorpicker.ramp :refer [ramp-selector]]
|
[app.main.ui.workspace.colorpicker.ramp :refer [ramp-selector]]
|
||||||
[app.main.ui.workspace.colorpicker.color-inputs :refer [color-inputs]]))
|
[app.main.ui.workspace.colorpicker.color-inputs :refer [color-inputs]]))
|
||||||
|
|
||||||
(mf/defc libraries [{:keys [current-color on-select-color on-add-library-color]}]
|
(mf/defc libraries [{:keys [current-color on-select-color on-add-library-color
|
||||||
|
disable-gradient disable-opacity]}]
|
||||||
(let [selected-library (mf/use-state "recent")
|
(let [selected-library (mf/use-state "recent")
|
||||||
current-library-colors (mf/use-state [])
|
current-library-colors (mf/use-state [])
|
||||||
|
|
||||||
|
@ -45,7 +46,11 @@
|
||||||
(fn [selected]
|
(fn [selected]
|
||||||
(if (#{"recent" "file"} selected)
|
(if (#{"recent" "file"} selected)
|
||||||
(keyword selected)
|
(keyword selected)
|
||||||
(uuid selected)) )]
|
(uuid selected)) )
|
||||||
|
|
||||||
|
check-valid-color? (fn [color]
|
||||||
|
(and (or (not disable-gradient) (not (:gradient color)))
|
||||||
|
(or (not disable-opacity) (= 1 (:opacity color)))))]
|
||||||
|
|
||||||
;; Load library colors when the select is changed
|
;; Load library colors when the select is changed
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
|
@ -63,14 +68,14 @@
|
||||||
:else ;; Library UUID
|
:else ;; Library UUID
|
||||||
(map #(merge {:file-id (uuid @selected-library)})
|
(map #(merge {:file-id (uuid @selected-library)})
|
||||||
(vals (get-in shared-libs [(uuid @selected-library) :data :colors]))))]
|
(vals (get-in shared-libs [(uuid @selected-library) :data :colors]))))]
|
||||||
(reset! current-library-colors (into [] mapped-colors)))))
|
(reset! current-library-colors (into [] (filter check-valid-color?) mapped-colors)))))
|
||||||
|
|
||||||
;; If the file colors change and the file option is selected updates the state
|
;; If the file colors change and the file option is selected updates the state
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
(mf/deps file-colors)
|
(mf/deps file-colors)
|
||||||
(fn [] (when (= @selected-library "file")
|
(fn [] (when (= @selected-library "file")
|
||||||
(let [colors (vals file-colors)]
|
(let [colors (vals file-colors)]
|
||||||
(reset! current-library-colors (into [] colors))))))
|
(reset! current-library-colors (into [] (filter check-valid-color?) colors))))))
|
||||||
|
|
||||||
|
|
||||||
[:div.libraries
|
[:div.libraries
|
||||||
|
|
|
@ -18,7 +18,9 @@
|
||||||
|
|
||||||
(mf/defc square-grid [{:keys [frame zoom grid] :as props}]
|
(mf/defc square-grid [{:keys [frame zoom grid] :as props}]
|
||||||
(let [{:keys [color size] :as params} (-> grid :params)
|
(let [{:keys [color size] :as params} (-> grid :params)
|
||||||
{color-value :value color-opacity :opacity} (-> grid :params :color)
|
{color-value :color color-opacity :opacity} (-> grid :params :color)
|
||||||
|
;; Support for old color format
|
||||||
|
color-value (or color-value (:value (get-in grid [:params :color :value])))
|
||||||
{frame-width :width frame-height :height :keys [x y]} frame]
|
{frame-width :width frame-height :height :keys [x y]} frame]
|
||||||
(when (> size 0)
|
(when (> size 0)
|
||||||
[:g.grid
|
[:g.grid
|
||||||
|
@ -43,7 +45,9 @@
|
||||||
:stroke-width (str (/ 1 zoom))}}])]])))
|
:stroke-width (str (/ 1 zoom))}}])]])))
|
||||||
|
|
||||||
(mf/defc layout-grid [{:keys [key frame zoom grid]}]
|
(mf/defc layout-grid [{:keys [key frame zoom grid]}]
|
||||||
(let [{color-value :value color-opacity :opacity} (-> grid :params :color)
|
(let [{color-value :color color-opacity :opacity} (-> grid :params :color)
|
||||||
|
;; Support for old color format
|
||||||
|
color-value (or color-value (:value (get-in grid [:params :color :value])))
|
||||||
gutter (-> grid :params :gutter)
|
gutter (-> grid :params :gutter)
|
||||||
gutter? (and (not (nil? gutter)) (not= gutter 0))
|
gutter? (and (not (nil? gutter)) (not= gutter 0))
|
||||||
|
|
||||||
|
|
|
@ -101,14 +101,17 @@
|
||||||
(assoc-in [:params :item-length] item-length)))))
|
(assoc-in [:params :item-length] item-length)))))
|
||||||
|
|
||||||
handle-change-color
|
handle-change-color
|
||||||
(fn [value opacity]
|
(fn [color]
|
||||||
(emit-changes! #(-> %
|
(emit-changes! #(-> % (assoc-in [:params :color] color))))
|
||||||
(assoc-in [:params :color :value] value)
|
|
||||||
(assoc-in [:params :color :opacity] opacity))))
|
|
||||||
|
|
||||||
handle-use-default
|
handle-use-default
|
||||||
(fn []
|
(fn []
|
||||||
(emit-changes! #(hash-map :params ((:type grid) default-grid-params))))
|
(let [params ((:type grid) default-grid-params)
|
||||||
|
color (or (get-in params [:color :value]) (get-in params [:color :color]))
|
||||||
|
params (-> params
|
||||||
|
(assoc-in [:color :color] color)
|
||||||
|
(update :color dissoc :value))]
|
||||||
|
(emit-changes! #(hash-map :params params))))
|
||||||
|
|
||||||
handle-set-as-default
|
handle-set-as-default
|
||||||
(fn []
|
(fn []
|
||||||
|
@ -214,6 +217,7 @@
|
||||||
:on-change (handle-change :params :margin)}]])
|
:on-change (handle-change :params :margin)}]])
|
||||||
|
|
||||||
[:& color-row {:color (:color params)
|
[:& color-row {:color (:color params)
|
||||||
|
:disable-gradient true
|
||||||
:on-change handle-change-color}]
|
:on-change handle-change-color}]
|
||||||
[:div.row-flex
|
[:div.row-flex
|
||||||
[:button.btn-options {:disabled is-default
|
[:button.btn-options {:disabled is-default
|
||||||
|
|
|
@ -12,14 +12,15 @@
|
||||||
[rumext.alpha :as mf]
|
[rumext.alpha :as mf]
|
||||||
[cuerdas.core :as str]
|
[cuerdas.core :as str]
|
||||||
[app.common.math :as math]
|
[app.common.math :as math]
|
||||||
[app.main.ui.components.color-bullet :refer [color-bullet color-name]]
|
[app.common.pages :as cp]
|
||||||
|
[app.common.data :as d]
|
||||||
[app.util.dom :as dom]
|
[app.util.dom :as dom]
|
||||||
[app.util.data :refer [classnames]]
|
[app.util.data :refer [classnames]]
|
||||||
[app.util.i18n :as i18n :refer [tr]]
|
[app.util.i18n :as i18n :refer [tr]]
|
||||||
[app.main.data.modal :as modal]
|
[app.util.color :as uc]
|
||||||
[app.common.data :as d]
|
|
||||||
[app.main.refs :as refs]
|
[app.main.refs :as refs]
|
||||||
[app.util.color :as uc]))
|
[app.main.data.modal :as modal]
|
||||||
|
[app.main.ui.components.color-bullet :refer [color-bullet color-name]]))
|
||||||
|
|
||||||
(defn color-picker-callback
|
(defn color-picker-callback
|
||||||
[color disable-gradient disable-opacity handle-change-color handle-open handle-close]
|
[color disable-gradient disable-opacity handle-change-color handle-open handle-close]
|
||||||
|
@ -73,7 +74,9 @@
|
||||||
(update :color #(or % (:value color)))))
|
(update :color #(or % (:value color)))))
|
||||||
|
|
||||||
change-value (fn [new-value]
|
change-value (fn [new-value]
|
||||||
(when on-change (on-change (assoc color :color new-value))))
|
(when on-change (on-change (-> color
|
||||||
|
(assoc :color new-value)
|
||||||
|
(dissoc :gradient)))))
|
||||||
|
|
||||||
change-opacity (fn [new-opacity]
|
change-opacity (fn [new-opacity]
|
||||||
(when on-change (on-change (assoc color :opacity new-opacity))))
|
(when on-change (on-change (assoc color :opacity new-opacity))))
|
||||||
|
@ -107,8 +110,16 @@
|
||||||
|
|
||||||
handle-click-color (mf/use-callback
|
handle-click-color (mf/use-callback
|
||||||
(mf/deps color)
|
(mf/deps color)
|
||||||
(color-picker-callback color disable-gradient disable-opacity
|
(let [;; If multiple, we change to default color
|
||||||
handle-pick-color handle-open handle-close))]
|
color (if (uc/multiple? color)
|
||||||
|
{:color cp/default-color :opacity 1}
|
||||||
|
color)]
|
||||||
|
(color-picker-callback color
|
||||||
|
disable-gradient
|
||||||
|
disable-opacity
|
||||||
|
handle-pick-color
|
||||||
|
handle-open
|
||||||
|
handle-close)))]
|
||||||
|
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
(mf/deps color)
|
(mf/deps color)
|
||||||
|
@ -118,11 +129,6 @@
|
||||||
[:div.row-flex.color-data
|
[:div.row-flex.color-data
|
||||||
[:& color-bullet {:color color
|
[:& color-bullet {:color color
|
||||||
:on-click handle-click-color}]
|
:on-click handle-click-color}]
|
||||||
#_[:span.color-th
|
|
||||||
{:class (when (and (:id color) (not= (:id color) :multiple)) "color-name")
|
|
||||||
:style {:background (uc/color->background color)}
|
|
||||||
:on-click handle-click-color}
|
|
||||||
(when (= (:color color) :multiple) "?")]
|
|
||||||
|
|
||||||
(cond
|
(cond
|
||||||
;; Rendering a color with ID
|
;; Rendering a color with ID
|
||||||
|
@ -131,7 +137,8 @@
|
||||||
[:div.color-name (str (get-color-name color))]]
|
[:div.color-name (str (get-color-name color))]]
|
||||||
|
|
||||||
;; Rendering a gradient
|
;; Rendering a gradient
|
||||||
(and (:gradient color) (get-in color [:gradient :type]))
|
(and (not (uc/multiple? color))
|
||||||
|
(:gradient color) (get-in color [:gradient :type]))
|
||||||
[:div.color-info
|
[:div.color-info
|
||||||
[:div.color-name
|
[:div.color-name
|
||||||
(case (get-in color [:gradient :type])
|
(case (get-in color [:gradient :type])
|
||||||
|
@ -142,13 +149,16 @@
|
||||||
:else
|
:else
|
||||||
[:*
|
[:*
|
||||||
[:div.color-info
|
[:div.color-info
|
||||||
[:input {:value (-> color :color remove-hash)
|
[:input {:value (if (uc/multiple? color)
|
||||||
|
""
|
||||||
|
(-> color :color remove-hash))
|
||||||
:pattern "^[0-9a-fA-F]{0,6}$"
|
:pattern "^[0-9a-fA-F]{0,6}$"
|
||||||
:placeholder (tr "settings.multiple")
|
:placeholder (tr "settings.multiple")
|
||||||
:on-click select-all
|
:on-click select-all
|
||||||
:on-change handle-value-change}]]
|
:on-change handle-value-change}]]
|
||||||
|
|
||||||
(when (not disable-opacity)
|
(when (and (not disable-opacity)
|
||||||
|
(not (:gradient color)))
|
||||||
[:div.input-element
|
[:div.input-element
|
||||||
{:class (classnames :percentail (not= (:opacity color) :multiple))}
|
{:class (classnames :percentail (not= (:opacity color) :multiple))}
|
||||||
[:input.input-text {:type "number"
|
[:input.input-text {:type "number"
|
||||||
|
|
|
@ -174,7 +174,11 @@
|
||||||
[:span.after (t locale "workspace.options.shadow-options.spread")]]]
|
[:span.after (t locale "workspace.options.shadow-options.spread")]]]
|
||||||
|
|
||||||
[:div.color-row-wrap
|
[:div.color-row-wrap
|
||||||
[:& color-row {:color {:value (:color value) :opacity (:opacity value)}
|
[:& color-row {:color (if (string? (:color value))
|
||||||
|
;; Support for old format colors
|
||||||
|
{:color (:color value) :opacity (:opacity value)}
|
||||||
|
(:color value))
|
||||||
|
:disable-gradient true
|
||||||
:on-change (update-color index)
|
:on-change (update-color index)
|
||||||
:on-open #(st/emit! dwc/start-undo-transaction)
|
:on-open #(st/emit! dwc/start-undo-transaction)
|
||||||
:on-close #(st/emit! dwc/commit-undo-transaction)}]]]]))
|
:on-close #(st/emit! dwc/commit-undo-transaction)}]]]]))
|
||||||
|
|
|
@ -103,3 +103,9 @@
|
||||||
(str/fmt "rgba(%s, %s, %s, %s)" r g b opacity))
|
(str/fmt "rgba(%s, %s, %s, %s)" r g b opacity))
|
||||||
|
|
||||||
:else "transparent")))
|
:else "transparent")))
|
||||||
|
|
||||||
|
(defn multiple? [{:keys [value color gradient]}]
|
||||||
|
(or (= value :multiple)
|
||||||
|
(= color :multiple)
|
||||||
|
(= gradient :multiple)
|
||||||
|
(and gradient color)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue