mirror of
https://github.com/penpot/penpot.git
synced 2025-06-16 17:42:18 +02:00
✨ Minor fixes on color palette.
This commit is contained in:
parent
1fb6a6c8a5
commit
7a3616d542
4 changed files with 125 additions and 90 deletions
|
@ -27,7 +27,7 @@
|
||||||
margin: 0 .5rem;
|
margin: 0 .5rem;
|
||||||
width: 1rem;
|
width: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
svg {
|
svg {
|
||||||
fill: $color-gray-50;
|
fill: $color-gray-50;
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.left-arrow {
|
.left-arrow {
|
||||||
transform: rotate(180deg);
|
transform: rotate(180deg);
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
margin-right: .5rem;
|
margin-right: .5rem;
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
|
|
||||||
.color-palette-buttons {
|
.color-palette-buttons {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -126,6 +126,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.color-palette-inside {
|
.color-palette-inside {
|
||||||
|
position: relative;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
transition: all .6s ease;
|
transition: all .6s ease;
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
(mf/defc thumbnails-content
|
(mf/defc thumbnails-content
|
||||||
[{:keys [children expanded? total] :as props}]
|
[{:keys [children expanded? total] :as props}]
|
||||||
(let [container (mf/use-ref)
|
(let [container (mf/use-ref)
|
||||||
width (mf/use-var (.. js/document -documentElement -clientWidth))
|
width (mf/use-var (.. js/document -documentElement -clientWidth))
|
||||||
element-width (mf/use-var 152)
|
element-width (mf/use-var 152)
|
||||||
|
|
||||||
offset (mf/use-state 0)
|
offset (mf/use-state 0)
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
;; --- Workspace
|
;; --- Workspace
|
||||||
|
|
||||||
(mf/defc workspace-content
|
(mf/defc workspace-content
|
||||||
[{:keys [page file layout] :as params}]
|
[{:keys [page file layout project] :as params}]
|
||||||
(let [left-sidebar? (not (empty? (keep layout [:layers :sitemap
|
(let [left-sidebar? (not (empty? (keep layout [:layers :sitemap
|
||||||
:document-history :libraries])))
|
:document-history :libraries])))
|
||||||
right-sidebar? (not (empty? (keep layout [:icons :drawtools :element-options])))
|
right-sidebar? (not (empty? (keep layout [:icons :drawtools :element-options])))
|
||||||
|
@ -51,7 +51,8 @@
|
||||||
|
|
||||||
[:*
|
[:*
|
||||||
(when (:colorpalette layout)
|
(when (:colorpalette layout)
|
||||||
[:& colorpalette {:left-sidebar? left-sidebar?}])
|
[:& colorpalette {:left-sidebar? left-sidebar?
|
||||||
|
:project project}])
|
||||||
|
|
||||||
[:section.workspace-content {:class classes}
|
[:section.workspace-content {:class classes}
|
||||||
[:& history-dialog]
|
[:& history-dialog]
|
||||||
|
|
|
@ -10,31 +10,32 @@
|
||||||
(ns uxbox.main.ui.workspace.colorpalette
|
(ns uxbox.main.ui.workspace.colorpalette
|
||||||
(:require
|
(:require
|
||||||
[beicon.core :as rx]
|
[beicon.core :as rx]
|
||||||
|
[goog.events :as events]
|
||||||
[okulary.core :as l]
|
[okulary.core :as l]
|
||||||
[rumext.alpha :as mf]
|
[rumext.alpha :as mf]
|
||||||
[uxbox.main.ui.icons :as i]
|
|
||||||
[uxbox.main.data.colors :as udc]
|
|
||||||
[uxbox.main.data.library :as dlib]
|
[uxbox.main.data.library :as dlib]
|
||||||
[uxbox.main.data.workspace :as udw]
|
[uxbox.main.data.workspace :as udw]
|
||||||
[uxbox.main.refs :as refs]
|
|
||||||
[uxbox.main.store :as st]
|
[uxbox.main.store :as st]
|
||||||
[uxbox.main.ui.components.context-menu :refer [context-menu]]
|
[uxbox.main.ui.components.context-menu :refer [context-menu]]
|
||||||
|
[uxbox.main.ui.icons :as i]
|
||||||
[uxbox.main.ui.keyboard :as kbd]
|
[uxbox.main.ui.keyboard :as kbd]
|
||||||
[uxbox.util.color :refer [hex->rgb]]
|
[uxbox.util.color :refer [hex->rgb]]
|
||||||
[uxbox.util.dom :as dom]))
|
[uxbox.util.dom :as dom]
|
||||||
|
[uxbox.util.object :as obj]))
|
||||||
|
|
||||||
;; --- Refs
|
;; --- Refs
|
||||||
|
|
||||||
(def libraries-ref
|
(def palettes-ref
|
||||||
(l/derived #(get-in % [:library :palettes]) st/state))
|
(-> (l/in [:library :palettes])
|
||||||
|
|
||||||
(defn selected-items-ref
|
|
||||||
[library-id]
|
|
||||||
(-> #(get-in % [:library-items :palettes library-id])
|
|
||||||
(l/derived st/state)))
|
(l/derived st/state)))
|
||||||
|
|
||||||
(def selected-library-ref
|
(def selected-palette-ref
|
||||||
(-> #(get-in % [:library-selected :palettes])
|
(-> (l/in [:library-selected :palettes])
|
||||||
|
(l/derived st/state)))
|
||||||
|
|
||||||
|
(defn- make-selected-palette-item-ref
|
||||||
|
[lib-id]
|
||||||
|
(-> (l/in [:library-items :palettes lib-id])
|
||||||
(l/derived st/state)))
|
(l/derived st/state)))
|
||||||
|
|
||||||
;; --- Components
|
;; --- Components
|
||||||
|
@ -42,6 +43,7 @@
|
||||||
(mf/defc palette-item
|
(mf/defc palette-item
|
||||||
[{:keys [color] :as props}]
|
[{:keys [color] :as props}]
|
||||||
(let [rgb-vec (hex->rgb color)
|
(let [rgb-vec (hex->rgb color)
|
||||||
|
|
||||||
select-color
|
select-color
|
||||||
(fn [event]
|
(fn [event]
|
||||||
(if (kbd/shift? event)
|
(if (kbd/shift? event)
|
||||||
|
@ -54,85 +56,116 @@
|
||||||
[:span.color-text color]]))
|
[:span.color-text color]]))
|
||||||
|
|
||||||
(mf/defc palette
|
(mf/defc palette
|
||||||
[{:keys [libraries left-sidebar?] :as props}]
|
[{:keys [palettes selected left-sidebar?] :as props}]
|
||||||
|
(let [items-ref (mf/use-memo
|
||||||
|
(mf/deps selected)
|
||||||
|
(partial make-selected-palette-item-ref selected))
|
||||||
|
|
||||||
(let [current-selection (or (mf/deref selected-library-ref) (-> libraries first :id))
|
items (mf/deref items-ref)
|
||||||
state (mf/use-state {:show-menu false })]
|
state (mf/use-state {:show-menu false })
|
||||||
|
|
||||||
|
width (:width @state 0)
|
||||||
|
visible (/ width 66)
|
||||||
|
|
||||||
|
offset (:offset @state 0)
|
||||||
|
max-offset (- (count items)
|
||||||
|
visible)
|
||||||
|
|
||||||
|
close-fn #(st/emit! (udw/toggle-layout-flag :colorpalette))
|
||||||
|
container (mf/use-ref nil)
|
||||||
|
|
||||||
|
on-left-arrow-click
|
||||||
|
(mf/use-callback
|
||||||
|
(fn [event]
|
||||||
|
(swap! state update :offset
|
||||||
|
(fn [offset]
|
||||||
|
(if (pos? offset)
|
||||||
|
(dec offset)
|
||||||
|
offset)))))
|
||||||
|
|
||||||
|
on-right-arrow-click
|
||||||
|
(mf/use-callback
|
||||||
|
(mf/deps max-offset)
|
||||||
|
(fn [event]
|
||||||
|
(swap! state update :offset
|
||||||
|
(fn [offset]
|
||||||
|
(if (< offset max-offset)
|
||||||
|
(inc offset)
|
||||||
|
offset)))))
|
||||||
|
|
||||||
|
on-scroll
|
||||||
|
(mf/use-callback
|
||||||
|
(mf/deps max-offset)
|
||||||
|
(fn [event]
|
||||||
|
(if (pos? (.. event -nativeEvent -deltaY))
|
||||||
|
(on-right-arrow-click event)
|
||||||
|
(on-left-arrow-click event))))
|
||||||
|
|
||||||
|
on-resize
|
||||||
|
(mf/use-callback
|
||||||
|
(fn [event]
|
||||||
|
(let [dom (mf/ref-val container)
|
||||||
|
width (obj/get dom "clientWidth")]
|
||||||
|
(swap! state assoc :width width))))
|
||||||
|
|
||||||
|
handle-click
|
||||||
|
(mf/use-callback
|
||||||
|
(fn [library]
|
||||||
|
(st/emit! (dlib/select-library :palettes (:id library)))))]
|
||||||
|
|
||||||
|
(mf/use-layout-effect
|
||||||
|
#(let [dom (mf/ref-val container)
|
||||||
|
width (obj/get dom "clientWidth")]
|
||||||
|
(swap! state assoc :width width)))
|
||||||
|
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
(mf/deps current-selection)
|
#(let [key1 (events/listen js/window "resize" on-resize)]
|
||||||
#(when current-selection
|
(fn []
|
||||||
(st/emit! (dlib/retrieve-library-data :palettes current-selection))))
|
(events/unlistenByKey key1))))
|
||||||
|
|
||||||
(let [items (or (mf/deref (selected-items-ref current-selection)) [])
|
(mf/use-effect
|
||||||
doc-width (.. js/document -documentElement -clientWidth)
|
(mf/deps selected)
|
||||||
width (:width @state (* doc-width 0.84))
|
(fn []
|
||||||
offset (:offset @state 0)
|
(when selected
|
||||||
visible (/ width 86)
|
(st/emit! (dlib/retrieve-library-data :palettes selected)))))
|
||||||
invisible (- (count items) visible)
|
|
||||||
close #(st/emit! (udw/toggle-layout-flag :colorpalette))
|
|
||||||
container (mf/use-ref nil)
|
|
||||||
container-child (mf/use-ref nil)
|
|
||||||
|
|
||||||
on-left-arrow-click
|
[:div.color-palette {:class (when left-sidebar? "left-sidebar-open")}
|
||||||
(fn [event]
|
[:& context-menu
|
||||||
(when (> offset 0)
|
{:selectable true
|
||||||
(let [element (mf/ref-val container-child)]
|
:selected (->> palettes
|
||||||
(swap! state update :offset dec))))
|
(filter #(= (:id %) selected))
|
||||||
|
first
|
||||||
|
:name)
|
||||||
|
:show (:show-menu @state)
|
||||||
|
:on-close #(swap! state assoc :show-menu false)
|
||||||
|
:options (mapv #(vector (:name %) (partial handle-click %)) palettes)}]
|
||||||
|
|
||||||
on-right-arrow-click
|
[:div.color-palette-actions
|
||||||
(fn [event]
|
{:on-click #(swap! state assoc :show-menu true)}
|
||||||
(when (< offset invisible)
|
[:div.color-palette-actions-button i/actions]]
|
||||||
(let [element (mf/ref-val container-child)]
|
|
||||||
(swap! state update :offset inc))))
|
|
||||||
|
|
||||||
on-scroll
|
[:span.left-arrow {:on-click on-left-arrow-click} i/arrow-slide]
|
||||||
(fn [event]
|
[:div.color-palette-content {:ref container :on-wheel on-scroll}
|
||||||
(if (pos? (.. event -nativeEvent -deltaY))
|
[:div.color-palette-inside {:style {:position "relative"
|
||||||
(on-right-arrow-click event)
|
:right (str (* 66 offset) "px")}}
|
||||||
(on-left-arrow-click event)))
|
(for [item items]
|
||||||
|
[:& palette-item {:color (:content item) :key (:id item)}])]]
|
||||||
after-render
|
[:span.right-arrow {:on-click on-right-arrow-click} i/arrow-slide]]))
|
||||||
(fn []
|
|
||||||
(let [dom (mf/ref-val container)
|
|
||||||
width (.-clientWidth dom)]
|
|
||||||
(when (not= (:width @state) width)
|
|
||||||
(swap! state assoc :width width))))
|
|
||||||
|
|
||||||
handle-click
|
|
||||||
(fn [library]
|
|
||||||
(st/emit! (dlib/select-library :palettes (:id library))))]
|
|
||||||
|
|
||||||
(mf/use-effect nil after-render)
|
|
||||||
|
|
||||||
[:div.color-palette {:class (when left-sidebar? "left-sidebar-open")}
|
|
||||||
[:& context-menu {:selectable true
|
|
||||||
:selected (->> libraries (filter #(= (:id %) current-selection)) first :name)
|
|
||||||
:show (:show-menu @state)
|
|
||||||
:on-close #(swap! state assoc :show-menu false)
|
|
||||||
:options (mapv #(vector (:name %) (partial handle-click %)) libraries)} ]
|
|
||||||
[:div.color-palette-actions
|
|
||||||
{:on-click #(swap! state assoc :show-menu true)}
|
|
||||||
[:div.color-palette-actions-button i/actions]]
|
|
||||||
|
|
||||||
[:span.left-arrow {:on-click on-left-arrow-click} i/arrow-slide]
|
|
||||||
|
|
||||||
[:div.color-palette-content {:ref container :on-wheel on-scroll}
|
|
||||||
[:div.color-palette-inside {:ref container-child
|
|
||||||
:style {:position "relative"
|
|
||||||
:width (str (* 86 (count items)) "px")
|
|
||||||
:right (str (* 86 offset) "px")}}
|
|
||||||
(for [item items]
|
|
||||||
[:& palette-item {:color (:content item) :key (:id item)}])]]
|
|
||||||
|
|
||||||
[:span.right-arrow {:on-click on-right-arrow-click} i/arrow-slide]]))
|
|
||||||
)
|
|
||||||
|
|
||||||
(mf/defc colorpalette
|
(mf/defc colorpalette
|
||||||
[{:keys [left-sidebar?]}]
|
[{:keys [left-sidebar? project] :as props}]
|
||||||
(let [team-id (-> refs/workspace-project mf/deref :team-id)
|
(let [team-id (:team-id project)
|
||||||
libraries (-> libraries-ref mf/deref vals flatten)]
|
palettes (->> (mf/deref palettes-ref)
|
||||||
(mf/use-effect #(st/emit! (dlib/retrieve-libraries :palettes)
|
(vals)
|
||||||
(dlib/retrieve-libraries :palettes team-id)))
|
(mapcat identity))
|
||||||
|
selected (or (mf/deref selected-palette-ref)
|
||||||
|
(:id (first palettes)))]
|
||||||
|
(mf/use-effect
|
||||||
|
(mf/deps team-id)
|
||||||
|
(fn []
|
||||||
|
(st/emit! (dlib/retrieve-libraries :palettes)
|
||||||
|
(dlib/retrieve-libraries :palettes team-id))))
|
||||||
|
|
||||||
[:& palette {:left-sidebar? left-sidebar?
|
[:& palette {:left-sidebar? left-sidebar?
|
||||||
:libraries libraries}]))
|
:selected selected
|
||||||
|
:palettes palettes}]))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue