diff --git a/common/src/app/common/logic/shapes.cljc b/common/src/app/common/logic/shapes.cljc index 6590c7bed8..1f41a71c54 100644 --- a/common/src/app/common/logic/shapes.cljc +++ b/common/src/app/common/logic/shapes.cljc @@ -11,6 +11,7 @@ [app.common.files.helpers :as cfh] [app.common.geom.shapes :as gsh] [app.common.logic.variant-properties :as clvp] + [app.common.text :as ct] [app.common.types.component :as ctk] [app.common.types.container :as ctn] [app.common.types.pages-list :as ctpl] @@ -21,9 +22,12 @@ [app.common.uuid :as uuid] [clojure.set :as set])) +(def text-typography-attrs (set ct/text-typography-attrs)) + (defn- generate-unapply-tokens "When updating attributes that have a token applied, we must unapply it, because the value - of the attribute now has been given directly, and does not come from the token." + of the attribute now has been given directly, and does not come from the token. + When applying a typography asset style we also unapply any typographic tokens." [changes objects changed-sub-attr] (let [new-objects (pcb/get-objects changes) mod-obj-changes (->> (:redo-changes changes) @@ -32,7 +36,11 @@ text-changed-attrs (fn [shape] (let [new-shape (get new-objects (:id shape)) - attrs (ctt/get-diff-attrs (:content shape) (:content new-shape))] + attrs (ctt/get-diff-attrs (:content shape) (:content new-shape)) + ;; Unapply token when applying typography asset style + attrs (if (set/intersection text-typography-attrs attrs) + (into attrs cto/typography-keys) + attrs)] (apply set/union (map cto/shape-attr->token-attrs attrs)))) check-attr (fn [shape changes attr] diff --git a/frontend/src/app/main/data/workspace/tokens/application.cljs b/frontend/src/app/main/data/workspace/tokens/application.cljs index b457963c01..c011cabcc4 100644 --- a/frontend/src/app/main/data/workspace/tokens/application.cljs +++ b/frontend/src/app/main/data/workspace/tokens/application.cljs @@ -250,53 +250,37 @@ (dwsl/update-layout-child shape-ids props {:ignore-touched true :page-id page-id})))))))) +(defn generate-text-shape-update + [txt-attrs shape-ids page-id] + (let [update-node? (fn [node] + (or (txt/is-text-node? node) + (txt/is-paragraph-node? node))) + update-fn (fn [node _] + (-> node + (d/txt-merge txt-attrs) + (cty/remove-typography-from-node)))] + (dwsh/update-shapes shape-ids + #(txt/update-text-content % update-node? update-fn nil) + {:ignore-touched true + :page-id page-id}))) + (defn update-line-height ([value shape-ids attributes] (update-line-height value shape-ids attributes nil)) ([value shape-ids _attributes page-id] - (let [update-node? (fn [node] - (or (txt/is-text-node? node) - (txt/is-paragraph-node? node))) - update-fn (fn [node _] - (-> node - (d/txt-merge {:line-height value}) - (cty/remove-typography-from-node)))] - (when (number? value) - (dwsh/update-shapes shape-ids - #(txt/update-text-content % update-node? update-fn nil) - {:ignore-touched true - :page-id page-id}))))) + (when (number? value) + (generate-text-shape-update {:line-height value} shape-ids page-id)))) (defn update-letter-spacing ([value shape-ids attributes] (update-letter-spacing value shape-ids attributes nil)) ([value shape-ids _attributes page-id] - (let [update-node? (fn [node] - (or (txt/is-text-node? node) - (txt/is-paragraph-node? node))) - update-fn (fn [node _] - (-> node - (d/txt-merge {:letter-spacing (str value)}) - (cty/remove-typography-from-node)))] - (when (number? value) - (dwsh/update-shapes shape-ids - #(txt/update-text-content % update-node? update-fn nil) - {:ignore-touched true - :page-id page-id}))))) + (when (number? value) + (generate-text-shape-update {:letter-spacing (str value)} shape-ids page-id)))) (defn update-font-size ([value shape-ids attributes] (update-font-size value shape-ids attributes nil)) ([value shape-ids _attributes page-id] - (let [update-node? (fn [node] - (or (txt/is-text-node? node) - (txt/is-paragraph-node? node))) - update-fn (fn [node _] - (-> node - (d/txt-merge {:font-size (str value)}) - (cty/remove-typography-from-node)))] - (when (number? value) - (dwsh/update-shapes shape-ids - #(txt/update-text-content % update-node? update-fn nil) - {:ignore-touched true - :page-id page-id}))))) + (when (number? value) + (generate-text-shape-update {:font-size (str value)} shape-ids page-id)))) ;; Events to apply / unapply tokens to shapes ------------------------------------------------------------