From 019d5e083a703fbecc9e8bee82befdad2dcfdfc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?andr=C3=A9s=20gonz=C3=A1lez?= Date: Mon, 4 Aug 2025 19:53:50 +0200 Subject: [PATCH 01/10] :lipstick: Change copys at the 2.9 release slides (#7063) --- frontend/src/app/main/ui/releases/v2_9.cljs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/releases/v2_9.cljs b/frontend/src/app/main/ui/releases/v2_9.cljs index 1341105941..47f4183117 100644 --- a/frontend/src/app/main/ui/releases/v2_9.cljs +++ b/frontend/src/app/main/ui/releases/v2_9.cljs @@ -40,7 +40,7 @@ "We're keeping the momentum going with another exciting round of improvements and features!"] [:p {:class (stl/css :feature-content)} - "This release brings major progress in Design Token management (including our very first typography tokens!), smarter text overrides for components, and a rich collection of quality-of-life enhancements."] + "This release brings major progress in Design Token management (including our very first typography token!), smarter text overrides for components, and a rich collection of quality-of-life enhancements."] [:p {:class (stl/css :feature-content)} "Let’s dive in!"]] @@ -65,7 +65,7 @@ [:div {:class (stl/css :feature)} [:p {:class (stl/css :feature-content)} - "You can now define and manage font size tokens right from the Design Tokens panel. This is just the first of many typography token types to come. Font weight token is next!"] + "You can now define and manage font size tokens right from the Design Tokens panel. This is just the first of many typography token types to come. Font family token is next!"] [:p {:class (stl/css :feature-content)} "And there’s more progress on Tokens, including support for importing multiple token files via .zip, and smarter token visibility, only showing the relevant tokens for each layer type."]] @@ -95,10 +95,10 @@ [:div {:class (stl/css :feature)} [:p {:class (stl/css :feature-content)} - "When overriding text inside components, you can now tweak and preserve individual properties like color, effects, font size or font weight."] + "You can now edit the text content independently from its properties—such as color, effects, font size, or weight—allowing you to update the wording while preserving the styling."] [:p {:class (stl/css :feature-content)} - "Now you can confidently apply different tokens to copies of a component, knowing that their intended overrides will remain. This greatly improves consistency, predictability, and control when working with texts in components."]] + "This change (inspired by community feedback) greatly improves consistency, predictability, and control when working with texts in components."]] [:div {:class (stl/css :navigation)} [:& c/navigation-bullets From 47882c54194190206df81a7110389aae4f1bd3ec Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 4 Aug 2025 19:53:18 +0200 Subject: [PATCH 02/10] :sparkles: Add missing parameter on climit instance creation --- backend/src/app/rpc/climit.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app/rpc/climit.clj b/backend/src/app/rpc/climit.clj index bb3db5ba58..34080e8e25 100644 --- a/backend/src/app/rpc/climit.clj +++ b/backend/src/app/rpc/climit.clj @@ -100,7 +100,7 @@ (pbh/create :permits (or (:permits config) (:concurrency config)) :queue (or (:queue config) (:queue-size config)) :timeout (:timeout config) - :type :semaphore)) + :executor :virtual)) (defn- create-cache [{:keys [::wrk/executor]}] From 46969585ed2384a53f4fcad17156bf1a756a9529 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 4 Aug 2025 22:13:08 +0200 Subject: [PATCH 03/10] :sparkles: Disable native buffers usage on xnio A temporal change for investigate native memory leak --- backend/src/app/http.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 4cb0aea3e0..328c2e5612 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -69,6 +69,7 @@ :http/host host :http/max-body-size (::max-body-size cfg) :http/max-multipart-body-size (::max-multipart-body-size cfg) + :xnio/direct-buffers false :xnio/io-threads (or (::io-threads cfg) (max 3 (px/get-available-processors))) :xnio/dispatch :virtual From c320cbc47b1f5c9a546afee7bafb91962405f842 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 5 Aug 2025 19:17:35 +0200 Subject: [PATCH 04/10] :bug: Revert to semaphore based climit impl --- backend/src/app/rpc/climit.clj | 14 +++++++------- common/deps.edn | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/src/app/rpc/climit.clj b/backend/src/app/rpc/climit.clj index 34080e8e25..3e673a15ec 100644 --- a/backend/src/app/rpc/climit.clj +++ b/backend/src/app/rpc/climit.clj @@ -100,7 +100,7 @@ (pbh/create :permits (or (:permits config) (:concurrency config)) :queue (or (:queue config) (:queue-size config)) :timeout (:timeout config) - :executor :virtual)) + :type :semaphore)) (defn- create-cache [{:keys [::wrk/executor]}] @@ -178,12 +178,12 @@ (measure metrics mlabels stats nil) (log "enqueued" req-id stats limit-id limit-label limit-params nil)) - (px/invoke! limiter (fn [] - (let [elapsed (tpoint) - stats (pbh/get-stats limiter)] - (measure metrics mlabels stats elapsed) - (log "acquired" req-id stats limit-id limit-label limit-params elapsed) - (handler)))) + (pbh/invoke! limiter (fn [] + (let [elapsed (tpoint) + stats (pbh/get-stats limiter)] + (measure metrics mlabels stats elapsed) + (log "acquired" req-id stats limit-id limit-label limit-params elapsed) + (handler)))) (catch ExceptionInfo cause (let [{:keys [type code]} (ex-data cause)] diff --git a/common/deps.edn b/common/deps.edn index f6e54ae876..1bdddf690c 100644 --- a/common/deps.edn +++ b/common/deps.edn @@ -30,7 +30,7 @@ funcool/tubax {:mvn/version "2021.05.20-0"} funcool/cuerdas {:mvn/version "2025.06.16-414"} funcool/promesa - {:git/sha "f52f58cfacf62f59eab717e2637f37729d0cc383" + {:git/sha "46048fc0d4bf5466a2a4121f5d52aefa6337f2e8" :git/url "https://github.com/funcool/promesa"} funcool/datoteka From 515cbf7befb3d5af188ba86549fe4da57f3b1cee Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 5 Aug 2025 19:30:01 +0200 Subject: [PATCH 05/10] :bug: Revert orientation detection on media --- backend/src/app/media.clj | 37 +++++++------------------------------ 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/backend/src/app/media.clj b/backend/src/app/media.clj index 51649db3d5..710275a542 100644 --- a/backend/src/app/media.clj +++ b/backend/src/app/media.clj @@ -10,7 +10,6 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.exceptions :as ex] - [app.common.logging :as l] [app.common.media :as cm] [app.common.schema :as sm] [app.common.schema.openapi :as-alias oapi] @@ -22,7 +21,6 @@ [buddy.core.bytes :as bb] [buddy.core.codecs :as bc] [clojure.java.shell :as sh] - [clojure.string] [clojure.xml :as xml] [cuerdas.core :as str] [datoteka.fs :as fs] @@ -217,23 +215,6 @@ {:width (int width) :height (int height)})))])) -(defn- get-dimensions-with-orientation [^String path] - ;; Image magick doesn't give info about exif rotation so we use the identify command - ;; If we are processing an animated gif we use the first frame with -scene 0 - (let [dim-result (sh/sh "identify" "-format" "%w %h\n" path) - orient-result (sh/sh "identify" "-format" "%[EXIF:Orientation]\n" path)] - (if (and (= 0 (:exit dim-result)) - (= 0 (:exit orient-result))) - (let [[w h] (-> (:out dim-result) - str/trim - (clojure.string/split #"\s+") - (->> (mapv #(Integer/parseInt %)))) - orientation (-> orient-result :out str/trim)] - (case orientation - ("6" "8") {:width h :height w} ; Rotated 90 or 270 degrees - {:width w :height h})) ; Normal or unknown orientation - nil))) - (defmethod process :info [{:keys [input] :as params}] (let [{:keys [path mtype] :as input} (check-input input)] @@ -253,17 +234,13 @@ :code :media-type-mismatch :hint (str "Seems like you are uploading a file whose content does not match the extension." "Expected: " mtype ". Got: " mtype'))) - (let [{:keys [width height]} - (or (get-dimensions-with-orientation (str path)) - (do - (l/warn "Failed to read image dimensions with orientation; falling back to im4java" - {:path path}) - {:width (.getPageWidth instance) - :height (.getPageHeight instance)}))] - (assoc input - :width width - :height height - :ts (dt/now))))))) + ;; For an animated GIF, getImageWidth/Height returns the delta size of one frame (if no frame given + ;; it returns size of the last one), whereas getPageWidth/Height always return the full size of + ;; any frame. + (assoc input + :width (.getPageWidth instance) + :height (.getPageHeight instance) + :ts (dt/now)))))) (defmethod process-error org.im4java.core.InfoException [error] From ccc3ca09484e25f5b468ec191efd5552997e9055 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 5 Aug 2025 20:34:47 +0200 Subject: [PATCH 06/10] :sparkles: Disable virtual threads on http server --- backend/src/app/http.clj | 5 +++-- backend/src/app/main.clj | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 328c2e5612..5a52146ff0 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -25,6 +25,7 @@ [app.rpc :as-alias rpc] [app.rpc.doc :as-alias rpc.doc] [app.setup :as-alias setup] + [app.worker :as wrk] [integrant.core :as ig] [promesa.exec :as px] [reitit.core :as r] @@ -63,7 +64,7 @@ (assert (sm/check schema:server-params params))) (defmethod ig/init-key ::server - [_ {:keys [::handler ::router ::host ::port] :as cfg}] + [_ {:keys [::handler ::router ::host ::port ::wrk/executor] :as cfg}] (l/info :hint "starting http server" :port port :host host) (let [options {:http/port port :http/host host @@ -72,7 +73,7 @@ :xnio/direct-buffers false :xnio/io-threads (or (::io-threads cfg) (max 3 (px/get-available-processors))) - :xnio/dispatch :virtual + :xnio/dispatch executor :ring/compat :ring2 :socket/backlog 4069} diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index c51d85f6ad..544b530b4d 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -231,7 +231,8 @@ ::http/router (ig/ref ::http/router) ::http/io-threads (cf/get :http-server-io-threads) ::http/max-body-size (cf/get :http-server-max-body-size) - ::http/max-multipart-body-size (cf/get :http-server-max-multipart-body-size)} + ::http/max-multipart-body-size (cf/get :http-server-max-multipart-body-size) + ::wrk/executor (ig/ref ::wrk/executor)} ::ldap/provider {:host (cf/get :ldap-host) From e28d2842f6f4f52f5dd6f691a21bea313b53d78e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 5 Aug 2025 22:03:09 +0200 Subject: [PATCH 07/10] :bug: Revert the revert of orientation detection on media This reverts commit 515cbf7befb3d5af188ba86549fe4da57f3b1cee. --- backend/src/app/media.clj | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/backend/src/app/media.clj b/backend/src/app/media.clj index 710275a542..51649db3d5 100644 --- a/backend/src/app/media.clj +++ b/backend/src/app/media.clj @@ -10,6 +10,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.media :as cm] [app.common.schema :as sm] [app.common.schema.openapi :as-alias oapi] @@ -21,6 +22,7 @@ [buddy.core.bytes :as bb] [buddy.core.codecs :as bc] [clojure.java.shell :as sh] + [clojure.string] [clojure.xml :as xml] [cuerdas.core :as str] [datoteka.fs :as fs] @@ -215,6 +217,23 @@ {:width (int width) :height (int height)})))])) +(defn- get-dimensions-with-orientation [^String path] + ;; Image magick doesn't give info about exif rotation so we use the identify command + ;; If we are processing an animated gif we use the first frame with -scene 0 + (let [dim-result (sh/sh "identify" "-format" "%w %h\n" path) + orient-result (sh/sh "identify" "-format" "%[EXIF:Orientation]\n" path)] + (if (and (= 0 (:exit dim-result)) + (= 0 (:exit orient-result))) + (let [[w h] (-> (:out dim-result) + str/trim + (clojure.string/split #"\s+") + (->> (mapv #(Integer/parseInt %)))) + orientation (-> orient-result :out str/trim)] + (case orientation + ("6" "8") {:width h :height w} ; Rotated 90 or 270 degrees + {:width w :height h})) ; Normal or unknown orientation + nil))) + (defmethod process :info [{:keys [input] :as params}] (let [{:keys [path mtype] :as input} (check-input input)] @@ -234,13 +253,17 @@ :code :media-type-mismatch :hint (str "Seems like you are uploading a file whose content does not match the extension." "Expected: " mtype ". Got: " mtype'))) - ;; For an animated GIF, getImageWidth/Height returns the delta size of one frame (if no frame given - ;; it returns size of the last one), whereas getPageWidth/Height always return the full size of - ;; any frame. - (assoc input - :width (.getPageWidth instance) - :height (.getPageHeight instance) - :ts (dt/now)))))) + (let [{:keys [width height]} + (or (get-dimensions-with-orientation (str path)) + (do + (l/warn "Failed to read image dimensions with orientation; falling back to im4java" + {:path path}) + {:width (.getPageWidth instance) + :height (.getPageHeight instance)}))] + (assoc input + :width width + :height height + :ts (dt/now))))))) (defmethod process-error org.im4java.core.InfoException [error] From f7cfbdd2292a746c614a497d13f8a9a42a3b0411 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 5 Aug 2025 22:05:52 +0200 Subject: [PATCH 08/10] :bug: Comment the problematic migration --- common/src/app/common/files/migrations.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index a603e9b922..ffa3a1fe1d 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -1618,4 +1618,4 @@ "0007-clear-invalid-strokes-and-fills-v2" "0008-fix-library-colors-v4" "0009-clean-library-colors" - "0009-add-partial-text-touched-flags"])) + #_"0009-add-partial-text-touched-flags"])) From a76a9fae41f6aa69acfc5f4640b54b3c1560518f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Wed, 6 Aug 2025 13:28:02 +0200 Subject: [PATCH 09/10] :bug: Fix an unused translation (#7074) --- frontend/translations/en.po | 5 ----- 1 file changed, 5 deletions(-) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 745621ca7c..c3328ae363 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -4387,11 +4387,6 @@ msgstr "Subscription" msgid "subscription.settings.add-payment-to-continue" msgstr "Add a payment method to continue after your trial" -#: src/app/main/ui/settings/subscription.cljs:82, src/app/main/ui/settings/subscription.cljs:115, src/app/main/ui/settings/subscription.cljs:127 -#, fuzzy, unused -msgid "subscription.settings.benefits.all-professiona-benefits" -msgstr "" - #: src/app/main/ui/settings/subscription.cljs:247, src/app/main/ui/settings/subscription.cljs:268, src/app/main/ui/settings/subscription.cljs:303, src/app/main/ui/settings/subscription.cljs:317 msgid "subscription.settings.benefits.all-professional-benefits" msgstr "All Professional plan benefits and:" From 778a608854012be85c0a6938a8b4032dd4b3b2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Thu, 7 Aug 2025 07:43:49 +0200 Subject: [PATCH 10/10] :bug: Fix tooltip for icon plans from team dropdown (#7075) --- frontend/src/app/main/ui/dashboard/subscription.cljs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/dashboard/subscription.cljs b/frontend/src/app/main/ui/dashboard/subscription.cljs index d320a687e4..2a560f84bc 100644 --- a/frontend/src/app/main/ui/dashboard/subscription.cljs +++ b/frontend/src/app/main/ui/dashboard/subscription.cljs @@ -125,7 +125,11 @@ (mf/defc menu-team-icon* [{:keys [subscription-type]}] - [:span {:class (stl/css :subscription-icon) :data-testid "subscription-icon"} + [:span {:class (stl/css :subscription-icon) + :title (if (= subscription-type "unlimited") + (tr "subscription.dashboard.power-up.unlimited-plan") + (tr "subscription.dashboard.power-up.enterprise-plan")) + :data-testid "subscription-icon"} (case subscription-type "unlimited" i/character-u "enterprise" i/character-e)])