mirror of
https://github.com/penpot/penpot.git
synced 2025-01-10 08:50:57 -05:00
✨ Add import/export svg for grid
This commit is contained in:
parent
664825a2a6
commit
b3b984d339
4 changed files with 131 additions and 9 deletions
|
@ -340,9 +340,14 @@
|
||||||
layout-wrap-type
|
layout-wrap-type
|
||||||
layout-padding-type
|
layout-padding-type
|
||||||
layout-padding
|
layout-padding
|
||||||
|
layout-justify-items
|
||||||
layout-justify-content
|
layout-justify-content
|
||||||
layout-align-items
|
layout-align-items
|
||||||
layout-align-content]}]
|
layout-align-content
|
||||||
|
layout-grid-dir
|
||||||
|
layout-grid-rows
|
||||||
|
layout-grid-columns
|
||||||
|
layout-grid-cells]}]
|
||||||
|
|
||||||
(when layout
|
(when layout
|
||||||
(mf/html
|
(mf/html
|
||||||
|
@ -358,9 +363,48 @@
|
||||||
:penpot:layout-padding-p2 (:p2 layout-padding)
|
:penpot:layout-padding-p2 (:p2 layout-padding)
|
||||||
:penpot:layout-padding-p3 (:p3 layout-padding)
|
:penpot:layout-padding-p3 (:p3 layout-padding)
|
||||||
:penpot:layout-padding-p4 (:p4 layout-padding)
|
:penpot:layout-padding-p4 (:p4 layout-padding)
|
||||||
|
:penpot:layout-justify-items (d/name layout-justify-items)
|
||||||
:penpot:layout-justify-content (d/name layout-justify-content)
|
:penpot:layout-justify-content (d/name layout-justify-content)
|
||||||
:penpot:layout-align-items (d/name layout-align-items)
|
:penpot:layout-align-items (d/name layout-align-items)
|
||||||
:penpot:layout-align-content (d/name layout-align-content)}])))
|
:penpot:layout-align-content (d/name layout-align-content)
|
||||||
|
:penpot:layout-grid-dir (d/name layout-grid-dir)}
|
||||||
|
|
||||||
|
[:> "penpot:grid-rows" #js {}
|
||||||
|
(for [[idx {:keys [type value]}] (d/enumerate layout-grid-rows)]
|
||||||
|
[:> "penpot:grid-track"
|
||||||
|
#js {:penpot:index idx
|
||||||
|
:penpot:type (d/name type)
|
||||||
|
:penpot:value value}])]
|
||||||
|
|
||||||
|
[:> "penpot:grid-columns" #js {}
|
||||||
|
(for [[idx {:keys [type value]}] (d/enumerate layout-grid-columns)]
|
||||||
|
[:> "penpot:grid-track"
|
||||||
|
#js {:penpot:index idx
|
||||||
|
:penpot:type (d/name type)
|
||||||
|
:penpot:value value}])]
|
||||||
|
|
||||||
|
[:> "penpot:grid-cells" #js {}
|
||||||
|
(for [[_ {:keys [id
|
||||||
|
area-name
|
||||||
|
row
|
||||||
|
row-span
|
||||||
|
column
|
||||||
|
column-span
|
||||||
|
position
|
||||||
|
align-self
|
||||||
|
justify-self
|
||||||
|
shapes]}] layout-grid-cells]
|
||||||
|
[:> "penpot:grid-cell"
|
||||||
|
#js {:penpot:id id
|
||||||
|
:penpot:area-name area-name
|
||||||
|
:penpot:row row
|
||||||
|
:penpot:row-span row-span
|
||||||
|
:penpot:column column
|
||||||
|
:penpot:column-span column-span
|
||||||
|
:penpot:position (d/name position)
|
||||||
|
:penpot:align-self (d/name align-self)
|
||||||
|
:penpot:justify-self (d/name justify-self)
|
||||||
|
:penpot:shapes (str/join " " shapes)}])]])))
|
||||||
|
|
||||||
(defn- export-layout-item-data
|
(defn- export-layout-item-data
|
||||||
[{:keys [layout-item-margin
|
[{:keys [layout-item-margin
|
||||||
|
@ -371,7 +415,9 @@
|
||||||
layout-item-min-h
|
layout-item-min-h
|
||||||
layout-item-max-w
|
layout-item-max-w
|
||||||
layout-item-min-w
|
layout-item-min-w
|
||||||
layout-item-align-self]}]
|
layout-item-align-self
|
||||||
|
layout-item-absolute
|
||||||
|
layout-item-z-index]}]
|
||||||
|
|
||||||
(when (or layout-item-margin
|
(when (or layout-item-margin
|
||||||
layout-item-margin-type
|
layout-item-margin-type
|
||||||
|
@ -381,7 +427,9 @@
|
||||||
layout-item-min-h
|
layout-item-min-h
|
||||||
layout-item-max-w
|
layout-item-max-w
|
||||||
layout-item-min-w
|
layout-item-min-w
|
||||||
layout-item-align-self)
|
layout-item-align-self
|
||||||
|
layout-item-absolute
|
||||||
|
layout-item-z-index)
|
||||||
(mf/html
|
(mf/html
|
||||||
[:> "penpot:layout-item"
|
[:> "penpot:layout-item"
|
||||||
#js {:penpot:layout-item-margin-m1 (:m1 layout-item-margin)
|
#js {:penpot:layout-item-margin-m1 (:m1 layout-item-margin)
|
||||||
|
@ -395,7 +443,9 @@
|
||||||
:penpot:layout-item-min-h layout-item-min-h
|
:penpot:layout-item-min-h layout-item-min-h
|
||||||
:penpot:layout-item-max-w layout-item-max-w
|
:penpot:layout-item-max-w layout-item-max-w
|
||||||
:penpot:layout-item-min-w layout-item-min-w
|
:penpot:layout-item-min-w layout-item-min-w
|
||||||
:penpot:layout-item-align-self (d/name layout-item-align-self)}])))
|
:penpot:layout-item-align-self (d/name layout-item-align-self)
|
||||||
|
:penpot:layout-item-absolute layout-item-absolute
|
||||||
|
:penpot:layout-item-z-index layout-item-z-index}])))
|
||||||
|
|
||||||
|
|
||||||
(mf/defc export-data
|
(mf/defc export-data
|
||||||
|
|
|
@ -564,7 +564,7 @@
|
||||||
|
|
||||||
(if (some? track-type)
|
(if (some? track-type)
|
||||||
(do (st/emit! (dwsl/change-layout-track [(:id shape)] type index {:type track-type :value value}))
|
(do (st/emit! (dwsl/change-layout-track [(:id shape)] type index {:type track-type :value value}))
|
||||||
(dom/set-data! target "default-value" (format-size {:type type :value value})))
|
(dom/set-data! target "default-value" (format-size {:type track-type :value value})))
|
||||||
(obj/set! target "value" (dom/get-attribute target "data-default-value"))))))
|
(obj/set! target "value" (dom/get-attribute target "data-default-value"))))))
|
||||||
|
|
||||||
handle-keydown-track-input
|
handle-keydown-track-input
|
||||||
|
|
|
@ -869,12 +869,64 @@
|
||||||
:style
|
:style
|
||||||
parse-style))))
|
parse-style))))
|
||||||
|
|
||||||
|
(defn parse-grid-tracks
|
||||||
|
[node label]
|
||||||
|
(let [node (-> (get-data node :penpot:layout)
|
||||||
|
(find-node label))]
|
||||||
|
(->> node
|
||||||
|
:content
|
||||||
|
(mapv
|
||||||
|
(fn [track-node]
|
||||||
|
(let [{:keys [type value]} (-> track-node :attrs remove-penpot-prefix)]
|
||||||
|
{:type (keyword type)
|
||||||
|
:value (d/parse-double value)}))))))
|
||||||
|
|
||||||
|
(defn parse-grid-cells
|
||||||
|
[node]
|
||||||
|
(let [node (-> (get-data node :penpot:layout)
|
||||||
|
(find-node :penpot:grid-cells))]
|
||||||
|
(->> node
|
||||||
|
:content
|
||||||
|
(mapv
|
||||||
|
(fn [cell-node]
|
||||||
|
(let [{:keys [id
|
||||||
|
area-name
|
||||||
|
row
|
||||||
|
row-span
|
||||||
|
column
|
||||||
|
column-span
|
||||||
|
position
|
||||||
|
align-self
|
||||||
|
justify-self
|
||||||
|
shapes]} (-> cell-node :attrs remove-penpot-prefix)
|
||||||
|
id (uuid/uuid id)]
|
||||||
|
[id (d/without-nils
|
||||||
|
{:id id
|
||||||
|
:area-name area-name
|
||||||
|
:row (d/parse-integer row)
|
||||||
|
:row-span (d/parse-integer row-span)
|
||||||
|
:column (d/parse-integer column)
|
||||||
|
:column-span (d/parse-integer column-span)
|
||||||
|
:position (keyword position)
|
||||||
|
:align-self (keyword align-self)
|
||||||
|
:justify-self (keyword justify-self)
|
||||||
|
:shapes (if (and (some? shapes) (d/not-empty? shapes))
|
||||||
|
(->> (str/split shapes " ")
|
||||||
|
(mapv uuid/uuid))
|
||||||
|
[])})])))
|
||||||
|
(into {}))))
|
||||||
|
|
||||||
(defn add-layout-container-data [props node]
|
(defn add-layout-container-data [props node]
|
||||||
(if-let [data (get-data node :penpot:layout)]
|
(if-let [data (get-data node :penpot:layout)]
|
||||||
(merge props
|
(let [layout-grid-rows (parse-grid-tracks node :penpot:grid-rows)
|
||||||
|
layout-grid-columns (parse-grid-tracks node :penpot:grid-columns)
|
||||||
|
layout-grid-cells (parse-grid-cells node)]
|
||||||
|
(-> props
|
||||||
|
(merge
|
||||||
(d/without-nils
|
(d/without-nils
|
||||||
{:layout (get-meta data :layout keyword)
|
{:layout (get-meta data :layout keyword)
|
||||||
:layout-flex-dir (get-meta data :layout-flex-dir keyword)
|
:layout-flex-dir (get-meta data :layout-flex-dir keyword)
|
||||||
|
:layout-grid-dir (get-meta data :layout-grid-dir keyword)
|
||||||
:layout-wrap-type (get-meta data :layout-wrap-type keyword)
|
:layout-wrap-type (get-meta data :layout-wrap-type keyword)
|
||||||
|
|
||||||
:layout-gap-type (get-meta data :layout-gap-type keyword)
|
:layout-gap-type (get-meta data :layout-gap-type keyword)
|
||||||
|
@ -891,9 +943,17 @@
|
||||||
:p3 (get-meta data :layout-padding-p3 d/parse-double)
|
:p3 (get-meta data :layout-padding-p3 d/parse-double)
|
||||||
:p4 (get-meta data :layout-padding-p4 d/parse-double)})
|
:p4 (get-meta data :layout-padding-p4 d/parse-double)})
|
||||||
|
|
||||||
|
:layout-justify-items (get-meta data :layout-justify-items keyword)
|
||||||
:layout-justify-content (get-meta data :layout-justify-content keyword)
|
:layout-justify-content (get-meta data :layout-justify-content keyword)
|
||||||
:layout-align-items (get-meta data :layout-align-items keyword)
|
:layout-align-items (get-meta data :layout-align-items keyword)
|
||||||
:layout-align-content (get-meta data :layout-align-content keyword)}))
|
:layout-align-content (get-meta data :layout-align-content keyword)}))
|
||||||
|
|
||||||
|
(cond-> (d/not-empty? layout-grid-rows)
|
||||||
|
(assoc :layout-grid-rows layout-grid-rows))
|
||||||
|
(cond-> (d/not-empty? layout-grid-columns)
|
||||||
|
(assoc :layout-grid-columns layout-grid-columns))
|
||||||
|
(cond-> (d/not-empty? layout-grid-cells)
|
||||||
|
(assoc :layout-grid-cells layout-grid-cells))))
|
||||||
props))
|
props))
|
||||||
|
|
||||||
(defn add-layout-item-data [props node]
|
(defn add-layout-item-data [props node]
|
||||||
|
@ -914,7 +974,10 @@
|
||||||
:layout-item-min-h (get-meta data :layout-item-min-h d/parse-double)
|
:layout-item-min-h (get-meta data :layout-item-min-h d/parse-double)
|
||||||
:layout-item-max-w (get-meta data :layout-item-max-w d/parse-double)
|
:layout-item-max-w (get-meta data :layout-item-max-w d/parse-double)
|
||||||
:layout-item-min-w (get-meta data :layout-item-min-w d/parse-double)
|
:layout-item-min-w (get-meta data :layout-item-min-w d/parse-double)
|
||||||
:layout-item-align-self (get-meta data :layout-item-align-self keyword)}))
|
:layout-item-align-self (get-meta data :layout-item-align-self keyword)
|
||||||
|
:layout-item-align-absolute (get-meta data :layout-item-align-absolute str->bool)
|
||||||
|
:layout-item-align-index (get-meta data :layout-item-align-index d/parse-double)
|
||||||
|
}))
|
||||||
props))
|
props))
|
||||||
|
|
||||||
(defn parse-data
|
(defn parse-data
|
||||||
|
|
|
@ -229,7 +229,16 @@
|
||||||
(d/update-when :shape-ref resolve)
|
(d/update-when :shape-ref resolve)
|
||||||
|
|
||||||
(cond-> (= type :text)
|
(cond-> (= type :text)
|
||||||
(d/update-when :content resolve-text-content context)))))
|
(d/update-when :content resolve-text-content context))
|
||||||
|
|
||||||
|
(cond-> (and (= type :frame) (= :grid (:layout data)))
|
||||||
|
(update
|
||||||
|
:layout-grid-cells
|
||||||
|
(fn [cells]
|
||||||
|
(->> (vals cells)
|
||||||
|
(reduce (fn [cells {:keys [id shapes]}]
|
||||||
|
(assoc-in cells [id :shapes] (mapv resolve shapes)))
|
||||||
|
cells))))))))
|
||||||
|
|
||||||
(defn- translate-frame
|
(defn- translate-frame
|
||||||
[data type file]
|
[data type file]
|
||||||
|
|
Loading…
Reference in a new issue