From 15d369493b0371430eeb360be0ed140edddd8bbe Mon Sep 17 00:00:00 2001 From: Alonso Torres Date: Fri, 23 Jan 2026 12:48:01 +0100 Subject: [PATCH 1/7] :bug: Fix problem with z-index modal in dashboard (#8178) --- frontend/src/app/main/ui/dashboard/team.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/dashboard/team.scss b/frontend/src/app/main/ui/dashboard/team.scss index 90e33f5cca..259fdeb565 100644 --- a/frontend/src/app/main/ui/dashboard/team.scss +++ b/frontend/src/app/main/ui/dashboard/team.scss @@ -628,6 +628,7 @@ width: $sz-400; padding: var(--sp-xxxl); background-color: var(--color-background-primary); + z-index: var(--z-index-set); &.hero { top: px2rem(216); From 5d7e6afd762bd8847eb201dd80446f52f99cf8d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 5 Jan 2026 09:13:14 +0100 Subject: [PATCH 2/7] :wrench: Fix a typo in an interpolation --- .github/workflows/build-tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-tag.yml b/.github/workflows/build-tag.yml index 80ef7bcaeb..c32e363888 100644 --- a/.github/workflows/build-tag.yml +++ b/.github/workflows/build-tag.yml @@ -33,7 +33,7 @@ jobs: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} MATTERMOST_CHANNEL: bot-alerts-cicd TEXT: | - 🐳 *[PENPOT] Docker image available: {{ github.ref_name }}* + 🐳 *[PENPOT] Docker image available: ${{ github.ref_name }}* 🔗 Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} @infra From e03ad251187d363e0a97b8bdd96b4db1a4073c8c Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 26 Jan 2026 10:10:57 +0100 Subject: [PATCH 3/7] :wrench: Backport CI workflow from develop --- .github/workflows/tests.yml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0d1e008d21..c4e715e55a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -21,7 +21,7 @@ concurrency: jobs: lint: name: "Linter" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest steps: @@ -34,7 +34,7 @@ jobs: test-common: name: "Common Tests" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest steps: @@ -53,7 +53,8 @@ jobs: test-plugins: name: Plugins Runtime Linter & Tests - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 + container: penpotapp/devenv:latest steps: - uses: actions/checkout@v4 @@ -98,7 +99,7 @@ jobs: test-frontend: name: "Frontend Tests" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest steps: @@ -119,7 +120,7 @@ jobs: test-render-wasm: name: "Render WASM Tests" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest steps: @@ -143,7 +144,7 @@ jobs: test-backend: name: "Backend Tests" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest services: @@ -182,7 +183,7 @@ jobs: test-library: name: "Library Tests" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest steps: @@ -196,7 +197,7 @@ jobs: build-integration: name: "Build Integration Bundle" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest steps: @@ -217,7 +218,7 @@ jobs: test-integration-1: name: "Integration Tests 1/4" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest needs: build-integration @@ -247,7 +248,7 @@ jobs: test-integration-2: name: "Integration Tests 2/4" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest needs: build-integration @@ -277,7 +278,7 @@ jobs: test-integration-3: name: "Integration Tests 3/4" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest needs: build-integration @@ -307,7 +308,7 @@ jobs: test-integration-4: name: "Integration Tests 4/4" - runs-on: ubuntu-24.04 + runs-on: penpot-runner-02 container: penpotapp/devenv:latest needs: build-integration From 33e650242ca2d8d7a9588f25dd9598273c12e3e8 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 20 Jan 2026 13:47:09 +0100 Subject: [PATCH 4/7] :sparkles: Add slugify to the filename on assets exportation Fixes https://github.com/penpot/penpot/issues/8017 --- CHANGES.md | 1 + exporter/src/app/handlers/resources.cljs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 10aca874cd..77f4dd262b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -32,6 +32,7 @@ - Fix unhandled exception tokens creation dialog [Github #8110](https://github.com/penpot/penpot/issues/8110) - Fix allow negative spread values on shadow token creation [Taiga #13167](https://tree.taiga.io/project/penpot/issue/13167) - Fix spanish translations on import export token modal [Taiga #13171](https://tree.taiga.io/project/penpot/issue/13171) +- Remove whitespaces from asset export filename [Github #8133](https://github.com/penpot/penpot/pull/8133) ## 2.12.1 diff --git a/exporter/src/app/handlers/resources.cljs b/exporter/src/app/handlers/resources.cljs index 8b0a55ba35..5394e673a8 100644 --- a/exporter/src/app/handlers/resources.cljs +++ b/exporter/src/app/handlers/resources.cljs @@ -36,7 +36,7 @@ {:path path :mtype (mime/get type) :name name - :filename (str/concat name (mime/get-extension type)) + :filename (str/concat (str/slug name) (mime/get-extension type)) :id task-id})) (defn create-zip From 8632b18eecbfbcf967759c403c7988d6a74b90c2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 20 Jan 2026 15:22:01 +0100 Subject: [PATCH 5/7] :bug: Avoid json decoder liner limit exception by chunking Happens only when we send large binary data serialized with transit (mainly used for upload fonts data). --- CHANGES.md | 1 + backend/src/app/rpc/commands/fonts.clj | 35 +++++++++++++++++++++++--- frontend/src/app/main/data/fonts.cljs | 20 ++++++++++++--- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 77f4dd262b..6754a5045a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -33,6 +33,7 @@ - Fix allow negative spread values on shadow token creation [Taiga #13167](https://tree.taiga.io/project/penpot/issue/13167) - Fix spanish translations on import export token modal [Taiga #13171](https://tree.taiga.io/project/penpot/issue/13171) - Remove whitespaces from asset export filename [Github #8133](https://github.com/penpot/penpot/pull/8133) +- Fix exception on uploading large fonts [Github #8135](https://github.com/penpot/penpot/pull/8135) ## 2.12.1 diff --git a/backend/src/app/rpc/commands/fonts.clj b/backend/src/app/rpc/commands/fonts.clj index 05454d6698..8ca20eac49 100644 --- a/backend/src/app/rpc/commands/fonts.clj +++ b/backend/src/app/rpc/commands/fonts.clj @@ -27,7 +27,17 @@ [app.rpc.helpers :as rph] [app.rpc.quotes :as quotes] [app.storage :as sto] - [app.util.services :as sv])) + [app.storage.tmp :as tmp] + [app.util.services :as sv] + [datoteka.io :as io]) + (:import + java.io.InputStream + java.io.OutputStream + java.io.SequenceInputStream + java.util.Collections)) + +(set! *warn-on-reflection* true) + (def valid-weight #{100 200 300 400 500 600 700 800 900 950}) (def valid-style #{"normal" "italic"}) @@ -105,7 +115,7 @@ (defn create-font-variant [{:keys [::sto/storage ::db/conn]} {:keys [data] :as params}] - (letfn [(generate-missing! [data] + (letfn [(generate-missing [data] (let [data (media/run {:cmd :generate-fonts :input data})] (when (and (not (contains? data "font/otf")) (not (contains? data "font/ttf")) @@ -116,8 +126,26 @@ :hint "invalid font upload, unable to generate missing font assets")) data)) + (process-chunks [chunks] + (let [tmp (tmp/tempfile :prefix "penpot.tempfont." :suffix "") + streams (map io/input-stream chunks) + streams (Collections/enumeration streams)] + (with-open [^OutputStream output (io/output-stream tmp) + ^InputStream input (SequenceInputStream. streams)] + (io/copy input output)) + tmp)) + + (join-chunks [data] + (reduce-kv (fn [data mtype content] + (if (vector? content) + (assoc data mtype (process-chunks content)) + data)) + data + data)) + (prepare-font [data mtype] (when-let [resource (get data mtype)] + (let [hash (sto/calculate-hash resource) content (-> (sto/content resource) (sto/wrap-with-hash hash))] @@ -156,7 +184,8 @@ :otf-file-id (:id otf) :ttf-file-id (:id ttf)}))] - (let [data (generate-missing! data) + (let [data (join-chunks data) + data (generate-missing data) assets (persist-fonts-files! data) result (insert-font-variant! assets)] (vary-meta result assoc ::audit/replace-props (update params :data (comp vec keys)))))) diff --git a/frontend/src/app/main/data/fonts.cljs b/frontend/src/app/main/data/fonts.cljs index 4706e7c5c3..4efa40718f 100644 --- a/frontend/src/app/main/data/fonts.cljs +++ b/frontend/src/app/main/data/fonts.cljs @@ -24,6 +24,20 @@ [cuerdas.core :as str] [potok.v2.core :as ptk])) +(def ^:const default-chunk-size + (* 1024 1024 4)) ;; 4MiB + +(defn- chunk-array + [data chunk-size] + (let [total-size (alength data)] + (loop [offset 0 + chunks []] + (if (< offset total-size) + (let [end (min (+ offset chunk-size) total-size) + chunk (.subarray ^js data offset end)] + (recur end (conj chunks chunk))) + chunks)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; General purpose events & IMPL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -116,9 +130,9 @@ (not= hhea-descender win-descent) (and f-selection (or (not= hhea-ascender os2-ascent) - (not= hhea-descender os2-descent))))] - - {:content {:data (js/Uint8Array. data) + (not= hhea-descender os2-descent)))) + data (js/Uint8Array. data)] + {:content {:data (chunk-array data default-chunk-size) :name name :type type} :font-family (or family "") From 23d5fc7408848b7a9974809a5810c8e8432ca0da Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 21 Jan 2026 09:25:22 +0100 Subject: [PATCH 6/7] :bug: Prevent exception on open-new-window when no window is returned Fixes https://github.com/penpot/penpot/issues/7787 --- CHANGES.md | 1 + frontend/src/app/util/dom.cljs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6754a5045a..c3b176e71e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -34,6 +34,7 @@ - Fix spanish translations on import export token modal [Taiga #13171](https://tree.taiga.io/project/penpot/issue/13171) - Remove whitespaces from asset export filename [Github #8133](https://github.com/penpot/penpot/pull/8133) - Fix exception on uploading large fonts [Github #8135](https://github.com/penpot/penpot/pull/8135) +- Fix unhandled exception on open-new-window helper [Github #7787](https://github.com/penpot/penpot/issues/7787) ## 2.12.1 diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index 2faa6cc1c0..e22de0dbba 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -802,9 +802,10 @@ ([uri name] (open-new-window uri name "noopener,noreferrer")) ([uri name features] - (let [new-window (.open js/window (str uri) name features)] + (when-let [new-window (.open js/window (str uri) name features)] (when (not= name "_blank") - (.reload (.-location new-window)))))) + (when-let [location (.-location new-window)] + (.reload location)))))) (defn browser-back [] From f07495ae955d53de07b1025a029dfaf4608cf262 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 21 Jan 2026 09:36:14 +0100 Subject: [PATCH 7/7] :bug: Fix incorrect handling of numeric values layout padding and gap Fixes https://github.com/penpot/penpot/issues/8113 --- CHANGES.md | 2 ++ .../workspace/sidebar/options/menus/layout_container.cljs | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c3b176e71e..b175d03cfb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -35,6 +35,8 @@ - Remove whitespaces from asset export filename [Github #8133](https://github.com/penpot/penpot/pull/8133) - Fix exception on uploading large fonts [Github #8135](https://github.com/penpot/penpot/pull/8135) - Fix unhandled exception on open-new-window helper [Github #7787](https://github.com/penpot/penpot/issues/7787) +- Fix incorrect handling of input values on layout gap and padding inputs [Github #8113](https://github.com/penpot/penpot/issues/8113) + ## 2.12.1 diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs index 320abd7d18..e89033964d 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs @@ -375,7 +375,7 @@ (mf/use-fn (mf/deps on-change ids) (fn [value attr event] - (if (or (string? value) (int? value)) + (if (or (string? value) (number? value)) (on-change :simple attr value event) (do (let [resolved-value (:resolved-value (first value)) @@ -489,7 +489,7 @@ (mf/use-fn (mf/deps on-change ids) (fn [value attr event] - (if (or (string? value) (int? value)) + (if (or (string? value) (number? value)) (on-change :multiple attr value event) (do (let [resolved-value (:resolved-value (first value))] @@ -724,7 +724,7 @@ (mf/use-fn (mf/deps on-change wrap-type ids) (fn [value event attr] - (if (or (string? value) (int? value)) + (if (or (string? value) (number? value)) (on-change (= "nowrap" wrap-type) attr value event) (do (let [resolved-value (:resolved-value (first value))]