diff --git a/CHANGES.md b/CHANGES.md index b9bdeb4779..ba5edaf58b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -40,6 +40,7 @@ - Fix app freeze when introducing an error on a very long token name [Taiga #13214](https://tree.taiga.io/project/penpot/issue/13214) - Fix import a file with shadow tokens [Taiga #13229](https://tree.taiga.io/project/penpot/issue/13229) - Fix allow spaces on token description [Taiga #13184](https://tree.taiga.io/project/penpot/issue/13184) +- Fix error when creating a token with an invalid name [Taiga #13219](https://tree.taiga.io/project/penpot/issue/13219) ## 2.12.1 diff --git a/common/src/app/common/types/token.cljc b/common/src/app/common/types/token.cljc index 6a9d830a3a..c8441dc352 100644 --- a/common/src/app/common/types/token.cljc +++ b/common/src/app/common/types/token.cljc @@ -97,9 +97,12 @@ (def token-types (into #{} (keys token-type->dtcg-token-type))) +(def token-name-validation-regex + #"^[a-zA-Z0-9_-][a-zA-Z0-9$_-]*(\.[a-zA-Z0-9$_-]+)*$") + (def token-name-ref [:re {:title "TokenNameRef" :gen/gen sg/text} - #"^[a-zA-Z0-9_-][a-zA-Z0-9$_-]*(\.[a-zA-Z0-9$_-]+)*$"]) + token-name-validation-regex]) (def ^:private schema:color [:map diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs index 9f9d395013..a1fecb0327 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs @@ -11,6 +11,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.types.color :as cl] + [app.common.types.token :as cto] [app.common.types.tokens-lib :as ctob] [app.main.data.style-dictionary :as sd] [app.main.data.tinycolor :as tinycolor] @@ -51,12 +52,15 @@ ;; Both variants provide identical color-picker and text-input behavior, but ;; differ in how they persist the value within the form’s nested structure. - (defn- resolve-value [tokens prev-token token-name value] - (let [token + (let [valid-token-name? + (and (string? token-name) + (re-matches cto/token-name-validation-regex token-name)) + + token {:value value - :name (if (str/blank? token-name) + :name (if (or (not valid-token-name?) (str/blank? token-name)) "__PENPOT__TOKEN__NAME__PLACEHOLDER__" token-name)} diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs index 80f2d91133..df76d47113 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs @@ -50,9 +50,13 @@ (defn- resolve-value [tokens prev-token token-name value] - (let [token + (let [valid-token-name? + (and (string? token-name) + (re-matches cto/token-name-validation-regex token-name)) + + token {:value (cto/split-font-family value) - :name (if (str/blank? token-name) + :name (if (or (not valid-token-name?) (str/blank? token-name)) "__PENPOT__TOKEN__NAME__PLACEHOLDER__" token-name)} diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs index 0f1b2a79b1..a5c4ddd0dc 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs @@ -8,6 +8,7 @@ (:require [app.common.data :as d] [app.common.files.tokens :as cft] + [app.common.types.token :as cto] [app.common.types.tokens-lib :as ctob] [app.main.data.style-dictionary :as sd] [app.main.data.workspace.tokens.format :as dwtf] @@ -140,9 +141,13 @@ (defn- resolve-value [tokens prev-token token-name value] - (let [token + (let [valid-token-name? + (and (string? token-name) + (re-matches cto/token-name-validation-regex token-name)) + + token {:value value - :name (if (str/blank? token-name) + :name (if (or (not valid-token-name?) (str/blank? token-name)) "__PENPOT__TOKEN__NAME__PLACEHOLDER__" token-name)} tokens