mirror of
https://github.com/penpot/penpot.git
synced 2025-05-12 09:16:38 +02:00
🎉 Group color assets
This commit is contained in:
parent
83bca7fb10
commit
c858707c39
4 changed files with 89 additions and 34 deletions
|
@ -90,6 +90,7 @@
|
||||||
;;; COLORS
|
;;; COLORS
|
||||||
|
|
||||||
(s/def :internal.color/name ::string)
|
(s/def :internal.color/name ::string)
|
||||||
|
(s/def :internal.color/path (s/nilable ::string))
|
||||||
(s/def :internal.color/value (s/nilable ::string))
|
(s/def :internal.color/value (s/nilable ::string))
|
||||||
(s/def :internal.color/color (s/nilable ::string))
|
(s/def :internal.color/color (s/nilable ::string))
|
||||||
(s/def :internal.color/opacity (s/nilable ::safe-number))
|
(s/def :internal.color/opacity (s/nilable ::safe-number))
|
||||||
|
@ -98,13 +99,13 @@
|
||||||
(s/def ::color
|
(s/def ::color
|
||||||
(s/keys :opt-un [::id
|
(s/keys :opt-un [::id
|
||||||
:internal.color/name
|
:internal.color/name
|
||||||
|
:internal.color/path
|
||||||
:internal.color/value
|
:internal.color/value
|
||||||
:internal.color/color
|
:internal.color/color
|
||||||
:internal.color/opacity
|
:internal.color/opacity
|
||||||
:internal.color/gradient]))
|
:internal.color/gradient]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;; SHADOW EFFECT
|
;;; SHADOW EFFECT
|
||||||
|
|
||||||
(s/def :internal.shadow/id uuid?)
|
(s/def :internal.shadow/id uuid?)
|
||||||
|
|
|
@ -371,10 +371,6 @@
|
||||||
// overflow-y: scroll;
|
// overflow-y: scroll;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
.asset-list {
|
|
||||||
margin-top: $medium;
|
|
||||||
}
|
|
||||||
|
|
||||||
.asset-list-item {
|
.asset-list-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
:id id}]
|
:id id}]
|
||||||
(rx/of #(assoc-in % [:workspace-local :color-for-rename] id)
|
(rx/of #(assoc-in % [:workspace-local :color-for-rename] id)
|
||||||
(dch/commit-changes {:redo-changes [rchg]
|
(dch/commit-changes {:redo-changes [rchg]
|
||||||
:undo-chages [uchg]
|
:undo-changes [uchg]
|
||||||
:origin it})))))))
|
:origin it})))))))
|
||||||
(defn add-recent-color
|
(defn add-recent-color
|
||||||
[color]
|
[color]
|
||||||
|
@ -104,7 +104,7 @@
|
||||||
(let [rchg {:type :add-recent-color
|
(let [rchg {:type :add-recent-color
|
||||||
:color color}]
|
:color color}]
|
||||||
(rx/of (dch/commit-changes {:redo-changes [rchg]
|
(rx/of (dch/commit-changes {:redo-changes [rchg]
|
||||||
:undo-chages []
|
:undo-changes []
|
||||||
:origin it}))))))
|
:origin it}))))))
|
||||||
|
|
||||||
(def clear-color-for-rename
|
(def clear-color-for-rename
|
||||||
|
@ -120,13 +120,15 @@
|
||||||
(ptk/reify ::update-color
|
(ptk/reify ::update-color
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [it state stream]
|
(watch [it state stream]
|
||||||
(let [prev (get-in state [:workspace-data :colors id])
|
(let [[path name] (cp/parse-path-name (:name color))
|
||||||
|
color (assoc color :path path :name name)
|
||||||
|
prev (get-in state [:workspace-data :colors id])
|
||||||
rchg {:type :mod-color
|
rchg {:type :mod-color
|
||||||
:color color}
|
:color color}
|
||||||
uchg {:type :mod-color
|
uchg {:type :mod-color
|
||||||
:color prev}]
|
:color prev}]
|
||||||
(rx/of (dch/commit-changes {:redo-changes [rchg]
|
(rx/of (dch/commit-changes {:redo-changes [rchg]
|
||||||
:undo-chages [uchg]
|
:undo-changes [uchg]
|
||||||
:origin it})
|
:origin it})
|
||||||
(sync-file (:current-file-id state) file-id))))))
|
(sync-file (:current-file-id state) file-id))))))
|
||||||
|
|
||||||
|
@ -142,7 +144,7 @@
|
||||||
uchg {:type :add-color
|
uchg {:type :add-color
|
||||||
:color prev}]
|
:color prev}]
|
||||||
(rx/of (dch/commit-changes {:redo-changes [rchg]
|
(rx/of (dch/commit-changes {:redo-changes [rchg]
|
||||||
:undo-chages [uchg]
|
:undo-changes [uchg]
|
||||||
:origin it}))))))
|
:origin it}))))))
|
||||||
|
|
||||||
(defn add-media
|
(defn add-media
|
||||||
|
|
|
@ -499,7 +499,8 @@
|
||||||
|
|
||||||
(mf/defc color-item
|
(mf/defc color-item
|
||||||
[{:keys [color local? file-id selected-colors multi-colors? multi-assets?
|
[{:keys [color local? file-id selected-colors multi-colors? multi-assets?
|
||||||
on-asset-click on-assets-delete on-clear-selection colors locale] :as props}]
|
on-asset-click on-assets-delete on-clear-selection on-group
|
||||||
|
colors locale] :as props}]
|
||||||
(let [rename? (= (:color-for-rename @refs/workspace-local) (:id color))
|
(let [rename? (= (:color-for-rename @refs/workspace-local) (:id color))
|
||||||
id (:id color)
|
id (:id color)
|
||||||
input-ref (mf/use-ref)
|
input-ref (mf/use-ref)
|
||||||
|
@ -623,17 +624,24 @@
|
||||||
[(t locale "workspace.assets.rename") rename-color-clicked])
|
[(t locale "workspace.assets.rename") rename-color-clicked])
|
||||||
(when-not (or multi-colors? multi-assets?)
|
(when-not (or multi-colors? multi-assets?)
|
||||||
[(t locale "workspace.assets.edit") edit-color-clicked])
|
[(t locale "workspace.assets.edit") edit-color-clicked])
|
||||||
[(t locale "workspace.assets.delete") delete-color]]}])]))
|
[(t locale "workspace.assets.delete") delete-color]
|
||||||
|
(when-not multi-assets?
|
||||||
|
[(tr "workspace.assets.group") on-group])]}])]))
|
||||||
|
|
||||||
(mf/defc colors-box
|
(mf/defc colors-box
|
||||||
[{:keys [file-id local? colors locale open? selected-assets
|
[{:keys [file-id local? colors locale open? selected-assets
|
||||||
on-asset-click on-assets-delete on-clear-selection] :as props}]
|
on-asset-click on-assets-delete on-clear-selection] :as props}]
|
||||||
(let [selected-colors (:colors selected-assets)
|
(let [state (mf/use-state {:folded-groups empty-folded-groups})
|
||||||
|
|
||||||
|
selected-colors (:colors selected-assets)
|
||||||
multi-colors? (> (count selected-colors) 1)
|
multi-colors? (> (count selected-colors) 1)
|
||||||
multi-assets? (or (not (empty? (:components selected-assets)))
|
multi-assets? (or (not (empty? (:components selected-assets)))
|
||||||
(not (empty? (:graphics selected-assets)))
|
(not (empty? (:graphics selected-assets)))
|
||||||
(not (empty? (:typographies selected-assets))))
|
(not (empty? (:typographies selected-assets))))
|
||||||
|
|
||||||
|
groups (group-assets colors)
|
||||||
|
folded-groups (:folded-groups @state)
|
||||||
|
|
||||||
add-color
|
add-color
|
||||||
(mf/use-callback
|
(mf/use-callback
|
||||||
(mf/deps file-id)
|
(mf/deps file-id)
|
||||||
|
@ -651,7 +659,39 @@
|
||||||
:on-accept add-color
|
:on-accept add-color
|
||||||
:data {:color "#406280"
|
:data {:color "#406280"
|
||||||
:opacity 1}
|
:opacity 1}
|
||||||
:position :right})))]
|
:position :right})))
|
||||||
|
|
||||||
|
create-group
|
||||||
|
(mf/use-callback
|
||||||
|
(mf/deps colors selected-colors on-clear-selection file-id)
|
||||||
|
(fn [name]
|
||||||
|
(on-clear-selection)
|
||||||
|
(st/emit! (dwu/start-undo-transaction))
|
||||||
|
(apply st/emit!
|
||||||
|
(->> colors
|
||||||
|
(filter #(contains? selected-colors (:id %)))
|
||||||
|
(map #(dwl/update-color
|
||||||
|
(assoc % :name
|
||||||
|
(str name " / "
|
||||||
|
(cp/merge-path-item (:path %) (:name %))))
|
||||||
|
file-id))))
|
||||||
|
(st/emit! (dwu/commit-undo-transaction))))
|
||||||
|
|
||||||
|
on-fold-group
|
||||||
|
(mf/use-callback
|
||||||
|
(mf/deps groups folded-groups)
|
||||||
|
(fn [path]
|
||||||
|
(fn [event]
|
||||||
|
(dom/stop-propagation event)
|
||||||
|
(swap! state update :folded-groups
|
||||||
|
toggle-folded-group path))))
|
||||||
|
|
||||||
|
on-group
|
||||||
|
(mf/use-callback
|
||||||
|
(mf/deps colors selected-colors)
|
||||||
|
(fn [event]
|
||||||
|
(dom/stop-propagation event)
|
||||||
|
(modal/show! :create-group-dialog {:create create-group})))]
|
||||||
|
|
||||||
[:div.asset-section
|
[:div.asset-section
|
||||||
[:div.asset-title {:class (when (not open?) "closed")}
|
[:div.asset-title {:class (when (not open?) "closed")}
|
||||||
|
@ -661,24 +701,41 @@
|
||||||
(when local?
|
(when local?
|
||||||
[:div.assets-button {:on-click add-color-clicked} i/plus])]
|
[:div.assets-button {:on-click add-color-clicked} i/plus])]
|
||||||
(when open?
|
(when open?
|
||||||
[:div.asset-list
|
(for [group groups]
|
||||||
(for [color colors]
|
(let [path (first group)
|
||||||
(let [color (cond-> color
|
colors (second group)
|
||||||
(:value color) (assoc :color (:value color) :opacity 1)
|
group-open? (not (contains? folded-groups path))]
|
||||||
(:value color) (dissoc :value)
|
[:*
|
||||||
true (assoc :file-id file-id))]
|
(when-not (empty? path)
|
||||||
[:& color-item {:key (:id color)
|
(let [[other-path last-path truncated] (cp/compact-path path 35)]
|
||||||
:color color
|
[:div.group-title {:class (when-not group-open? "closed")
|
||||||
:file-id file-id
|
:on-click (on-fold-group path)}
|
||||||
:local? local?
|
[:span i/arrow-slide]
|
||||||
:selected-colors selected-colors
|
(when-not (empty? other-path)
|
||||||
:multi-colors? multi-colors?
|
[:span.dim {:title (when truncated path)}
|
||||||
:multi-assets? multi-assets?
|
other-path "\u00A0/\u00A0"])
|
||||||
:on-asset-click on-asset-click
|
[:span {:title (when truncated path)}
|
||||||
:on-assets-delete on-assets-delete
|
last-path]]))
|
||||||
:on-clear-selection on-clear-selection
|
(when group-open?
|
||||||
:colors colors
|
[:div.asset-list
|
||||||
:locale locale}]))])]))
|
(for [color colors]
|
||||||
|
(let [color (cond-> color
|
||||||
|
(:value color) (assoc :color (:value color) :opacity 1)
|
||||||
|
(:value color) (dissoc :value)
|
||||||
|
true (assoc :file-id file-id))]
|
||||||
|
[:& color-item {:key (:id color)
|
||||||
|
:color color
|
||||||
|
:file-id file-id
|
||||||
|
:local? local?
|
||||||
|
:selected-colors selected-colors
|
||||||
|
:multi-colors? multi-colors?
|
||||||
|
:multi-assets? multi-assets?
|
||||||
|
:on-asset-click on-asset-click
|
||||||
|
:on-assets-delete on-assets-delete
|
||||||
|
:on-clear-selection on-clear-selection
|
||||||
|
:on-group on-group
|
||||||
|
:colors colors
|
||||||
|
:locale locale}]))])])))]))
|
||||||
|
|
||||||
|
|
||||||
;; ---- Typography box ----
|
;; ---- Typography box ----
|
||||||
|
@ -817,7 +874,6 @@
|
||||||
(vals (get-in state [:workspace-libraries id :data :colors])))))
|
(vals (get-in state [:workspace-libraries id :data :colors])))))
|
||||||
st/state =))
|
st/state =))
|
||||||
|
|
||||||
|
|
||||||
(defn file-media-ref
|
(defn file-media-ref
|
||||||
[id]
|
[id]
|
||||||
(l/derived (fn [state]
|
(l/derived (fn [state]
|
||||||
|
@ -860,7 +916,7 @@
|
||||||
(sort-by #(str/lower (:name %)) comp-fn))))
|
(sort-by #(str/lower (:name %)) comp-fn))))
|
||||||
|
|
||||||
(mf/defc file-library
|
(mf/defc file-library
|
||||||
[{:keys [file local? default-open? filters locale] :as props}]
|
[{:keys [file local? default-open? filters locale] :as props}]
|
||||||
(let [open-file (mf/deref (open-file-ref (:id file)))
|
(let [open-file (mf/deref (open-file-ref (:id file)))
|
||||||
open? (-> open-file
|
open? (-> open-file
|
||||||
:library
|
:library
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue