Merge remote-tracking branch 'origin/staging' into develop

This commit is contained in:
Andrey Antukh 2025-07-24 09:00:29 +02:00
commit 33cf75e933
8 changed files with 68 additions and 23 deletions

View file

@ -61,12 +61,16 @@
- Fix remove color button in the gradient editor [Taiga #11623](https://tree.taiga.io/project/penpot/issue/11623) - Fix remove color button in the gradient editor [Taiga #11623](https://tree.taiga.io/project/penpot/issue/11623)
- Fix "Copy as SVG" generates different code from the Inspect panel [Taiga #11519](https://tree.taiga.io/project/penpot/issue/11519) - Fix "Copy as SVG" generates different code from the Inspect panel [Taiga #11519](https://tree.taiga.io/project/penpot/issue/11519)
- Fix overriden tokens in text copies are not preserved [Taiga #11486](https://tree.taiga.io/project/penpot/issue/11486) - Fix overriden tokens in text copies are not preserved [Taiga #11486](https://tree.taiga.io/project/penpot/issue/11486)
- Fix problem when changing between flex/grid layout [Taiga #11625](https://tree.taiga.io/project/penpot/issue/11625)
- Fix opacity on stroke gradients [Taiga #11646](https://tree.taiga.io/project/penpot/issue/11646)
- Fix change from gradient to solid color [Taiga #11648](https://tree.taiga.io/project/penpot/issue/11648)
## 2.8.1 (Unreleased) ## 2.8.1 (Unreleased)
### :bug: Bugs fixed ### :bug: Bugs fixed
- Fix unexpected exception on processing old texts [Github #6889](https://github.com/penpot/penpot/pull/6889) - Fix unexpected exception on processing old texts [Github #6889](https://github.com/penpot/penpot/pull/6889)
- Fix UI theme selection from main menu [Taiga #11567](https://tree.taiga.io/project/penpot/issue/11567)
## 2.8.0 ## 2.8.0

View file

@ -167,6 +167,11 @@
(get-tokens [_] "return an ordered sequence of all tokens in the set") (get-tokens [_] "return an ordered sequence of all tokens in the set")
(get-tokens-map [_] "return a map of tokens in the set, indexed by token-name")) (get-tokens-map [_] "return a map of tokens in the set, indexed by token-name"))
;; TODO: this structure is temporary. It's needed to be able to migrate TokensLib
;; from 1.2 to 1.3 when TokenSet datatype was changed to a deftype. This should
;; be removed after migrations are consolidated.
(defrecord TokenSetLegacy [id name description modified-at tokens])
(deftype TokenSet [id name description modified-at tokens] (deftype TokenSet [id name description modified-at tokens]
#?@(:clj [clojure.lang.IDeref #?@(:clj [clojure.lang.IDeref
(deref [_] {:id id (deref [_] {:id id
@ -255,6 +260,10 @@
[o] [o]
(instance? TokenSet o)) (instance? TokenSet o))
(defn token-set-legacy?
[o]
(instance? TokenSetLegacy o))
(def schema:token-set-attrs (def schema:token-set-attrs
[:map {:title "TokenSet"} [:map {:title "TokenSet"}
[:id ::sm/uuid] [:id ::sm/uuid]
@ -1738,10 +1747,11 @@ Will return a value that matches this schema:
migrate-sets-node migrate-sets-node
(fn recurse [node] (fn recurse [node]
(if (token-set? node) (if (token-set-legacy? node)
(assoc node (make-token-set
:id (uuid/next) (assoc node
:tokens (d/update-vals (:tokens node) migrate-token)) :id (uuid/next)
:tokens (d/update-vals (:tokens node) migrate-token)))
(d/update-vals node recurse))) (d/update-vals node recurse)))
sets sets
@ -1769,6 +1779,26 @@ Will return a value that matches this schema:
(->TokensLib sets themes active-themes)))) (->TokensLib sets themes active-themes))))
#?(:clj
(defn- read-tokens-lib-v1-3
"Reads the tokens lib data structure and removes the TokenSetLegacy data type,
needed for a temporary migration step."
[r]
(let [sets (fres/read-object! r)
themes (fres/read-object! r)
active-themes (fres/read-object! r)
migrate-sets-node
(fn recurse [node]
(if (token-set-legacy? node)
(make-token-set node)
(d/update-vals node recurse)))
sets
(d/update-vals sets migrate-sets-node)]
(->TokensLib sets themes active-themes))))
#?(:clj #?(:clj
(defn- write-tokens-lib (defn- write-tokens-lib
[n w ^TokensLib o] [n w ^TokensLib o]
@ -1797,6 +1827,11 @@ Will return a value that matches this schema:
(make-token obj)))} (make-token obj)))}
{:name "penpot/token-set/v1" {:name "penpot/token-set/v1"
:rfn (fn [r]
(let [obj (fres/read-object! r)]
(map->TokenSetLegacy obj)))}
{:name "penpot/token-set/v2"
:class TokenSet :class TokenSet
:wfn (fn [n w o] :wfn (fn [n w o]
(fres/write-tag! w n 1) (fres/write-tag! w n 1)
@ -1824,8 +1859,11 @@ Will return a value that matches this schema:
{:name "penpot/tokens-lib/v1.2" {:name "penpot/tokens-lib/v1.2"
:rfn read-tokens-lib-v1-2} :rfn read-tokens-lib-v1-2}
;; CURRENT TOKENS LIB READER & WRITTER
{:name "penpot/tokens-lib/v1.3" {:name "penpot/tokens-lib/v1.3"
:rfn read-tokens-lib-v1-3}
;; CURRENT TOKENS LIB READER & WRITTER
{:name "penpot/tokens-lib/v1.4"
:class TokensLib :class TokensLib
:wfn write-tokens-lib :wfn write-tokens-lib
:rfn read-tokens-lib})) :rfn read-tokens-lib}))

View file

@ -20,7 +20,6 @@
[app.plugins.register :as plugins.register] [app.plugins.register :as plugins.register]
[app.util.i18n :as i18n :refer [tr]] [app.util.i18n :as i18n :refer [tr]]
[app.util.storage :as storage] [app.util.storage :as storage]
[app.util.theme :as theme]
[beicon.v2.core :as rx] [beicon.v2.core :as rx]
[potok.v2.core :as ptk])) [potok.v2.core :as ptk]))
@ -159,9 +158,6 @@
(update-in state [:profile :theme] (update-in state [:profile :theme]
(fn [current] (fn [current]
(let [current (cond (let [current (cond
(= current "system")
(theme/get-system-theme)
;; NOTE: this is a workaround for ;; NOTE: this is a workaround for
;; the old data on the database ;; the old data on the database
;; where whe have `default` value ;; where whe have `default` value
@ -172,7 +168,8 @@
current)] current)]
(case current (case current
"dark" "light" "dark" "light"
"light" "dark" "light" "system"
"system" "dark"
; Failsafe for missing data ; Failsafe for missing data
"dark"))))) "dark")))))

