From cccea3dc71874a1da912d16e98eac5cceecbb357 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Wed, 23 Jul 2025 15:35:52 +0200 Subject: [PATCH] :sparkles: Add test for spacing token application rules --- .../tokens/management/context_menu.cljs | 13 +++--- .../tokens/logic/token_actions_test.cljs | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs b/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs index 86a054e336..c0d5a2cc69 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs @@ -456,17 +456,20 @@ (let [objects (mf/deref refs/workspace-page-objects) selected (mf/deref refs/selected-shapes) + token-name (:token-name mdata) + token (mf/deref (refs/workspace-token-in-selected-set token-name)) + token-type (:type token) + selected-token-set-name (mf/deref refs/selected-token-set-name) + selected-shapes (mf/with-memo [selected objects] (into [] (keep (d/getf objects)) selected)) is-selected-inside-layout - (mf/with-memo [selected-shapes objects] - (some #(ctsl/any-layout-immediate-child? objects %) selected-shapes)) + (mf/with-memo [token-type selected-shapes objects] + (when (= :spacing token-type) + (some #(ctsl/any-layout-immediate-child? objects %) selected-shapes)))] - token-name (:token-name mdata) - token (mf/deref (refs/workspace-token-in-selected-set token-name)) - selected-token-set-name (mf/deref refs/selected-token-set-name)] [:ul {:class (stl/css :context-list)} [:& menu-tree {:submenu-offset width :token token diff --git a/frontend/test/frontend_tests/tokens/logic/token_actions_test.cljs b/frontend/test/frontend_tests/tokens/logic/token_actions_test.cljs index ffa4d17354..19a89fb774 100644 --- a/frontend/test/frontend_tests/tokens/logic/token_actions_test.cljs +++ b/frontend/test/frontend_tests/tokens/logic/token_actions_test.cljs @@ -681,6 +681,51 @@ (t/is (= (:r1 (:applied-tokens rect-without-token')) (:name target-token))) (t/is (= (:r1 (:applied-tokens rect-with-other-token-2')) (:name target-token))))))))))) +(t/deftest test-toggle-spacing-token + (t/testing "applies spacing token only to layouts and layout children" + (t/async + done + (let [spacing-token {:name "spacing.md" + :value "16" + :type :spacing} + file (-> (setup-file-with-tokens) + (ctho/add-frame-with-child :frame-layout :rect-in-layout + {:frame-params {:layout :grid}}) + (ctho/add-rect :rect-regular) + (update-in [:data :tokens-lib] + #(ctob/add-token-in-set % "Set A" (ctob/make-token spacing-token)))) + store (ths/setup-store file) + frame-layout (cths/get-shape file :frame-layout) + rect-in-layout (cths/get-shape file :rect-in-layout) + rect-regular (cths/get-shape file :rect-regular) + events [(dwta/toggle-token {:token (toht/get-token file "spacing.md") + :shapes [frame-layout rect-in-layout rect-regular]})]] + (tohs/run-store-async + store done events + (fn [new-state] + (let [file' (ths/get-file-from-state new-state) + frame-layout' (cths/get-shape file' :frame-layout) + rect-in-layout' (cths/get-shape file' :rect-in-layout) + rect-regular' (cths/get-shape file' :rect-regular)] + + (t/testing "frame with layout gets all spacing attributes" + (t/is (= "spacing.md" (:column-gap (:applied-tokens frame-layout')))) + (t/is (= "spacing.md" (:row-gap (:applied-tokens frame-layout')))) + (t/is (= 16 (get-in frame-layout' [:layout-gap :column-gap]))) + (t/is (= 16 (get-in frame-layout' [:layout-gap :row-gap])))) + + (t/testing "shape inside layout frame gets only margin attributes" + (t/is (= "spacing.md" (:m1 (:applied-tokens rect-in-layout')))) + (t/is (= "spacing.md" (:m2 (:applied-tokens rect-in-layout')))) + (t/is (= "spacing.md" (:m3 (:applied-tokens rect-in-layout')))) + (t/is (= "spacing.md" (:m4 (:applied-tokens rect-in-layout')))) + (t/is (nil? (:column-gap (:applied-tokens rect-in-layout')))) + (t/is (nil? (:row-gap (:applied-tokens rect-in-layout')))) + (t/is (= {:m1 16, :m2 16, :m3 16, :m4 16} (get rect-in-layout' :layout-item-margin)))) + + (t/testing "regular shape doesn't get spacing attributes" + (t/is (nil? (:applied-tokens rect-regular'))))))))))) + (t/deftest test-detach-styles-color (t/testing "applying a color token to a shape with color styles should detach the styles" (t/async