mirror of
https://github.com/penpot/penpot.git
synced 2025-04-05 03:21:26 -05:00
🐛 Rewrite active tokens calculation algorithm (#6165)
This commit is contained in:
parent
237d9d067d
commit
6a87d5eea9
2 changed files with 226 additions and 36 deletions
|
@ -1227,18 +1227,15 @@ Will return a value that matches this schema:
|
|||
:none)))
|
||||
|
||||
(get-active-themes-set-tokens [this]
|
||||
(let [sets-order (get-ordered-set-names this)
|
||||
active-themes (get-active-themes this)
|
||||
order-theme-set (fn [theme]
|
||||
(filter #(contains? (set (:sets theme)) %) sets-order))]
|
||||
(reduce
|
||||
(fn [tokens theme]
|
||||
(reduce
|
||||
(fn [tokens' cur]
|
||||
(merge tokens' (:tokens (get-set this cur))))
|
||||
tokens (order-theme-set theme)))
|
||||
(d/ordered-map)
|
||||
active-themes)))
|
||||
(let [theme-set-names (get-active-themes-set-names this)
|
||||
all-set-names (get-ordered-set-names this)
|
||||
active-set-names (filter theme-set-names all-set-names)
|
||||
tokens (reduce (fn [tokens set-name]
|
||||
(let [set (get-set this set-name)]
|
||||
(merge tokens (:tokens set))))
|
||||
(d/ordered-map)
|
||||
active-set-names)]
|
||||
tokens))
|
||||
|
||||
(encode-dtcg [this]
|
||||
(let [themes-xform
|
||||
|
|
|
@ -441,32 +441,225 @@
|
|||
(t/is (nil? token'))
|
||||
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-in-order
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-theme (ctob/make-token-theme :name "out-of-order-theme"
|
||||
;; Out of order sets in theme
|
||||
:sets ["unknown-set" "set-b" "set-a"]))
|
||||
(ctob/set-active-themes #{"/out-of-order-theme"})
|
||||
(t/deftest get-ordered-sets
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-set (ctob/make-token-set :name "group-1/set-a"))
|
||||
(ctob/add-set (ctob/make-token-set :name "group-1/set-b"))
|
||||
(ctob/add-set (ctob/make-token-set :name "group-2/set-a"))
|
||||
(ctob/add-set (ctob/make-token-set :name "group-1/set-c")))
|
||||
|
||||
(ctob/add-set (ctob/make-token-set :name "set-a"))
|
||||
(ctob/add-token-in-set "set-a" (ctob/make-token :name "set-a-token"
|
||||
:type :boolean
|
||||
:value true))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-b"))
|
||||
(ctob/add-token-in-set "set-b" (ctob/make-token :name "set-b-token"
|
||||
:type :boolean
|
||||
:value true))
|
||||
;; Ignore this set
|
||||
(ctob/add-set (ctob/make-token-set :name "inactive-set"))
|
||||
(ctob/add-token-in-set "inactive-set" (ctob/make-token :name "inactive-set-token"
|
||||
:type :boolean
|
||||
:value true)))
|
||||
ordered-sets (ctob/get-ordered-set-names tokens-lib)]
|
||||
|
||||
expected-order (ctob/get-ordered-set-names tokens-lib)
|
||||
expected-tokens (ctob/get-active-themes-set-tokens tokens-lib)
|
||||
expected-token-names (mapv key expected-tokens)]
|
||||
(t/is (= '("set-a" "set-b" "inactive-set") expected-order))
|
||||
(t/is (= ["set-a-token" "set-b-token"] expected-token-names))))
|
||||
(t/is (= ordered-sets '("group-1/set-a"
|
||||
"group-1/set-b"
|
||||
"group-1/set-c"
|
||||
"group-2/set-a")))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-no-theme
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-set (ctob/make-token-set :name "set-a"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 10)
|
||||
"token-2"
|
||||
(ctob/make-token :name "token-2"
|
||||
:type :border-radius
|
||||
:value 20)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-b"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 100)
|
||||
"token-3"
|
||||
(ctob/make-token :name "token-3"
|
||||
:type :border-radius
|
||||
:value 300)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-c"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 1000)
|
||||
"token-2"
|
||||
(ctob/make-token :name "token-2"
|
||||
:type :border-radius
|
||||
:value 2000)
|
||||
"token-3"
|
||||
(ctob/make-token :name "token-3"
|
||||
:type :border-radius
|
||||
:value 3000)
|
||||
"token-4"
|
||||
(ctob/make-token :name "token-4"
|
||||
:type :border-radius
|
||||
:value 4000)}))
|
||||
(ctob/update-theme ctob/hidden-token-theme-group ctob/hidden-token-theme-name
|
||||
#(ctob/enable-sets % #{"set-a" "set-b"})))
|
||||
|
||||
tokens (ctob/get-active-themes-set-tokens tokens-lib)]
|
||||
|
||||
(t/is (= (mapv key tokens) ["token-1" "token-2" "token-3"]))
|
||||
(t/is (= (get-in tokens ["token-1" :value]) 100))
|
||||
(t/is (= (get-in tokens ["token-2" :value]) 20))
|
||||
(t/is (= (get-in tokens ["token-3" :value]) 300))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-one-theme
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-set (ctob/make-token-set :name "set-a"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 10)
|
||||
"token-2"
|
||||
(ctob/make-token :name "token-2"
|
||||
:type :border-radius
|
||||
:value 20)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-b"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 100)
|
||||
"token-3"
|
||||
(ctob/make-token :name "token-3"
|
||||
:type :border-radius
|
||||
:value 300)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-c"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 1000)
|
||||
"token-2"
|
||||
(ctob/make-token :name "token-2"
|
||||
:type :border-radius
|
||||
:value 2000)
|
||||
"token-3"
|
||||
(ctob/make-token :name "token-3"
|
||||
:type :border-radius
|
||||
:value 3000)
|
||||
"token-4"
|
||||
(ctob/make-token :name "token-4"
|
||||
:type :border-radius
|
||||
:value 4000)}))
|
||||
(ctob/add-theme (ctob/make-token-theme :name "single-theme"
|
||||
:sets #{"set-b" "set-c" "set-a"}))
|
||||
(ctob/set-active-themes #{"/single-theme"}))
|
||||
|
||||
tokens (ctob/get-active-themes-set-tokens tokens-lib)]
|
||||
|
||||
;; Note that sets order inside the theme is undefined. What matters is order in that the
|
||||
;; sets have been added to the library.
|
||||
(t/is (= (mapv key tokens) ["token-1" "token-2" "token-3" "token-4"]))
|
||||
(t/is (= (get-in tokens ["token-1" :value]) 1000))
|
||||
(t/is (= (get-in tokens ["token-2" :value]) 2000))
|
||||
(t/is (= (get-in tokens ["token-3" :value]) 3000))
|
||||
(t/is (= (get-in tokens ["token-4" :value]) 4000))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-two-themes
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-set (ctob/make-token-set :name "set-a"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 10)
|
||||
"token-2"
|
||||
(ctob/make-token :name "token-2"
|
||||
:type :border-radius
|
||||
:value 20)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-b"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 100)
|
||||
"token-3"
|
||||
(ctob/make-token :name "token-3"
|
||||
:type :border-radius
|
||||
:value 300)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "set-c"
|
||||
:tokens {"token-1"
|
||||
(ctob/make-token :name "token-1"
|
||||
:type :border-radius
|
||||
:value 1000)
|
||||
"token-2"
|
||||
(ctob/make-token :name "token-2"
|
||||
:type :border-radius
|
||||
:value 2000)
|
||||
"token-3"
|
||||
(ctob/make-token :name "token-3"
|
||||
:type :border-radius
|
||||
:value 3000)
|
||||
"token-4"
|
||||
(ctob/make-token :name "token-4"
|
||||
:type :border-radius
|
||||
:value 4000)}))
|
||||
(ctob/add-theme (ctob/make-token-theme :name "theme-1"
|
||||
:sets #{"set-b"}))
|
||||
(ctob/add-theme (ctob/make-token-theme :name "theme-2"
|
||||
:sets #{"set-b" "set-a"}))
|
||||
(ctob/set-active-themes #{"/theme-1" "/theme-2"}))
|
||||
|
||||
tokens (ctob/get-active-themes-set-tokens tokens-lib)]
|
||||
|
||||
;; Note that themes order is irrelevant. What matters is the union of the active sets
|
||||
;; and the order of the sets in the library.
|
||||
(t/is (= (mapv key tokens) ["token-1" "token-2" "token-3"]))
|
||||
(t/is (= (get-in tokens ["token-1" :value]) 100))
|
||||
(t/is (= (get-in tokens ["token-2" :value]) 20))
|
||||
(t/is (= (get-in tokens ["token-3" :value]) 300))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-bug-taiga-10617
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-set (ctob/make-token-set :name "Mode / Dark"
|
||||
:tokens {"red"
|
||||
(ctob/make-token :name "red"
|
||||
:type :color
|
||||
:value "#700000")}))
|
||||
(ctob/add-set (ctob/make-token-set :name "Mode / Light"
|
||||
:tokens {"red"
|
||||
(ctob/make-token :name "red"
|
||||
:type :color
|
||||
:value "#ff0000")}))
|
||||
(ctob/add-set (ctob/make-token-set :name "Device / Desktop"
|
||||
:tokens {"border1"
|
||||
(ctob/make-token :name "border1"
|
||||
:type :border-radius
|
||||
:value 30)}))
|
||||
(ctob/add-set (ctob/make-token-set :name "Device / Mobile"
|
||||
:tokens {"border1"
|
||||
(ctob/make-token :name "border1"
|
||||
:type :border-radius
|
||||
:value 50)}))
|
||||
(ctob/add-theme (ctob/make-token-theme :group "App"
|
||||
:name "Mobile"
|
||||
:sets #{"Mode / Dark" "Device / Mobile"}))
|
||||
(ctob/add-theme (ctob/make-token-theme :group "App"
|
||||
:name "Web"
|
||||
:sets #{"Mode / Dark" "Mode / Light" "Device / Desktop"}))
|
||||
(ctob/add-theme (ctob/make-token-theme :group "Brand"
|
||||
:name "Brand A"
|
||||
:sets #{"Mode / Dark" "Mode / Light" "Device / Desktop" "Device / Mobile"}))
|
||||
(ctob/add-theme (ctob/make-token-theme :group "Brand"
|
||||
:name "Brand B"
|
||||
:sets #{}))
|
||||
(ctob/set-active-themes #{"App/Web" "Brand/Brand A"}))
|
||||
|
||||
tokens (ctob/get-active-themes-set-tokens tokens-lib)]
|
||||
|
||||
(t/is (= (mapv key tokens) ["red" "border1"]))
|
||||
(t/is (= (get-in tokens ["red" :value]) "#ff0000"))
|
||||
(t/is (= (get-in tokens ["border1" :value]) 50))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-no-tokens
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
(ctob/add-set (ctob/make-token-set :name "set-a")))
|
||||
|
||||
tokens (ctob/get-active-themes-set-tokens tokens-lib)]
|
||||
|
||||
(t/is (empty? tokens))))
|
||||
|
||||
(t/deftest list-active-themes-tokens-no-sets
|
||||
(let [tokens-lib (ctob/make-tokens-lib)
|
||||
tokens (ctob/get-active-themes-set-tokens tokens-lib)]
|
||||
|
||||
(t/is (empty? tokens))))
|
||||
|
||||
(t/deftest sets-at-path-active-state
|
||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||
|
|
Loading…
Add table
Reference in a new issue