View file

@ -1093,7 +1093,11 @@
(fn [state] (fn [state]
(-> state (-> state
(assoc :type :color) (assoc :type :color)
(dissoc :editing-stop :stops :gradient))))))) (dissoc :editing-stop :stops :gradient)))))
ptk/WatchEvent
(watch [_ _ _]
(rx/of (update-colorpicker-color {} false)))))
(defn activate-colorpicker-gradient (defn activate-colorpicker-gradient
[type] [type]

View file

@ -179,7 +179,9 @@
:type "button" :type "button"
:value (if subscribe-to-trial (tr "subscription.settings.start-trial") (tr "labels.continue")) :value (if subscribe-to-trial (tr "subscription.settings.start-trial") (tr "labels.continue"))
:on-click (if subscribe-to-trial subscribe-to-enterprise handle-accept-dialog)}]]])]]])) :on-click (if (or subscribe-to-trial
(contains? #{"unpaid" "canceled"} (:status current-subscription)))
subscribe-to-enterprise handle-accept-dialog)}]]])]]]))
(mf/defc subscription-success-dialog (mf/defc subscription-success-dialog
{::mf/register modal/components {::mf/register modal/components
@ -413,7 +415,7 @@
(tr "subscription.settings.unlimited.bill"), (tr "subscription.settings.unlimited.bill"),
(tr "subscription.settings.unlimited.storage-autosave")] (tr "subscription.settings.unlimited.storage-autosave")]
:cta-text (if subscription (tr "subscription.settings.subscribe") (tr "subscription.settings.try-it-free")) :cta-text (if subscription (tr "subscription.settings.subscribe") (tr "subscription.settings.try-it-free"))
:cta-link #(open-subscription-modal "unlimited" subscription-type) :cta-link #(open-subscription-modal "unlimited" subscription)
:cta-text-with-icon (tr "subscription.settings.more-information") :cta-text-with-icon (tr "subscription.settings.more-information")
:cta-link-with-icon go-to-pricing-page}]) :cta-link-with-icon go-to-pricing-page}])
@ -427,6 +429,6 @@
(tr "subscription.settings.enterprise.capped-bill"), (tr "subscription.settings.enterprise.capped-bill"),
(tr "subscription.settings.enterprise.unlimited-storage")] (tr "subscription.settings.enterprise.unlimited-storage")]
:cta-text (if subscription (tr "subscription.settings.subscribe") (tr "subscription.settings.try-it-free")) :cta-text (if subscription (tr "subscription.settings.subscribe") (tr "subscription.settings.try-it-free"))
:cta-link #(open-subscription-modal "enterprise") :cta-link #(open-subscription-modal "enterprise" subscription)
:cta-text-with-icon (tr "subscription.settings.more-information") :cta-text-with-icon (tr "subscription.settings.more-information")
:cta-link-with-icon go-to-pricing-page}])]]])) :cta-link-with-icon go-to-pricing-page}])]]]))

