mirror of
https://github.com/penpot/penpot.git
synced 2025-08-07 14:38:33 +02:00
✨ Add import blend modes
This commit is contained in:
parent
0647fa832a
commit
e880d94f51
6 changed files with 101 additions and 79 deletions
|
@ -141,23 +141,28 @@
|
|||
styles (-> svg-attrs (:style {}) (clj->js))]
|
||||
[attrs styles]))
|
||||
|
||||
(defn add-style-attrs
|
||||
[props shape]
|
||||
(let [render-id (mf/use-ctx muc/render-ctx)
|
||||
svg-defs (:svg-defs shape {})
|
||||
svg-attrs (:svg-attrs shape {})
|
||||
|
||||
[svg-attrs svg-styles] (mf/use-memo
|
||||
(mf/deps render-id svg-defs svg-attrs)
|
||||
#(extract-svg-attrs render-id svg-defs svg-attrs))
|
||||
|
||||
styles (-> (obj/get props "style" (obj/new))
|
||||
(obj/merge! svg-styles)
|
||||
(add-fill shape render-id)
|
||||
(add-stroke shape render-id)
|
||||
(add-layer-props shape))]
|
||||
|
||||
(-> props
|
||||
(obj/merge! svg-attrs)
|
||||
(add-border-radius shape)
|
||||
(obj/set! "style" styles))))
|
||||
|
||||
(defn extract-style-attrs
|
||||
([shape]
|
||||
(let [render-id (mf/use-ctx muc/render-ctx)
|
||||
svg-defs (:svg-defs shape {})
|
||||
svg-attrs (:svg-attrs shape {})
|
||||
|
||||
[svg-attrs svg-styles] (mf/use-memo
|
||||
(mf/deps render-id svg-defs svg-attrs)
|
||||
#(extract-svg-attrs render-id svg-defs svg-attrs))
|
||||
|
||||
styles (-> (obj/new)
|
||||
(obj/merge! svg-styles)
|
||||
(add-fill shape render-id)
|
||||
(add-stroke shape render-id)
|
||||
(add-layer-props shape))]
|
||||
|
||||
(-> (obj/new)
|
||||
(obj/merge! svg-attrs)
|
||||
(add-border-radius shape)
|
||||
(obj/set! "style" styles)))))
|
||||
[shape]
|
||||
(-> (obj/new)
|
||||
(add-style-attrs shape)))
|
||||
|
|
|
@ -20,33 +20,29 @@
|
|||
(let [frame (unchecked-get props "frame")
|
||||
shape (unchecked-get props "shape")
|
||||
childs (unchecked-get props "childs")
|
||||
expand-mask (unchecked-get props "expand-mask")
|
||||
pointer-events (unchecked-get props "pointer-events")
|
||||
|
||||
{:keys [id x y width height]} shape
|
||||
{:keys [id x y width height masked-group?]} shape
|
||||
|
||||
show-mask? (and (:masked-group? shape) (not expand-mask))
|
||||
mask (when show-mask? (first childs))
|
||||
childs (if show-mask? (rest childs) childs)
|
||||
[mask childs] (if masked-group?
|
||||
[(first childs) (rest childs)]
|
||||
[nil childs])
|
||||
|
||||
mask-props (when (and mask (not expand-mask))
|
||||
#js {:clipPath (clip-str mask)
|
||||
:mask (mask-str mask)})
|
||||
mask-wrapper (if (and mask (not expand-mask))
|
||||
"g"
|
||||
mf/Fragment)
|
||||
[mask-wrapper mask-props]
|
||||
(if masked-group?
|
||||
["g" (-> (obj/new)
|
||||
(obj/set! "clipPath" (clip-str mask))
|
||||
(obj/set! "mask" (mask-str mask)))]
|
||||
[mf/Fragment nil])]
|
||||
|
||||
props (-> (attrs/extract-style-attrs shape))]
|
||||
[:> mask-wrapper mask-props
|
||||
(when masked-group?
|
||||
[:> render-mask #js {:frame frame :mask mask}])
|
||||
|
||||
[:> :g (attrs/extract-style-attrs shape)
|
||||
[:> mask-wrapper mask-props
|
||||
(when mask
|
||||
[:> render-mask #js {:frame frame :mask mask}])
|
||||
|
||||
(for [item childs]
|
||||
[:& shape-wrapper {:frame frame
|
||||
:shape item
|
||||
:key (:id item)}])]]))))
|
||||
(for [item childs]
|
||||
[:& shape-wrapper {:frame frame
|
||||
:shape item
|
||||
:key (:id item)}])]))))
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -9,11 +9,12 @@
|
|||
[app.common.data :as d]
|
||||
[app.common.uuid :as uuid]
|
||||
[app.main.ui.context :as muc]
|
||||
[app.main.ui.shapes.attrs :as attrs]
|
||||
[app.main.ui.shapes.custom-stroke :as cs]
|
||||
[app.main.ui.shapes.export :as ed]
|
||||
[app.main.ui.shapes.fill-image :as fim]
|
||||
[app.main.ui.shapes.filters :as filters]
|
||||
[app.main.ui.shapes.gradients :as grad]
|
||||
[app.main.ui.shapes.export :as ed]
|
||||
[app.main.ui.shapes.svg-defs :as defs]
|
||||
[app.util.object :as obj]
|
||||
[rumext.alpha :as mf]))
|
||||
|
@ -35,6 +36,7 @@
|
|||
|
||||
{:keys [x y width height type]} shape
|
||||
frame? (= :frame type)
|
||||
group? (= :group type)
|
||||
|
||||
wrapper-props
|
||||
(-> (obj/clone props)
|
||||
|
@ -42,16 +44,23 @@
|
|||
(obj/set! "ref" ref)
|
||||
(obj/set! "id" (str "shape-" (:id shape)))
|
||||
(obj/set! "filter" (filters/filter-str filter-id shape))
|
||||
(obj/set! "style" styles)
|
||||
(obj/set! "style" styles))
|
||||
|
||||
(cond-> frame?
|
||||
(-> (obj/set! "x" x)
|
||||
(obj/set! "y" y)
|
||||
(obj/set! "width" width)
|
||||
(obj/set! "height" height)
|
||||
(obj/set! "xmlnsXlink" "http://www.w3.org/1999/xlink")
|
||||
(obj/set! "xmlns" "http://www.w3.org/2000/svg")
|
||||
(obj/set! "xmlns:penpot" "https://penpot.app/xmlns"))))
|
||||
wrapper-props
|
||||
(cond-> wrapper-props
|
||||
frame?
|
||||
(-> (obj/set! "x" x)
|
||||
(obj/set! "y" y)
|
||||
(obj/set! "width" width)
|
||||
(obj/set! "height" height)
|
||||
(obj/set! "xmlnsXlink" "http://www.w3.org/1999/xlink")
|
||||
(obj/set! "xmlns" "http://www.w3.org/2000/svg")
|
||||
(obj/set! "xmlns:penpot" "https://penpot.app/xmlns")))
|
||||
|
||||
wrapper-props
|
||||
(cond-> wrapper-props
|
||||
group?
|
||||
(attrs/add-style-attrs shape))
|
||||
|
||||
wrapper-tag (if frame? "svg" "g")]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue