0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-15 19:48:22 -05:00

🔧 Add first draft of token set groups attributes

This commit is contained in:
Andrés Moya 2024-09-05 17:51:02 +02:00
parent fa8f8ac54b
commit e2ff6f7ba6
2 changed files with 57 additions and 14 deletions

View file

@ -123,6 +123,16 @@
token-set)) token-set))
;; === TokenSetGroup
(defrecord TokenSetGroup [attr1 attr2])
;; TODO schema, validators, etc.
(defn make-token-set-group
[]
(TokenSetGroup. "one" "two"))
;; === TokenSets (collection) ;; === TokenSets (collection)
(defprotocol ITokenSets (defprotocol ITokenSets
@ -131,7 +141,8 @@
(delete-set [_ set-name] "delete a set in the library") (delete-set [_ set-name] "delete a set in the library")
(set-count [_] "get the total number if sets in the library") (set-count [_] "get the total number if sets in the library")
(get-sets [_] "get an ordered sequence of all sets in the library") (get-sets [_] "get an ordered sequence of all sets in the library")
(get-set [_ set-name] "get one set looking for name")) (get-set [_ set-name] "get one set looking for name")
(get-set-group [_ set-group-path] "get the attributes of a set group"))
(def schema:token-sets (def schema:token-sets
[:and [:and
@ -231,23 +242,30 @@
(toggle-set-in-theme [_ theme-name set-name] "toggle a set used / not used in a theme") (toggle-set-in-theme [_ theme-name set-name] "toggle a set used / not used in a theme")
(validate [_])) (validate [_]))
(deftype TokensLib [sets themes] (declare get-path)
(deftype TokensLib [sets set-groups themes]
;; NOTE: This is only for debug purposes, pending to properly ;; NOTE: This is only for debug purposes, pending to properly
;; implement the toString and alternative printing. ;; implement the toString and alternative printing.
#?@(:clj [clojure.lang.IDeref #?@(:clj [clojure.lang.IDeref
(deref [_] {:sets sets :themes themes})] (deref [_] {:sets sets :set-groups set-groups :themes themes})]
:cljs [cljs.core/IDeref :cljs [cljs.core/IDeref
(-deref [_] {:sets sets :themes themes})]) (-deref [_] {:sets sets :set-groups set-groups :themes themes})])
#?@(:cljs [cljs.core/IEncodeJS #?@(:cljs [cljs.core/IEncodeJS
(-clj->js [_] (js-obj "sets" (clj->js sets) (-clj->js [_] (js-obj "sets" (clj->js sets)
"set-groups" (clj->js set-groups)
"themes" (clj->js themes)))]) "themes" (clj->js themes)))])
ITokenSets ITokenSets
(add-set [_ token-set] (add-set [_ token-set]
(dm/assert! "expected valid token set" (check-token-set! token-set)) (dm/assert! "expected valid token set" (check-token-set! token-set))
(TokensLib. (assoc sets (:name token-set) token-set) (let [path (get-path token-set)]
themes)) (TokensLib. (assoc sets (:name token-set) token-set)
(cond-> set-groups
(seq path)
(assoc path (make-token-set-group)))
themes)))
(update-set [this set-name f] (update-set [this set-name f]
(if-let [set (get sets set-name)] (if-let [set (get sets set-name)]
@ -260,11 +278,13 @@
(-> sets (-> sets
(dissoc (:name set)) (dissoc (:name set))
(d/addm-at-index index (:name set') set')))) (d/addm-at-index index (:name set') set'))))
set-groups ;; TODO update set-groups as needed
themes)) themes))
this)) this))
(delete-set [_ set-name] (delete-set [_ set-name]
(TokensLib. (dissoc sets set-name) (TokensLib. (dissoc sets set-name)
set-groups ;; TODO remove set-group if needed
themes)) themes))
(set-count [_] (set-count [_]
@ -276,10 +296,14 @@
(get-set [_ set-name] (get-set [_ set-name]
(get sets set-name)) (get sets set-name))
(get-set-group [_ set-group-path]
(get set-groups set-group-path))
ITokenThemes ITokenThemes
(add-theme [_ token-theme] (add-theme [_ token-theme]
(dm/assert! "expected valid token theme" (check-token-theme! token-theme)) (dm/assert! "expected valid token theme" (check-token-theme! token-theme))
(TokensLib. sets (TokensLib. sets
set-groups
(assoc themes (:name token-theme) token-theme))) (assoc themes (:name token-theme) token-theme)))
(update-theme [this theme-name f] (update-theme [this theme-name f]
@ -288,6 +312,7 @@
(assoc :modified-at (dt/now)))] (assoc :modified-at (dt/now)))]
(check-token-theme! theme') (check-token-theme! theme')
(TokensLib. sets (TokensLib. sets
set-groups
(if (= (:name theme) (:name theme')) (if (= (:name theme) (:name theme'))
(assoc themes (:name theme') theme') (assoc themes (:name theme') theme')
(let [index (d/index-of (keys themes) (:name theme))] (let [index (d/index-of (keys themes) (:name theme))]
@ -298,6 +323,7 @@
(delete-theme [_ theme-name] (delete-theme [_ theme-name]
(TokensLib. sets (TokensLib. sets
set-groups
(dissoc themes theme-name))) (dissoc themes theme-name)))
(theme-count [_] (theme-count [_]
@ -314,6 +340,7 @@
(dm/assert! "expected valid token instance" (check-token! token)) (dm/assert! "expected valid token instance" (check-token! token))
(if (contains? sets set-name) (if (contains? sets set-name)
(TokensLib. (update sets set-name add-token token) (TokensLib. (update sets set-name add-token token)
set-groups
themes) themes)
this)) this))
@ -321,6 +348,7 @@
(if (contains? sets set-name) (if (contains? sets set-name)
(TokensLib. (update sets set-name (TokensLib. (update sets set-name
#(update-token % token-name f)) #(update-token % token-name f))
set-groups
themes) themes)
this)) this))
@ -328,18 +356,20 @@
(if (contains? sets set-name) (if (contains? sets set-name)
(TokensLib. (update sets set-name (TokensLib. (update sets set-name
#(delete-token % token-name)) #(delete-token % token-name))
set-groups
themes) themes)
this)) this))
(toggle-set-in-theme [this theme-name set-name] (toggle-set-in-theme [this theme-name set-name]
(if (contains? themes theme-name) (if (contains? themes theme-name)
(TokensLib. sets (TokensLib. sets
set-groups
(update themes theme-name (update themes theme-name
#(toggle-set % set-name))) #(toggle-set % set-name)))
this)) this))
(validate [_] (validate [_]
(and (valid-token-sets? sets) (and (valid-token-sets? sets) ;; TODO: validate set-groups
(valid-token-themes? themes)))) (valid-token-themes? themes))))
(defn valid-tokens-lib? (defn valid-tokens-lib?
@ -362,10 +392,11 @@
;; structure the data and the order separately as we already do ;; structure the data and the order separately as we already do
;; with pages and pages-index. ;; with pages and pages-index.
(make-tokens-lib :sets (d/ordered-map) (make-tokens-lib :sets (d/ordered-map)
:set-groups {}
:themes (d/ordered-map))) :themes (d/ordered-map)))
([& {:keys [sets themes]}] ([& {:keys [sets set-groups themes]}]
(let [tokens-lib (TokensLib. sets themes)] (let [tokens-lib (TokensLib. sets set-groups themes)]
(dm/assert! (dm/assert!
"expected valid tokens lib" "expected valid tokens lib"
@ -438,13 +469,15 @@
{:name "penpot/tokens-lib/v1" {:name "penpot/tokens-lib/v1"
:class TokensLib :class TokensLib
:wfn (fn [n w o] :wfn (fn [n w o]
(fres/write-tag! w n 2) (fres/write-tag! w n 3)
(fres/write-object! w (.-sets o)) (fres/write-object! w (.-sets o))
(fres/write-object! w (.-set-groups o))
(fres/write-object! w (.-themes o))) (fres/write-object! w (.-themes o)))
:rfn (fn [r] :rfn (fn [r]
(let [sets (fres/read-object! r) (let [sets (fres/read-object! r)
themes (fres/read-object! r)] set-groups (fres/read-object! r)
(->TokensLib sets themes)))})) themes (fres/read-object! r)]
(->TokensLib sets set-groups themes)))}))
;; === Groups handling ;; === Groups handling

View file

@ -128,6 +128,16 @@
(t/is (= (first token-sets') token-set)) (t/is (= (first token-sets') token-set))
(t/is (= token-set' token-set)))) (t/is (= token-set' token-set))))
(t/deftest add-token-set-with-group
(let [tokens-lib (ctob/make-tokens-lib)
token-set (ctob/make-token-set :name "test-group.test-token-set")
tokens-lib' (ctob/add-set tokens-lib token-set)
set-group (ctob/get-set-group tokens-lib' "test-group")]
(t/is (= (:attr1 set-group) "one"))
(t/is (= (:attr2 set-group) "two"))))
(t/deftest update-token-set (t/deftest update-token-set
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set"))) (ctob/add-set (ctob/make-token-set :name "test-token-set")))