View file

@ -103,15 +103,15 @@
(obj/set! attrs "strokeWidth" width) (obj/set! attrs "strokeWidth" width)
(when (some? gradient) (if (some? gradient)
(let [gradient-id (dm/str "stroke-color-gradient-" render-id "-" index)] (let [gradient-id (dm/str "stroke-color-gradient-" render-id "-" index)]
(obj/set! attrs "stroke" (str/ffmt "url(#%)" gradient-id)))) (obj/set! attrs "stroke" (str/ffmt "url(#%)" gradient-id)))
(when-not (some? gradient)
(when (some? color) (when (some? color)
(obj/set! attrs "stroke" color)) (obj/set! attrs "stroke" color)))
(when (some? opacity)
(obj/set! attrs "strokeOpacity" opacity))) (when (some? opacity)
(obj/set! attrs "strokeOpacity" opacity))
(when (not= style :svg) (when (not= style :svg)
(obj/set! attrs "strokeDasharray" (calculate-dasharray style width))) (obj/set! attrs "strokeDasharray" (calculate-dasharray style width)))

View file

@ -280,8 +280,8 @@
:data-testid "toggle-theme" :data-testid "toggle-theme"
:id "file-menu-toggle-theme"} :id "file-menu-toggle-theme"}
[:span {:class (stl/css :item-name)} [:span {:class (stl/css :item-name)}
(case (:theme profile) ;; default = dark -> light -> system -> dark and so on (case (:theme profile) ;; dark -> light -> system -> dark and so on
"default" (tr "workspace.header.menu.toggle-light-theme") "dark" (tr "workspace.header.menu.toggle-light-theme")
"light" (tr "workspace.header.menu.toggle-system-theme") "light" (tr "workspace.header.menu.toggle-system-theme")
"system" (tr "workspace.header.menu.toggle-dark-theme") "system" (tr "workspace.header.menu.toggle-dark-theme")
(tr "workspace.header.menu.toggle-light-theme"))] (tr "workspace.header.menu.toggle-light-theme"))]

View file

@ -310,7 +310,7 @@
:id "align-self-end"}]]) :id "align-self-end"}]])
(mf/defc layout-item-menu (mf/defc layout-item-menu
{::mf/memo #{:ids :values :type :is-layout-child? :is-grid-parent :is-flex-parent?} {::mf/memo #{:ids :values :type :is-layout-child? :is-grid-parent :is-flex-parent? :is-grid-layout? :is-flex-layout?}
::mf/props :obj} ::mf/props :obj}
[{:keys [ids values [{:keys [ids values
^boolean is-layout-child? ^boolean is-layout-child?