From 405a73e8bad48d14ed72588418d9a4d1f2d342ed Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 May 2026 14:30:44 +0200 Subject: [PATCH 01/53] :sparkles: Add climit impl and config for file snapshot methods (#9722) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: Add dedicated concurrency limit for restore-file-snapshot This adds a dedicated climit configuration for the restore-file-snapshot RPC method with :permits 1 per profile (plus queue of 2 and 60s timeout) and a global limit of 3. Previously the method only used the generic root/by-profile and root/global limits, allowing up to 7 concurrent restore operations per profile which caused database row lock contention on FOR UPDATE and connection pool exhaustion. * :sparkles: Skip locking on restore! to avoid blocking other operations Changes the row lock acquisition in restore! from a blocking FOR UPDATE to FOR UPDATE SKIP LOCKED. If the file row is already locked by another concurrent operation (e.g., another restore or an update-file), the query returns no rows and the caller fails fast with a clear conflict error instead of blocking indefinitely holding a database connection. * :sparkles: Add queue and timeout limits to root/by-profile concurrency limit Previously root/by-profile had no queue limit (unbounded Integer/MAX_VALUE) and no timeout, allowing requests to pile up indefinitely behind a profile whose permits were exhausted by long-running operations. This could lead to memory pressure and cascading failures. Now limited to 30 queued requests with a 30-second timeout so excess requests fail fast. * :sparkles: Move backup snapshot creation outside restore transaction The backup snapshot (fsnap/create!) is now created in its own short-lived connection before the actual restore transaction begins. This ensures the backup is persisted independently of the restore outcome and reduces the restore transaction window. The restore itself runs inside a db/tx-run! block with an optimistic locking check: it reads the file with FOR UPDATE and compares its revn against the value captured at backup time. If the file was edited concurrently, the restore aborts with a conflict error to prevent data loss. Co-dependent with the SKIP LOCKED change in restore! — the FOR UPDATE acquired here is in the same transaction as restore!, so the SKIP LOCKED inside restore! correctly sees the row as unlocked (same transaction). * :recycle: Remove unused private function get-minimal-file The local get-minimal-file function in file_snapshots.clj is no longer used since restore! switched to direct exec-one! with FOR UPDATE SKIP LOCKED. The sql:get-minimal-file SQL constant is still used directly. * :sparkles: Add minor improvements on db connection management * :recycle: Refactor create-file-snapshot to use explicit transaction management Remove automatic transaction wrapping (`::db/transaction true`) and pass `cfg` through the call chain instead of destructured `conn`. Wrap `fsnap/create!` in an explicit `db/tx-run!` for clearer transaction boundaries. Signed-off-by: Andrey Antukh * :sparkles: Add dedicated concurrency limit for create-file-snapshot This adds a dedicated climit configuration for the create-file-snapshot RPC method with :permits 1 per profile (plus queue of 2 and 60s timeout) and a global limit of 3. Previously the method only used the generic root/by-profile and root/global limits, allowing up to 10 concurrent snapshot creation operations per profile which could cause database contention and connection pool exhaustion. Signed-off-by: Andrey Antukh --------- Signed-off-by: Andrey Antukh --- backend/resources/climit.edn | 16 ++- backend/src/app/db.clj | 32 ++++- backend/src/app/features/file_snapshots.clj | 135 +++++++++--------- backend/src/app/main.clj | 4 +- .../src/app/rpc/commands/files_snapshot.clj | 58 +++++--- backend/test/backend_tests/db_test.clj | 43 ++++++ 6 files changed, 190 insertions(+), 98 deletions(-) create mode 100644 backend/test/backend_tests/db_test.clj diff --git a/backend/resources/climit.edn b/backend/resources/climit.edn index 34d2184153..7d8234499b 100644 --- a/backend/resources/climit.edn +++ b/backend/resources/climit.edn @@ -19,7 +19,7 @@ {:permits 40} :root/by-profile - {:permits 10} + {:permits 10 :queue 30 :timeout 30000} :file-thumbnail-ops/global {:permits 20} @@ -27,4 +27,16 @@ {:permits 2} :submit-audit-events/by-profile - {:permits 1 :queue 3}} + {:permits 1 :queue 3} + + :restore-file-snapshot/global + {:permits 3} + + :restore-file-snapshot/by-profile + {:permits 1 :queue 2 :timeout 60000} + + :create-file-snapshot/global + {:permits 3} + + :create-file-snapshot/by-profile + {:permits 1 :queue 2 :timeout 60000}} diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj index c23ea07524..de80175040 100644 --- a/backend/src/app/db.clj +++ b/backend/src/app/db.clj @@ -27,7 +27,9 @@ [next.jdbc.transaction]) (:import com.zaxxer.hikari.HikariConfig + com.zaxxer.hikari.HikariConfigMXBean com.zaxxer.hikari.HikariDataSource + com.zaxxer.hikari.HikariPoolMXBean com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory io.whitfin.siphash.SipHasher io.whitfin.siphash.SipHasherContainer @@ -67,9 +69,8 @@ (def defaults {::name :main - ::min-size 0 ::max-size 60 - ::connection-timeout 10000 + ::connection-timeout 30000 ::validation-timeout 10000 ::idle-timeout 120000 ; 2min ::max-lifetime 1800000 ; 30m @@ -82,7 +83,7 @@ (defmethod ig/init-key ::pool [_ cfg] (let [{:keys [::uri ::read-only] :as cfg} - (merge defaults cfg)] + (merge defaults (d/without-nils cfg))] (when uri (l/info :hint "initialize connection pool" :name (d/name (::name cfg)) @@ -90,7 +91,8 @@ :read-only read-only :credentials (and (contains? cfg ::username) (contains? cfg ::password)) - :min-size (::min-size cfg) + :min-size (or (::min-size cfg) + (::max-size cfg)) :max-size (::max-size cfg)) (create-pool cfg)))) @@ -111,7 +113,9 @@ [{:keys [::uri] :as cfg}] ;; (app.common.pprint/pprint cfg) - (let [config (HikariConfig.)] + (let [config (HikariConfig.) + max-size (::max-size cfg) + min-size (or (::min-size cfg) max-size)] (doto config (.setJdbcUrl (str "jdbc:" uri)) (.setPoolName (d/name (::name cfg))) @@ -121,8 +125,8 @@ (.setValidationTimeout (::validation-timeout cfg)) (.setIdleTimeout (::idle-timeout cfg)) (.setMaxLifetime (::max-lifetime cfg)) - (.setMinimumIdle (::min-size cfg)) - (.setMaximumPoolSize (::max-size cfg)) + (.setMinimumIdle min-size) + (.setMaximumPoolSize max-size) (.setConnectionInitSql initsql) (.setInitializationFailTimeout -1)) @@ -180,6 +184,20 @@ :code :invalid-connection :hint "invalid connection provided"))) +(defn pool-stats + "Given a HikariDataSource instance, returns a map with current pool + statistics: active/idle connections, threads awaiting connection, + total connections, maximum pool size, and minimum idle connections." + [^HikariDataSource pool] + (let [^HikariPoolMXBean pool-mxbean (.getHikariPoolMXBean pool) + ^HikariConfigMXBean cfg-mxbean (.getHikariConfigMXBean pool)] + {:active-connections (.getActiveConnections pool-mxbean) + :idle-connections (.getIdleConnections pool-mxbean) + :threads-awaiting-connection (.getThreadsAwaitingConnection pool-mxbean) + :total-connections (.getTotalConnections pool-mxbean) + :maximum-pool-size (.getMaximumPoolSize cfg-mxbean) + :minimum-idle (.getMinimumIdle cfg-mxbean)})) + (defn create-pool [cfg] (let [dsc (create-datasource-config cfg)] diff --git a/backend/src/app/features/file_snapshots.clj b/backend/src/app/features/file_snapshots.clj index 192030cbf8..e4c2985f10 100644 --- a/backend/src/app/features/file_snapshots.clj +++ b/backend/src/app/features/file_snapshots.clj @@ -66,11 +66,6 @@ LEFT JOIN file_data AS fd ON (fd.file_id = f.id AND fd.id = f.id) WHERE f.id = ?") -(defn- get-minimal-file - [cfg id & {:as opts}] - (-> (db/get-with-sql cfg [sql:get-minimal-file id] opts) - (d/update-when :metadata fdata/decode-metadata))) - (def ^:private sql:get-snapshot-without-data (str "WITH snapshots AS (" sql:snapshots ")" "SELECT c.id, @@ -319,79 +314,87 @@ (defn restore! [{:keys [::db/conn] :as cfg} file-id snapshot-id] - (let [file (get-minimal-file conn file-id {::db/for-update true}) - vern (rand-int Integer/MAX_VALUE) + (let [lock-sql (str sql:get-minimal-file " FOR UPDATE OF f SKIP LOCKED") + row (db/exec-one! conn [lock-sql file-id])] - storage - (sto/resolve cfg {::db/reuse-conn true}) + (when-not row + (ex/raise :type :conflict + :code :file-locked + :hint "the file is currently locked by another operation, retry later")) - snapshot - (get-snapshot cfg file-id snapshot-id)] + (let [file (d/update-when row :metadata fdata/decode-metadata) + vern (rand-int Integer/MAX_VALUE) - (when-not snapshot - (ex/raise :type :not-found - :code :snapshot-not-found - :hint "unable to find snapshot with the provided label" - :snapshot-id snapshot-id - :file-id file-id)) + storage + (sto/resolve cfg {::db/reuse-conn true}) - (when-not (:data snapshot) - (ex/raise :type :internal - :code :snapshot-without-data - :hint "snapshot has no data" - :label (:label snapshot) - :file-id file-id)) + snapshot + (get-snapshot cfg file-id snapshot-id)] - (let [;; If the snapshot has applied migrations stored, we reuse - ;; them, if not, we take a safest set of migrations as - ;; starting point. This is because, at the time of - ;; implementing snapshots, migrations were not taken into - ;; account so we need to make this backward compatible in - ;; some way. - migrations - (or (:migrations snapshot) - (fmg/generate-migrations-from-version 67)) + (when-not snapshot + (ex/raise :type :not-found + :code :snapshot-not-found + :hint "unable to find snapshot with the provided label" + :snapshot-id snapshot-id + :file-id file-id)) - file - (-> file - (update :revn inc) - (assoc :migrations migrations) - (assoc :data (:data snapshot)) - (assoc :vern vern) - (assoc :version (:version snapshot)) - (assoc :has-media-trimmed false) - (assoc :modified-at (:modified-at snapshot)) - (assoc :features (:features snapshot)))] + (when-not (:data snapshot) + (ex/raise :type :internal + :code :snapshot-without-data + :hint "snapshot has no data" + :label (:label snapshot) + :file-id file-id)) - (l/dbg :hint "restoring snapshot" - :file-id (str file-id) - :label (:label snapshot) - :snapshot-id (str (:id snapshot))) + (let [;; If the snapshot has applied migrations stored, we reuse + ;; them, if not, we take a safest set of migrations as + ;; starting point. This is because, at the time of + ;; implementing snapshots, migrations were not taken into + ;; account so we need to make this backward compatible in + ;; some way. + migrations + (or (:migrations snapshot) + (fmg/generate-migrations-from-version 67)) - ;; In the same way, on reseting the file data, we need to restore - ;; the applied migrations on the moment of taking the snapshot - (bfc/update-file! cfg file ::bfc/reset-migrations? true) + file + (-> file + (update :revn inc) + (assoc :migrations migrations) + (assoc :data (:data snapshot)) + (assoc :vern vern) + (assoc :version (:version snapshot)) + (assoc :has-media-trimmed false) + (assoc :modified-at (:modified-at snapshot)) + (assoc :features (:features snapshot)))] - ;; FIXME: this should be separated functions, we should not have - ;; inline sql here. + (l/dbg :hint "restoring snapshot" + :file-id (str file-id) + :label (:label snapshot) + :snapshot-id (str (:id snapshot))) - ;; clean object thumbnails - (let [sql (str "update file_tagged_object_thumbnail " - " set deleted_at = now() " - " where file_id=? returning media_id") - res (db/exec! conn [sql file-id])] - (doseq [media-id (into #{} (keep :media-id) res)] - (sto/touch-object! storage media-id))) + ;; In the same way, on reseting the file data, we need to restore + ;; the applied migrations on the moment of taking the snapshot + (bfc/update-file! cfg file ::bfc/reset-migrations? true) - ;; clean file thumbnails - (let [sql (str "update file_thumbnail " - " set deleted_at = now() " - " where file_id=? returning media_id") - res (db/exec! conn [sql file-id])] - (doseq [media-id (into #{} (keep :media-id) res)] - (sto/touch-object! storage media-id))) + ;; FIXME: this should be separated functions, we should not have + ;; inline sql here. - vern))) + ;; clean object thumbnails + (let [sql (str "update file_tagged_object_thumbnail " + " set deleted_at = now() " + " where file_id=? returning media_id") + res (db/exec! conn [sql file-id])] + (doseq [media-id (into #{} (keep :media-id) res)] + (sto/touch-object! storage media-id))) + + ;; clean file thumbnails + (let [sql (str "update file_thumbnail " + " set deleted_at = now() " + " where file_id=? returning media_id") + res (db/exec! conn [sql file-id])] + (doseq [media-id (into #{} (keep :media-id) res)] + (sto/touch-object! storage media-id))) + + vern)))) (defn delete! [cfg & {:keys [id file-id deleted-at]}] diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 940775bdf0..2c154ea95c 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -154,8 +154,8 @@ ::db/username (cf/get :database-username) ::db/password (cf/get :database-password) ::db/read-only (cf/get :database-readonly false) - ::db/min-size (cf/get :database-min-pool-size 0) - ::db/max-size (cf/get :database-max-pool-size 60) + ::db/min-size (cf/get :database-min-pool-size) + ::db/max-size (cf/get :database-max-pool-size) ::mtx/metrics (ig/ref ::mtx/metrics)} ;; Default netty IO pool (shared between several services) diff --git a/backend/src/app/rpc/commands/files_snapshot.clj b/backend/src/app/rpc/commands/files_snapshot.clj index 8325772361..e4f7d3d18d 100644 --- a/backend/src/app/rpc/commands/files_snapshot.clj +++ b/backend/src/app/rpc/commands/files_snapshot.clj @@ -17,6 +17,7 @@ [app.main :as-alias main] [app.msgbus :as mbus] [app.rpc :as-alias rpc] + [app.rpc.climit :as-alias climit] [app.rpc.commands.files :as files] [app.rpc.commands.teams :as teams] [app.rpc.doc :as-alias doc] @@ -43,9 +44,10 @@ (sv/defmethod ::create-file-snapshot {::doc/added "1.20" ::sm/params schema:create-file-snapshot - ::db/transaction true} - [{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id file-id label]}] - (files/check-edition-permissions! conn profile-id file-id) + ::climit/id [[:create-file-snapshot/by-profile ::rpc/profile-id] + [:create-file-snapshot/global]]} + [cfg {:keys [::rpc/profile-id file-id label]}] + (files/check-edition-permissions! cfg profile-id file-id) (let [file (bfc/get-file cfg file-id :realize? true) project (db/get-by-id cfg :project (:project-id file))] @@ -57,10 +59,10 @@ (quotes/check! {::quotes/id ::quotes/snapshots-per-file} {::quotes/id ::quotes/snapshots-per-team})) - (fsnap/create! cfg file - {:label label - :profile-id profile-id - :created-by "user"}))) + (db/tx-run! cfg fsnap/create! file + {:label label + :profile-id profile-id + :created-by "user"}))) (def ^:private schema:restore-file-snapshot [:map {:title "restore-file-snapshot"} @@ -70,29 +72,43 @@ (sv/defmethod ::restore-file-snapshot {::doc/added "1.20" ::sm/params schema:restore-file-snapshot - ::db/transaction true} - [{:keys [::db/conn ::mbus/msgbus] :as cfg} {:keys [::rpc/profile-id ::rpc/session-id file-id id] :as params}] - (files/check-edition-permissions! conn profile-id file-id) + ::climit/id [[:restore-file-snapshot/by-profile ::rpc/profile-id] + [:restore-file-snapshot/global]]} + [{:keys [::db/pool ::mbus/msgbus] :as cfg} {:keys [::rpc/profile-id ::rpc/session-id file-id id] :as params}] + + ;; Check permissions and read current file state (short-lived, outside restore transaction) + (files/check-edition-permissions! pool profile-id file-id) (let [file (bfc/get-file cfg file-id) - team (teams/get-team conn + team (teams/get-team pool :profile-id profile-id :file-id file-id) - delay (ldel/get-deletion-delay team)] + delay (ldel/get-deletion-delay team) + file-revn (:revn file)] + ;; Create backup snapshot of the current state (committed immediately + ;; independently of the restore outcome) (fsnap/create! cfg file {:profile-id profile-id :deleted-at (ct/in-future delay) :created-by "system"}) - (let [vern (fsnap/restore! cfg file-id id)] - ;; Send to the clients a notification to reload the file - (mbus/pub! msgbus - :topic (:id file) - :message {:type :file-restored - :session-id session-id - :file-id (:id file) - :vern vern}) - nil))) + ;; Restore snapshot inside its own transaction; the revn check + ;; ensures no data is lost if the file was edited concurrently + (db/tx-run! cfg + (fn [{:keys [::db/conn] :as cfg}] + (let [current (bfc/get-minimal-file conn file-id {::db/for-update true})] + (when (not= (:revn current) file-revn) + (ex/raise :type :conflict + :code :file-modified + :hint "the file was modified during the restore process, please retry"))) + (let [vern (fsnap/restore! cfg file-id id)] + (mbus/pub! msgbus + :topic (:id file) + :message {:type :file-restored + :session-id session-id + :file-id (:id file) + :vern vern}) + nil))))) (def ^:private schema:update-file-snapshot [:map {:title "update-file-snapshot"} diff --git a/backend/test/backend_tests/db_test.clj b/backend/test/backend_tests/db_test.clj new file mode 100644 index 0000000000..b61ce6c920 --- /dev/null +++ b/backend/test/backend_tests/db_test.clj @@ -0,0 +1,43 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns backend-tests.db-test + (:require + [app.db :as db] + [backend-tests.helpers :as th] + [clojure.test :as t]) + (:import + com.zaxxer.hikari.HikariConfig + com.zaxxer.hikari.HikariDataSource + java.sql.Connection)) + +(t/use-fixtures :once th/state-init) + +(t/deftest pool-stats-returns-expected-keys + (let [stats (db/pool-stats th/*pool*)] + (t/testing "all expected keys are present" + (t/is (contains? stats :active-connections)) + (t/is (contains? stats :idle-connections)) + (t/is (contains? stats :threads-awaiting-connection)) + (t/is (contains? stats :total-connections)) + (t/is (contains? stats :maximum-pool-size)) + (t/is (contains? stats :minimum-idle))) + + (t/testing "values are non-negative integers" + (t/is (>= (:active-connections stats) 0)) + (t/is (>= (:idle-connections stats) 0)) + (t/is (>= (:threads-awaiting-connection stats) 0)) + (t/is (>= (:total-connections stats) 0)) + (t/is (>= (:maximum-pool-size stats) 0)) + (t/is (>= (:minimum-idle stats) 0))) + + (t/testing "total connections equals active + idle" + (t/is (= (:total-connections stats) + (+ (:active-connections stats) + (:idle-connections stats))))) + + (t/testing "maximum pool size is reasonable" + (t/is (pos? (:maximum-pool-size stats)))))) From d0cc859bc2e7d9d0710efa2db221868dc2cf8431 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 May 2026 17:41:41 +0200 Subject: [PATCH 02/53] :sparkles: Migrate svg-attrs, optimize set-shape-svg-attrs, filter invalid URLs (#9118) * :sparkles: Add svg-attrs casing fix migration * :zap: Optimize set-shape-svg-attrs by removing redundant operations - Remove backward compatibility for kebab-case SVG attribute keys (fill-rule, stroke-linecap, stroke-linejoin) since svg-attrs are already normalized to camelCase by the attrs->props migration. - Remove unnecessary select-keys filtering and intermediate map construction (dissoc :style + merge style). - Directly extract values from style and attrs using or, avoiding any intermediate map allocation. Signed-off-by: Andrey Antukh * :bug: Filter non-http(s) URLs in upload-images to prevent invalid calls Skip upload for image items that are not data URIs and do not have an http:// or https:// URL, avoiding unnecessary RPC calls with invalid URLs to create-file-media-object-from-url. Signed-off-by: Andrey Antukh --------- Signed-off-by: Andrey Antukh --- common/src/app/common/files/migrations.cljc | 18 +++++++++++++++++- .../app/main/data/workspace/svg_upload.cljs | 8 +++++--- frontend/src/app/render_wasm/api.cljs | 14 ++++---------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index eeb11e9067..5721910890 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -1805,6 +1805,21 @@ {})] (cfcp/sync-component-id-with-ref-shape data libraries))) +(defmethod migrate-data "0021-fix-shape-svg-attrs" + [data _] + (some-> cfeat/*new* (swap! conj "fdata/shape-data-type")) + (letfn [(update-object [object] + (-> object + (d/update-when :svg-attrs csvg/attrs->props) + (d/update-when :svg-viewbox grc/make-rect))) + + (update-container [container] + (d/update-when container :objects d/update-vals update-object))] + + (-> data + (update :pages-index d/update-vals update-container) + (d/update-when :components d/update-vals update-container)))) + (def available-migrations (into (d/ordered-set) ["legacy-2" @@ -1882,4 +1897,5 @@ "0017-fix-layout-flex-dir" "0018-remove-unneeded-objects-from-components" "0019-fix-missing-swap-slots" - "0020-sync-component-id-with-near-main"])) + "0020-sync-component-id-with-near-main" + "0021-fix-shape-svg-attrs"])) diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index a573cd594b..265c31b0b2 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -47,10 +47,12 @@ (-> item (assoc :name (extract-name href)) (assoc :url href)))))) + (rx/filter (fn [item] + (or (contains? item :content) + (let [url (:url item)] + (or (str/starts-with? url "http://") + (str/starts-with? url "https://")))))) (rx/mapcat (fn [item] - ;; TODO: :create-file-media-object-from-url is - ;; deprecated and this should be resolved in - ;; frontend (->> (rp/cmd! (if (contains? item :content) :upload-file-media-object :create-file-media-object-from-url) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index 6924456411..2d3b106451 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -762,16 +762,10 @@ (defn set-shape-svg-attrs [attrs] (let [style (:style attrs) - ;; Filter to only supported attributes - allowed-keys #{:fill :fillRule :fill-rule :strokeLinecap :stroke-linecap :strokeLinejoin :stroke-linejoin} - attrs (-> attrs - (dissoc :style) - (merge style) - (select-keys allowed-keys)) - fill-rule (-> (or (:fill-rule attrs) (:fillRule attrs)) sr/translate-fill-rule) - stroke-linecap (-> (or (:stroke-linecap attrs) (:strokeLinecap attrs)) sr/translate-stroke-linecap) - stroke-linejoin (-> (or (:stroke-linejoin attrs) (:strokeLinejoin attrs)) sr/translate-stroke-linejoin) - fill-none (= "none" (-> attrs :fill))] + fill-rule (-> (or (:fillRule style) (:fillRule attrs)) sr/translate-fill-rule) + stroke-linecap (-> (or (:strokeLinecap style) (:strokeLinecap attrs)) sr/translate-stroke-linecap) + stroke-linejoin (-> (or (:strokeLinejoin style) (:strokeLinejoin attrs)) sr/translate-stroke-linejoin) + fill-none (= "none" (or (:fill style) (:fill attrs)))] (h/call wasm/internal-module "_set_shape_svg_attrs" fill-rule stroke-linecap stroke-linejoin fill-none))) (defn set-shape-path-content From 0b0bd72dce0a6776ddee1b1ea53b6f1894a7e1b4 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 May 2026 17:47:00 +0200 Subject: [PATCH 03/53] :paperclip: Backport opencode skills from staging --- .gitignore | 1 + .opencode/skills/update-changelog/SKILL.md | 40 +++- tools/gh.py | 21 +- tools/taiga.py | 261 +++++++++++++++++++++ 4 files changed, 301 insertions(+), 22 deletions(-) create mode 100755 tools/taiga.py diff --git a/.gitignore b/.gitignore index 8586839ba0..9d64190075 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,4 @@ /**/node_modules /**/.yarn/* /.pnpm-store +/tools/__pycache__ diff --git a/.opencode/skills/update-changelog/SKILL.md b/.opencode/skills/update-changelog/SKILL.md index 5752b65aa3..29c3d295b4 100644 --- a/.opencode/skills/update-changelog/SKILL.md +++ b/.opencode/skills/update-changelog/SKILL.md @@ -45,12 +45,12 @@ python3 tools/gh.py issues "2.16.0" --state all python3 tools/gh.py issues "2.16.0" --exclude "release blocker,no changelog" ``` -**Label exclusion rules:** -- `release blocker` — Internal release-blocking bugs not relevant to end users -- `no changelog` — Chore/refactor work that doesn't need a changelog entry +**Exclusion rules:** +- `no changelog` label — Chore/refactor work that doesn't need a changelog entry +- `Task` issue type — Internal chores are not user-facing; filter these out after fetching The script outputs JSON with each entry containing `number`, `title`, `state`, -`labels`, and `closing_prs` (the PRs that fix each issue). +`issue_type`, `labels`, and `closing_prs` (the PRs that fix each issue). ### 3. Identify missing entries (optional) @@ -84,15 +84,27 @@ The `prs` command returns JSON with `number`, `title`, `body`, `state`, `merged_at`, `author`, `labels`, and `closing_issues`. PRs are fetched in batches of 50 via GraphQL to stay within API limits. -### 5. Categorize entries +### 5. Categorize entries — strictly by issue type, never by labels or emoji -Check the labels on each issue to determine which section it belongs to: +Use the **Issue Type** field (GitHub's native issue type, exposed as +`issue_type` in the `gh.py` JSON output) to determine which section an entry +belongs to. -| Label / Title prefix | Changelog section | -|----------------------|-------------------| -| `bug` label or `:bug:` title prefix | `### :bug: Bugs fixed` | -| `enhancement` label or `:sparkles:` prefix | `### :sparkles: New features & Enhancements` | -| No label | Infer from title convention, default to bug fix | +> **⚠️ CRITICAL: Never use labels or title emoji prefixes for categorization.** +> Labels like `bug` and `enhancement`, as well as title prefixes like `:bug:` +> and `:sparkles:`, are frequently inaccurate, missing, or contradictory to the +> actual issue type. The `issue_type` field from `gh.py` is the single source +> of truth. + +| `issue_type` value | Changelog section | +|--------------------|-------------------| +| `Bug` | `### :bug: Bugs fixed` | +| `Feature` or `Enhancement` | `### :sparkles: New features & Enhancements` | +| `Task` | **Exclude** — internal chores are not user-facing | +| `null` (not set) | Check labels as a fallback: `bug` label → bugs, otherwise enhancements | + +The `gh.py` issues command already includes `issue_type` in every entry's +output. **No separate GraphQL query is needed.** **Community contribution attribution:** If the issue or its fix PR has the `community contribution` label, add an attribution `(by @)` @@ -205,6 +217,7 @@ Read the top of `CHANGES.md` and confirm: can find the code changes. - **Latest version first.** New sections are inserted at the top of the changelog, below the `# CHANGELOG` header. +- **Issue Type determines section — exclusively.** Use the `issue_type` field from `gh.py` output (Bug → `:bug:`, Feature/Enhancement → `:sparkles:`). **Do not** use labels (`bug`, `enhancement`) or title emoji prefixes (`:bug:`, `:sparkles:`) — they are frequently wrong or contradictory. The `issue_type` is the single source of truth. - **User-facing descriptions.** Write from the user's perspective — describe what broke and what was fixed, not internal implementation details. - **Community attribution.** When the issue or fix PR has the @@ -213,8 +226,9 @@ Read the top of `CHANGES.md` and confirm: issue author) for the attribution. - **Only closed issues.** An issue must have `state: "closed"` to appear in the changelog. Open unresolved issues are omitted. -- **Excluded labels.** Issues with `release blocker` or `no changelog` labels - must be excluded from the changelog. +- **Excluded issues.** Issues with `no changelog` label must be excluded. + Issues with `issue_type: "Task"` must also be excluded — they are internal + chores, not user-facing changes. - **Multiple PRs per issue.** If multiple PRs fix the same issue, list them comma-separated inline: `(PR: [#A](url), [#B](url))`. - **Duplicate removal.** If an entry already exists in a prior version section, diff --git a/tools/gh.py b/tools/gh.py index 2aa7ac4da8..afd81da619 100755 --- a/tools/gh.py +++ b/tools/gh.py @@ -80,14 +80,15 @@ query($owner: String!, $repo: String!, $milestone: Int!, $cursor: String) { issues(first: 100, after: $cursor, states: __STATES__) { totalCount pageInfo { hasNextPage endCursor } - nodes { - ... on Issue { - number - title - state - labels(first: 20) { nodes { name } } - closedByPullRequestsReferences(first: 5) { nodes { number } } - } + nodes { + ... on Issue { + number + title + state + issueType { name } + labels(first: 20) { nodes { name } } + closedByPullRequestsReferences(first: 5) { nodes { number } } + } } } } @@ -120,7 +121,7 @@ def fetch_milestone_issues(milestone_num: int, states: str) -> list[dict]: states: GraphQL states enum array literal, e.g. ``"[CLOSED]"`` or ``"[OPEN CLOSED]"`` Returns: - List of {number, title, state, labels: [str], closing_prs: [int]} + List of {number, title, state, issue_type: str|None, labels: [str], closing_prs: [int]} """ query = GQL_ISSUES_QUERY.replace("__STATES__", states) all_nodes: list[dict] = [] @@ -140,10 +141,12 @@ def fetch_milestone_issues(milestone_num: int, states: str) -> list[dict]: for node in issues["nodes"]: if node is None: continue + issue_type = node.get("issueType") all_nodes.append({ "number": node["number"], "title": node["title"], "state": node["state"], + "issue_type": issue_type["name"] if issue_type else None, "labels": [lbl["name"] for lbl in node["labels"]["nodes"]], "closing_prs": [pr["number"] for pr in node["closedByPullRequestsReferences"]["nodes"]], }) diff --git a/tools/taiga.py b/tools/taiga.py new file mode 100755 index 0000000000..1e96364a31 --- /dev/null +++ b/tools/taiga.py @@ -0,0 +1,261 @@ +#!/usr/bin/env python3 +""" +Taiga API client — fetch public issues, user stories, and tasks from the +Penpot project (id 345963) without authentication. + +Usage: + python3 tools/taiga.py + python3 tools/taiga.py + python3 tools/taiga.py [--json] + python3 tools/taiga.py [--json] + +Examples: + python3 tools/taiga.py https://tree.taiga.io/project/penpot/issue/13714 + python3 tools/taiga.py --json https://tree.taiga.io/project/penpot/us/14128 + python3 tools/taiga.py task 13648 +""" + +import argparse +import json +import re +import sys +import urllib.error +import urllib.request + +API_BASE = "https://api.taiga.io/api/v1" +PROJECT_ID = 345963 + +ENDPOINT_MAP = { + "issue": "issues", + "us": "userstories", + "task": "tasks", +} + +TYPE_LABELS = { + "issue": "Issue", + "us": "User Story", + "task": "Task", +} + + +# ── URL Parsing ────────────────────────────────────────────────────────────── + +def parse_taiga_url(url: str) -> tuple[str, int] | None: + """Extract (type, ref) from a tree.taiga.io URL. + + Supported patterns: + .../project/penpot/issue/13714 + .../project/penpot/us/14128 + .../project/penpot/task/13648 + """ + m = re.search(r"/project/penpot/(issue|us|task)/(\d+)", url) + if not m: + return None + return m.group(1), int(m.group(2)) + + +# ── API call ───────────────────────────────────────────────────────────────── + +def fetch_item(endpoint: str, ref: int) -> dict | None: + """Fetch a single item by ref using the 'by_ref' endpoint.""" + url = f"{API_BASE}/{endpoint}/by_ref?ref={ref}&project={PROJECT_ID}" + try: + with urllib.request.urlopen(url, timeout=15) as resp: + return json.loads(resp.read().decode()) + except urllib.error.HTTPError as e: + print(f"Error: HTTP {e.code} — {e.reason}", file=sys.stderr) + if e.code == 404: + print( + f" Item (ref={ref}) not found in project {PROJECT_ID}.", + file=sys.stderr, + ) + return None + except urllib.error.URLError as e: + print(f"Error: {e.reason}", file=sys.stderr) + return None + except json.JSONDecodeError as e: + print(f"Error: invalid JSON response — {e}", file=sys.stderr) + return None + + +# ── Output formatting ──────────────────────────────────────────────────────── + +def _val(value, default="—"): + return value if value is not None else default + + +def _tag_list(tags): + """Pretty-print tag list. Tags are arrays of [name, color] pairs.""" + if not tags: + return "—" + names = [t[0] if isinstance(t, list) else str(t) for t in tags] + return ", ".join(names) + + +def _extra_name(extra_info): + """Extract a display name from an *_extra_info dict.""" + if not extra_info: + return "—" + return extra_info.get("full_name_display") or extra_info.get("username") or "—" + + +def _status_name(status_info): + """Extract status name from status_extra_info.""" + if not status_info: + return "—" + return status_info.get("name", "—") + + +def _project_name(proj_info): + """Extract project name from project_extra_info.""" + if not proj_info: + return "—" + return proj_info.get("name", "—") + + +def _assignee(item): + """Return the assignee display name.""" + return _extra_name(item.get("assigned_to_extra_info")) + + +def _owner(item): + return _extra_name(item.get("owner_extra_info")) + + +def format_summary(item: dict, item_type: str) -> str: + """Build a printable summary matching the requested format.""" + label = TYPE_LABELS.get(item_type, item_type.capitalize()) + subject = item.get("subject", "(no subject)") + ref = item.get("ref", "?") + status = _status_name(item.get("status_extra_info")) + assignee = _assignee(item) + owner = _owner(item) + created = item.get("created_date", "")[:10] if item.get("created_date") else "" + tags = _tag_list(item.get("tags", [])) + + # Title line + title = f"{label} #{ref} — {subject}" + + # Fields section (no indent) + fields = [] + fields.append(f"Status: {status}") + + if item_type == "us": + milestone = item.get("milestone_slug") or "" + points = item.get("points") or {} + point_count = len(points) + fields.append(f"Milestone: {milestone}") + fields.append(f"Points: {point_count} role(s)") + elif item_type == "task": + milestone = item.get("milestone_slug") or "" + parent = item.get("user_story") + fields.append(f"Milestone: {milestone}") + fields.append(f"Parent US: {parent if parent else '—'}") + elif item_type == "issue": + issue_type_id = item.get("type", "") + severity_id = item.get("severity", "") + priority_id = item.get("priority", "") + fields.append(f"Type ID: {issue_type_id}") + fields.append(f"Severity ID: {severity_id}") + fields.append(f"Priority ID: {priority_id}") + + fields.append(f"Assignee: {assignee}") + fields.append(f"Author: {owner}") + fields.append(f"Created: {created}") + fields.append(f"Tags: {tags}") + + url = f"https://tree.taiga.io/project/penpot/{item_type}/{ref}" + fields.append(f"URL: {url}") + + # Assemble output + sep = "================================" + parts = [title, sep] + parts.extend(fields) + + # Full description after second separator + desc = item.get("description") or "" + if desc.strip(): + parts.append(sep) + parts.append(desc) + + return "\n".join(parts) + + +# ── CLI ─────────────────────────────────────────────────────────────────────── + +def build_parser(): + parser = argparse.ArgumentParser( + description="Fetch public items from the Penpot Taiga project.", + epilog=( + "Examples:\n" + " %(prog)s https://tree.taiga.io/project/penpot/issue/13714\n" + " %(prog)s --json us 14128\n" + " %(prog)s task 13648" + ), + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "--json", + action="store_true", + dest="raw_json", + help="Output raw JSON instead of formatted summary.", + ) + parser.add_argument( + "args", + nargs="+", + help='Either a Taiga URL, or " " (e.g. issue 13714).', + ) + return parser + + +def main(): + parser = build_parser() + opts = parser.parse_args() + + # Determine (type, ref) from arguments + item_type: str | None = None + ref: int | None = None + + if len(opts.args) == 1: + # Single argument — must be a Taiga URL + parsed = parse_taiga_url(opts.args[0]) + if parsed is None: + print( + "Error: could not parse Taiga URL. " + 'Expected format: https://tree.taiga.io/project/penpot//', + file=sys.stderr, + ) + sys.exit(1) + item_type, ref = parsed + elif len(opts.args) == 2: + item_type, ref_str = opts.args + if item_type not in ENDPOINT_MAP: + print( + f"Error: unknown type '{item_type}'. " + f"Expected one of: {', '.join(ENDPOINT_MAP)}", + file=sys.stderr, + ) + sys.exit(1) + try: + ref = int(ref_str) + except ValueError: + print(f"Error: ref must be a number, got '{ref_str}'", file=sys.stderr) + sys.exit(1) + else: + parser.print_help() + sys.exit(1) + + endpoint = ENDPOINT_MAP[item_type] + item = fetch_item(endpoint, ref) + + if item is None: + sys.exit(1) + + if opts.raw_json: + print(json.dumps(item, indent=2, ensure_ascii=False)) + else: + print(format_summary(item, item_type)) + + +if __name__ == "__main__": + main() From 5f30704b2809b529094887f253ba051e93d2a236 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 May 2026 17:55:41 +0200 Subject: [PATCH 04/53] :books: Update changelog --- CHANGES.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index d1a6f7562c..fbef87a713 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # CHANGELOG -## 2.15.4 (Unreleased) +## 2.15.4 + +### :sparkles: New features & Enhancements + +- Add rate limiting and concurrency safety for file snapshot operations [#9723](https://github.com/penpot/penpot/issues/9723) (PR: [#9722](https://github.com/penpot/penpot/pull/9722)) ### :bug: Bugs fixed @@ -9,6 +13,7 @@ - Fix API doc endpoint returning HTML as text/plain [#9680](https://github.com/penpot/penpot/issues/9680) (PR: [#9681](https://github.com/penpot/penpot/pull/9681)) - Fix unexpected error when opening the export dialog [#9721](https://github.com/penpot/penpot/issues/9721) (PR: [#9704](https://github.com/penpot/penpot/pull/9704)) + ## 2.15.3 ### :bug: Bugs fixed From b72389b5e32b7d3130b1e38b65e18751adb2a5bb Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 May 2026 18:56:39 +0200 Subject: [PATCH 05/53] :bug: Fix unset color on delete invitations modal (#9747) --- 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 d68bbd26c9..1d568bf35b 100644 --- a/frontend/src/app/main/ui/dashboard/team.scss +++ b/frontend/src/app/main/ui/dashboard/team.scss @@ -860,6 +860,7 @@ .modal-invitation-content { overflow: auto; + color: var(--color-foreground-secondary); } .invitation-list p { From 27df2aebfc3d8b7fd8bb1f130d37f6893bad97ff Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 May 2026 18:58:18 +0200 Subject: [PATCH 06/53] :bug: Fix token pill not updating when token name is equal token group (#9742) --- .../playwright/ui/specs/tokens/apply.spec.js | 113 ++++++++++++++++++ .../main/ui/ds/controls/numeric_input.cljs | 4 +- 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/frontend/playwright/ui/specs/tokens/apply.spec.js b/frontend/playwright/ui/specs/tokens/apply.spec.js index 76ad209b7a..b36539a9cb 100644 --- a/frontend/playwright/ui/specs/tokens/apply.spec.js +++ b/frontend/playwright/ui/specs/tokens/apply.spec.js @@ -1200,6 +1200,119 @@ test("BUG: 14200, Tokens in sets are applied when clicking on Save during creati await expect(borderTokenPill).not.toBeVisible(); }); +test("Check token application across sets", async ({ + page, +}) => { + // Setup the workspace with token features enabled + const { + workspacePage, + tokensSidebar, + tokenContextMenuForToken, + tokenThemesSetsSidebar, + tokenSetGroupItems, + tokensUpdateCreateModal, + } = await setupTokensFileRender(page, { + flags: ["enable-token-combobox", "enable-feature-token-input"], + }); + + const changeSetInput = async (sidebar, setName, finalKey = "Enter") => { + const setInput = sidebar.locator("input:focus"); + await expect(setInput).toBeVisible(); + await setInput.fill(setName); + await setInput.press(finalKey); + }; + + const createSet = async (sidebar, setName, finalKey = "Enter") => { + const tokensTabButton = sidebar + .getByRole("button", { name: "Add set" }) + .click(); + + await changeSetInput(sidebar, setName, (finalKey = "Enter")); + }; + + const createTokenInSet = async (tokenName, tokenValue) => { + await unfoldTokenType(tokensSidebar, "Border radius"); + + // Create border token + const tokensTabPanel = page.getByRole("tabpanel", { name: "tokens" }); + await tokensTabPanel + .getByRole("button", { name: `Add Token: Border radius` }) + .click(); + await expect(tokensUpdateCreateModal).toBeVisible(); + + const nameField = tokensUpdateCreateModal.getByLabel("Name"); + await nameField.fill(tokenName); + + const valueField = tokensUpdateCreateModal.getByRole("combobox", { + name: "Value", + }); + await valueField.fill(tokenValue); + + const submitButton = tokensUpdateCreateModal.getByRole("button", { + name: "Save", + }); + await submitButton.click(); + await expect(tokensUpdateCreateModal).not.toBeVisible(); + } + + // Select rectangle layer + await page.getByRole("tab", { name: "Layers" }).click(); + await workspacePage.layers + .getByTestId("layer-row") + .filter({ hasText: "Rectangle" }) + .first() + .click(); + + // Go to tokens tab + await page.getByRole("tab", { name: "Tokens" }).click(); + + // Create nested token set, select it and activate it + await createSet(tokenThemesSetsSidebar, "device/desktop"); + const desktopSetButton = tokenThemesSetsSidebar.getByRole("button", { name: "desktop" }); + await desktopSetButton.click(); + await desktopSetButton.getByRole("checkbox").click(); + + // Create token in nested set + await unfoldTokenType(tokensSidebar, "Border radius"); + + // Create border token + await createTokenInSet("border-radius", "20"); + + // Check "border" token is not applied while creating. + const borderRadiusSection = page.getByRole("region", { + name: "Border radius section", + }); + await expect(borderRadiusSection).toBeVisible(); + + // Check if token pill is visible on design tab on right sidebar + const borderTokenPill = borderRadiusSection.getByRole("button", { + name: "border-radius", + exact: true, + }); + await expect(borderTokenPill).not.toBeVisible(); + + // Apply token to shape + await tokensSidebar.getByRole('button', { name: 'border-radius', exact: true }).click(); + + await expect(borderTokenPill).toBeVisible(); + await expect(borderTokenPill).toHaveText("20"); + + //Create new set, select it and activate it + await createSet(tokenThemesSetsSidebar, "device/mobile"); + const mobileSetButton = tokenThemesSetsSidebar.getByRole("button", { name: "mobile" }); + await mobileSetButton.click(); + await mobileSetButton.getByRole("checkbox").click(); + + //Create the same token in new set with different value + await createTokenInSet("border-radius", "30"); + + //Check token is applied and value updated. + await expect(borderRadiusSection).toBeVisible(); + await expect(borderTokenPill).toBeVisible(); + + await expect(borderTokenPill).toHaveText("30"); +}); + test("BUG: 14191, Apply tokens from different set", async ({ page }) => { const { workspacePage, diff --git a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs index d0e135aa83..7c24fc1310 100644 --- a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs +++ b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs @@ -68,7 +68,9 @@ (defn- get-option-by-name [options name] (let [options (if (delay? options) (deref options) options)] - (d/seek #(= name (get % :name)) options))) + (d/seek #(and (= :token (get % :type)) + (= name (get % :name))) + options))) (defn- get-token-op [tokens name] From fb6c522cc00942c3b073cdecadb6b7d67b591550 Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Tue, 19 May 2026 10:45:46 +0200 Subject: [PATCH 07/53] :bug: Fix inner strokes clipped on boards created from rect --- render-wasm/src/render.rs | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 72cc2078f2..54bc7d6a6f 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -2508,12 +2508,26 @@ impl RenderState { _ => {} } - //In clipped content strokes are drawn over the contained elements - if element.clip() { + // Strokes are drawn over children for clipped frames (all strokes), and for non-clipped + // frames with inner strokes (inner strokes only — non-inner were rendered before children). + let needs_exit_strokes = element.clip() + || (matches!(element.shape_type, Type::Frame(_)) && element.has_inner_stroke()); + + if needs_exit_strokes { let mut element_strokes: Cow = Cow::Borrowed(element); element_strokes.to_mut().clear_fills(); element_strokes.to_mut().clear_shadows(); element_strokes.to_mut().clip_content = false; + + // For non-clipped frames, non-inner strokes were already rendered inline. + if !element.clip() { + let is_open = element.is_open(); + element_strokes + .to_mut() + .strokes + .retain(|s| s.render_kind(is_open) == StrokeKind::Inner); + } + // Frame blur is applied at the save_layer level - avoid double blur on the stroke paint if Self::frame_clip_layer_blur(element).is_some() { element_strokes.to_mut().set_blur(None); @@ -3273,8 +3287,24 @@ impl RenderState { .draw_into(SurfaceId::DropShadows, target_surface, None); } + // For frames without clip_content, inner strokes must render after children in + // render_shape_exit so children don't paint over them. Strip them here. + let element_for_inline: Cow = if matches!(element.shape_type, Type::Frame(_)) + && !element.clip_content + && element.has_inner_stroke() + { + let is_open = element.is_open(); + let mut modified = element.clone(); + modified + .strokes + .retain(|s| s.render_kind(is_open) != StrokeKind::Inner); + Cow::Owned(modified) + } else { + Cow::Borrowed(element) + }; + self.render_shape( - element, + &element_for_inline, clip_bounds.clone(), SurfaceId::Fills, SurfaceId::Strokes, From 29d449b42f00a3482289073b30e48abe2ab50a90 Mon Sep 17 00:00:00 2001 From: Alonso Torres Date: Wed, 20 May 2026 11:08:41 +0200 Subject: [PATCH 08/53] :bug: Deactivate text update (#9757) --- frontend/src/app/main/ui/workspace/viewport_wasm.cljs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs index afe3543572..6c2a741533 100644 --- a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs +++ b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs @@ -17,7 +17,7 @@ [app.common.types.shape :as cts] [app.common.types.shape.layout :as ctl] [app.main.data.modal :as modal] - [app.main.data.workspace :as dw] + ;; [app.main.data.workspace :as dw] [app.main.data.workspace.transforms :as dwt] [app.main.data.workspace.variants :as dwv] [app.main.features :as features] @@ -459,8 +459,9 @@ ;; is set. (wasm.api/initialize-viewport base-objects zoom vbox :background background - :on-shapes-ready - #(st/emit! (dw/check-file-position-data file-id))) + ;; :on-shapes-ready + ;; (st/emit! (dw/check-file-position-data file-id)) + ) (reset! initialized? true)) (when (and (some? vern) (not= vern (mf/ref-val last-vern-ref))) From 106b10e971837072b574ef0ac0c62d6a7fe64737 Mon Sep 17 00:00:00 2001 From: Francis Santiago Date: Wed, 20 May 2026 13:05:40 +0200 Subject: [PATCH 09/53] :books: Clarify self-hosted OIDC configuration for containerized deployments (#9758) Signed-off-by: Francis Santiago --- docs/technical-guide/configuration.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/technical-guide/configuration.md b/docs/technical-guide/configuration.md index ddbe801fd7..87ee6182b8 100644 --- a/docs/technical-guide/configuration.md +++ b/docs/technical-guide/configuration.md @@ -171,13 +171,14 @@ PENPOT_OIDC_CLIENT_ID: # Mainly used for auto discovery the openid endpoints PENPOT_OIDC_BASE_URI: -PENPOT_OIDC_CLIENT_SECRET: +PENPOT_OIDC_CLIENT_SECRET: # Optional backend variables, used mainly if you want override; they are # autodiscovered using the standard openid-connect mechanism. PENPOT_OIDC_AUTH_URI: PENPOT_OIDC_TOKEN_URI: PENPOT_OIDC_USER_URI: +PENPOT_OIDC_JWKS_URI: # Optional list of roles that users are required to have. If no role # is provided, roles checking disabled. @@ -187,6 +188,27 @@ PENPOT_OIDC_ROLES: "role1 role2" # not provided, the roles checking will be disabled. PENPOT_OIDC_ROLES_ATTR: ``` + +

+For self-hosted and containerized deployments, the autodiscovered OIDC endpoints are +not always enough. Some providers expose browser-facing endpoints through a public +hostname while the Penpot backend must reach the same provider through an +internal/container-resolvable hostname. In that case, explicitly set the OIDC endpoint +overrides above so the browser can use the public authorization endpoint while the +backend uses reachable token, userinfo, and JWKS endpoints. +

+ +If the backend needs to contact the OIDC provider through a hostname not already allowed +by SSRF protection, add it to: + +```bash +# Backend +# Space separated list of allowed hosts +PENPOT_SSRF_ALLOWED_HOSTS: " " +``` + +This is commonly required when the provider is reachable from the browser via a public +URL but from the backend via a different internal hostname.
__Since version 1.6.0__ From 3e2b00b97f978168c5df5638d618fc4b4e02e9d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 20 May 2026 13:12:52 +0200 Subject: [PATCH 10/53] :bug: Reload libraries when the tokens change (#9715) --- backend/src/app/rpc/commands/files_update.clj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/src/app/rpc/commands/files_update.clj b/backend/src/app/rpc/commands/files_update.clj index 94d1f90096..52fea1639b 100644 --- a/backend/src/app/rpc/commands/files_update.clj +++ b/backend/src/app/rpc/commands/files_update.clj @@ -101,6 +101,17 @@ :mod-typography :del-typography}) +(def ^:private token-change-types + #{:set-tokens-lib + :set-token + :set-token-set + :set-token-theme + :set-active-token-themes + :rename-token-set-group + :move-token-set + :move-token-set-group + :set-base-font-size}) + (def ^:private file-change-types #{:add-obj :mod-obj @@ -111,6 +122,7 @@ (defn- library-change? [{:keys [type] :as change}] (or (contains? library-change-types type) + (contains? token-change-types type) (contains? file-change-types type))) ;; If features are specified from params and the final feature From f1c0ea2a19082efd3c3662b736f266dc15ac6e43 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 20 May 2026 13:23:21 +0200 Subject: [PATCH 11/53] :bug: Fix typing full token name on numeric input (#9725) --- .../src/app/main/ui/ds/controls/numeric_input.cljs | 7 +++++-- .../ui/workspace/sidebar/options/rows/stroke_row.cljs | 2 -- .../tokens/management/forms/controls/utils.cljs | 10 +++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs index 7c24fc1310..8a20573119 100644 --- a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs +++ b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs @@ -433,7 +433,8 @@ token (get-option-by-name options name)] (if token (apply-token (:resolved-value token) name) - (apply-value (mf/ref-val last-value*))))) + (apply-value (mf/ref-val last-value*)))) + (reset! is-open* false)) enter? (if is-open @@ -705,7 +706,9 @@ token-props (when (and token-applied-name (not= :multiple token-applied-name)) (let [token (get-option-by-name dropdown-options token-applied-name) - id (get token :id) + id (or (get token :id) + (some-> (get token-applied :id) + (dm/str))) label (or (get token :name) applied-token-name) token-value (or (get token :resolved-value) (or (mf/ref-val last-value*) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs index 0e6a28612a..723a658466 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs @@ -205,8 +205,6 @@ (when (some? on-reorder) [:> reorder-handler* {:ref dref}]) - (prn "stroke-row*" applied-tokens) - ;; Stroke Color ;; FIXME: memorize stroke color [:div {:class (stl/css :stroke-color-actions)} diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/utils.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/utils.cljs index 39a4675dc0..510257b3ca 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/utils.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/utils.cljs @@ -39,9 +39,17 @@ (not-empty))))) (defn- extract-partial-brace-text + "Returns the substring after the last '{' in s. If the resulting + substring ends with '}', that trailing brace is removed. + Returns nil if no '{' is found or s is nil." [s] (when-let [start (str/last-index-of s "{")] - (subs s (inc start)))) + (let [partial (subs s (inc start))] + (if (and (seq partial) + (> (count partial) 0) + (= "}" (subs partial (dec (count partial))))) + (subs partial 0 (dec (count partial))) + partial)))) (defn- filter-token-groups-by-name [tokens filter-text] From d96442483ee49a3d7c18ff850428e54361fdea69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Wed, 20 May 2026 17:37:07 +0200 Subject: [PATCH 12/53] :bug: Fix blurry boards (svg renderer) --- frontend/src/app/main/ui/workspace/shapes.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/shapes.cljs b/frontend/src/app/main/ui/workspace/shapes.cljs index 06f3731c5e..6ce2ffe3b7 100644 --- a/frontend/src/app/main/ui/workspace/shapes.cljs +++ b/frontend/src/app/main/ui/workspace/shapes.cljs @@ -87,7 +87,7 @@ (for [shape shapes] (let [thumbnail? (and (not disable-thumbnails) - (contains? active-frames (dm/get-prop shape :id)))] + (not (contains? active-frames (dm/get-prop shape :id))))] [:g.ws-shape-wrapper {:key (dm/str (dm/get-prop shape :id))} (if ^boolean (cfh/frame-shape? shape) [:& root-frame-wrapper From 857aa4175c0c6ac8e1ea2680a03bd86851058dac Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 20 May 2026 17:38:16 +0200 Subject: [PATCH 13/53] :bug: Fix Numeric inputs rejects values with leading whitespaces --- .../playwright/ui/specs/numeric-input.spec.js | 80 +++++++++++++++++++ .../main/ui/ds/controls/numeric_input.cljs | 58 +++++++------- 2 files changed, 110 insertions(+), 28 deletions(-) create mode 100644 frontend/playwright/ui/specs/numeric-input.spec.js diff --git a/frontend/playwright/ui/specs/numeric-input.spec.js b/frontend/playwright/ui/specs/numeric-input.spec.js new file mode 100644 index 0000000000..11faa57b4d --- /dev/null +++ b/frontend/playwright/ui/specs/numeric-input.spec.js @@ -0,0 +1,80 @@ +import { test, expect } from "@playwright/test"; +import { WasmWorkspacePage } from "../pages/WasmWorkspacePage"; + +test.beforeEach(async ({ page }) => { + await WasmWorkspacePage.init(page); + await WasmWorkspacePage.mockConfigFlags(page, ["enable-feature-token-input"]); +}); + +test("BUG 14226: Numeric inputs in the design panel reject values with leading whitespace", async ({ + page, +}) => { + const workspacePage = new WasmWorkspacePage(page); + await workspacePage.setupEmptyFile(page); + await workspacePage.mockRPC( + /get\-file\?/, + "workspace/get-file-copy-paste.json", + ); + await workspacePage.mockRPC( + "get-file-fragment?file-id=*&fragment-id=*", + "workspace/get-file-copy-paste-fragment.json", + ); + + await workspacePage.goToWorkspace({ + fileId: "870f9f10-87b5-8137-8005-934804124660", + pageId: "870f9f10-87b5-8137-8005-934804124661", + }); + + // Select first shape + await page.getByTestId("layer-item").getByRole("button").first().click(); + await workspacePage.layers.getByTestId("layer-row").nth(0).click(); + + // Check if measures section is visible + const measuresSection = workspacePage.rightSidebar.getByRole("region", { + name: "shape-measures-section", + }); + await expect(measuresSection).toBeVisible(); + + // Width + const widthInput = measuresSection.getByRole("textbox", { + name: "Width", + exact: true, + }); + await expect(widthInput).toHaveValue("360"); + + await widthInput.fill("100"); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill(" 100"); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill(" 100 "); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill("100 "); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill("98+2"); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill("98 + 2"); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill(" 98 + 2 "); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill(" 98+2 "); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); + + await widthInput.fill(" asdasdasdasd "); + await widthInput.press("Enter"); + await expect(widthInput).toHaveValue("100"); +}); diff --git a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs index 8a20573119..aed2b769d4 100644 --- a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs +++ b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs @@ -291,33 +291,35 @@ (mf/use-fn (mf/deps on-change update-input value nillable min max) (fn [raw-value] - (if-let [parsed (parse-value raw-value (mf/ref-val last-value*) min max nillable)] - (when-not (= parsed (mf/ref-val last-value*)) - (mf/set-ref-val! last-value* parsed) - (reset! token-applied-name* nil) - (when (fn? on-change) - (on-change parsed)) - - (mf/set-ref-val! raw-value* (fmt/format-number parsed)) - (update-input (fmt/format-number parsed))) - - (if (and nillable (empty? raw-value)) + (let [raw-value (str/trim (str raw-value))] + (if-let [parsed (parse-value raw-value (mf/ref-val last-value*) min max nillable)] (do - (mf/set-ref-val! last-value* nil) - (mf/set-ref-val! raw-value* "") - (reset! token-applied-name* nil) - (update-input "") - (when (fn? on-change) - (on-change nil))) + (when-not (= parsed (mf/ref-val last-value*)) + (mf/set-ref-val! last-value* parsed) + (reset! token-applied-name* nil) + (when (fn? on-change) + (on-change parsed))) - (let [fallback-value (or (mf/ref-val last-value*) default)] - (mf/set-ref-val! raw-value* fallback-value) - (mf/set-ref-val! last-value* fallback-value) - (reset! token-applied-name* nil) - (update-input (fmt/format-number fallback-value)) + (mf/set-ref-val! raw-value* (fmt/format-number parsed)) + (update-input (fmt/format-number parsed))) - (when (and (fn? on-change) (not= fallback-value (str value))) - (on-change fallback-value))))))) + (if (and nillable (empty? raw-value)) + (do + (mf/set-ref-val! last-value* nil) + (mf/set-ref-val! raw-value* "") + (reset! token-applied-name* nil) + (update-input "") + (when (fn? on-change) + (on-change nil))) + + (let [fallback-value (or (mf/ref-val last-value*) default)] + (mf/set-ref-val! raw-value* fallback-value) + (mf/set-ref-val! last-value* fallback-value) + (reset! token-applied-name* nil) + (update-input (fmt/format-number fallback-value)) + + (when (and (fn? on-change) (not= fallback-value (str value))) + (on-change fallback-value)))))))) apply-token (mf/use-fn @@ -466,7 +468,7 @@ (dom/prevent-default event) (handle-focus-change options focused-id* new-index (mf/ref-val nodes-ref))) - (let [parsed (parse-value (mf/ref-val raw-value*) (mf/ref-val last-value*) min max nillable) + (let [parsed (parse-value (str/trim (mf/ref-val raw-value*)) (mf/ref-val last-value*) min max nillable) current-value (or parsed default) new-val (increment current-value step min max)] (dom/prevent-default event) @@ -479,7 +481,7 @@ (dom/prevent-default event) (handle-focus-change options focused-id* new-index (mf/ref-val nodes-ref))) - (let [parsed (parse-value (mf/ref-val raw-value*) (mf/ref-val last-value*) min max nillable) + (let [parsed (parse-value (str/trim (mf/ref-val raw-value*)) (mf/ref-val last-value*) min max nillable) current-value (or parsed default) new-val (decrement current-value step min max)] (dom/prevent-default event) @@ -508,7 +510,7 @@ (let [inc? (->> (dom/get-delta-position event) :y (neg?)) - parsed (parse-value (mf/ref-val raw-value*) (mf/ref-val last-value*) min max nillable) + parsed (parse-value (str/trim (mf/ref-val raw-value*)) (mf/ref-val last-value*) min max nillable) current-value (or parsed default) new-val (if inc? (increment current-value step min max) @@ -527,7 +529,7 @@ has-token (some? (deref token-applied-name*))] (when-not (or is-focused has-token) (let [client-x (.-clientX event) - parsed (parse-value (mf/ref-val raw-value*) (mf/ref-val last-value*) min max nillable) + parsed (parse-value (str/trim (mf/ref-val raw-value*)) (mf/ref-val last-value*) min max nillable) start-val (or parsed default 0)] (mf/set-ref-val! drag-state* :maybe-dragging) (mf/set-ref-val! drag-start-x* client-x) From 2ad85db016b341a97672c504b0188071429da44e Mon Sep 17 00:00:00 2001 From: Francis Santiago Date: Tue, 19 May 2026 13:27:41 +0200 Subject: [PATCH 14/53] :whale: Fix frontend startup on hosts without IPv6 support Signed-off-by: Francis Santiago --- docker/images/docker-compose.yaml | 3 ++- docker/images/files/nginx-entrypoint.sh | 6 +++++- docker/images/files/nginx.conf.template | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docker/images/docker-compose.yaml b/docker/images/docker-compose.yaml index 25d419a354..63f7a8cbbc 100644 --- a/docker/images/docker-compose.yaml +++ b/docker/images/docker-compose.yaml @@ -106,7 +106,8 @@ services: environment: << : [*penpot-flags, *penpot-http-body-size, *penpot-public-uri] - + # Set to "true" on hosts where IPv6 is disabled at kernel boot level. + # PENPOT_DISABLE_IPV6_LISTEN: "true" penpot-backend: image: "penpotapp/backend:${PENPOT_VERSION:-2.15}" restart: always diff --git a/docker/images/files/nginx-entrypoint.sh b/docker/images/files/nginx-entrypoint.sh index e791ac64f0..2d4b5543de 100644 --- a/docker/images/files/nginx-entrypoint.sh +++ b/docker/images/files/nginx-entrypoint.sh @@ -37,7 +37,11 @@ export PENPOT_NITRATE_URI=${PENPOT_NITRATE_URI:-http://penpot-nitrate:3000} export PENPOT_MCP_URI=${PENPOT_MCP_URI:-http://penpot-mcp:4401} export PENPOT_MCP_URI_WS=${PENPOT_MCP_URI_WS:-http://penpot-mcp:4402} export PENPOT_HTTP_SERVER_MAX_BODY_SIZE=${PENPOT_HTTP_SERVER_MAX_BODY_SIZE:-367001600} # Default to 350MiB -envsubst "\$PENPOT_BACKEND_URI,\$PENPOT_EXPORTER_URI,\$PENPOT_NITRATE_URI,\$PENPOT_MCP_URI,\$PENPOT_MCP_URI_WS,\$PENPOT_HTTP_SERVER_MAX_BODY_SIZE" \ +export PENPOT_IPV6_LISTEN_DIRECTIVE=${PENPOT_IPV6_LISTEN_DIRECTIVE:-"listen [::]:8080 default_server;"} +if [ "${PENPOT_DISABLE_IPV6_LISTEN}" = "true" ]; then + export PENPOT_IPV6_LISTEN_DIRECTIVE="" +fi +envsubst "\$PENPOT_BACKEND_URI,\$PENPOT_EXPORTER_URI,\$PENPOT_NITRATE_URI,\$PENPOT_MCP_URI,\$PENPOT_MCP_URI_WS,\$PENPOT_HTTP_SERVER_MAX_BODY_SIZE,\$PENPOT_IPV6_LISTEN_DIRECTIVE" \ < /tmp/nginx.conf.template > /etc/nginx/nginx.conf PENPOT_DEFAULT_INTERNAL_RESOLVER="$(awk 'BEGIN{ORS=" "} $1=="nameserver" { sub(/%.*$/,"",$2); print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf)" diff --git a/docker/images/files/nginx.conf.template b/docker/images/files/nginx.conf.template index c182856e6b..6efcbc47f3 100644 --- a/docker/images/files/nginx.conf.template +++ b/docker/images/files/nginx.conf.template @@ -73,7 +73,7 @@ http { server { listen 8080 default_server; - listen [::]:8080 default_server; + ${PENPOT_IPV6_LISTEN_DIRECTIVE} server_name _; client_max_body_size $PENPOT_HTTP_SERVER_MAX_BODY_SIZE; From d7a50735bab91840536c7f9cd3c81ed6fba627a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 21 May 2026 09:14:45 +0200 Subject: [PATCH 15/53] :bug: Fix page and delete page icons in the sidebar * :bug: Fix page delete icon not disappearing on selected page * :bug: Fix page icon being clipped on its right side --- .../main/ui/workspace/sidebar/sitemap.cljs | 1 + .../main/ui/workspace/sidebar/sitemap.scss | 30 ++++--------------- 2 files changed, 7 insertions(+), 24 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs index 88d9332ef1..d961b453db 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs @@ -224,6 +224,7 @@ :aria-label (tr "modals.delete-page.title") :on-click on-delete :icon-size "s" + :class (stl/css :page-delete-button) :icon-class (stl/css :page-delete-button-icon) :icon i/delete}])]])])]]))) diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss index b642d89450..e688ee1b7d 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss @@ -55,8 +55,12 @@ margin-bottom: deprecated.$s-12; } +.page-delete-button { + --delete-button-display: none; +} + .page-delete-button-icon { - color: transparent; + display: var(--delete-button-display); } .page-element { @@ -97,8 +101,6 @@ .page-icon { @include deprecated.flex-center; - height: deprecated.$s-32; - width: deprecated.$s-24; padding: 0 deprecated.$s-4 0 deprecated.$s-8; } @@ -136,12 +138,6 @@ color: var(--layer-row-foreground-color-drag); background-color: var(--layer-row-background-color-drag); - .page-actions button { - svg { - stroke: var(--layer-row-foreground-color-drag); - } - } - .page-icon svg { stroke: var(--layer-row-foreground-color-drag); } @@ -156,12 +152,6 @@ box-shadow: deprecated.$s-16 deprecated.$s-0 deprecated.$s-0 deprecated.$s-0 var(--layer-row-background-color-selected); - .page-actions button { - svg { - stroke: var(--layer-row-foreground-color-selected); - } - } - .page-icon svg { stroke: var(--layer-row-foreground-color-selected); } @@ -179,9 +169,7 @@ .page-actions button { opacity: deprecated.$op-10; - svg { - stroke: var(--layer-row-foreground-color-hover); - } + --delete-button-display: initial; } .page-icon svg { @@ -218,12 +206,6 @@ background-color: var(--layer-row-background-color-hidden); opacity: deprecated.$op-7; - .page-actions button { - svg { - stroke: var(--layer-row-foreground-color-hidden); - } - } - .page-icon svg { stroke: var(--layer-row-foreground-color-hidden); } From df0a58af93ad090365fd445aa091b5f69da3f77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Torr=C3=B3?= Date: Thu, 21 May 2026 09:26:53 +0200 Subject: [PATCH 16/53] :bug: Fix team members request loop on dashboard --- frontend/src/app/main/ui/dashboard/team.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/team.cljs b/frontend/src/app/main/ui/dashboard/team.cljs index 3629ee7658..bdaca1c549 100644 --- a/frontend/src/app/main/ui/dashboard/team.cljs +++ b/frontend/src/app/main/ui/dashboard/team.cljs @@ -540,14 +540,14 @@ (mf/defc team-members-page* [{:keys [team profile]}] - (mf/with-effect [team] + (mf/with-effect [(:id team)] (dom/set-html-title (tr "title.team-members" (if (:is-default team) (tr "dashboard.your-penpot") (:name team))))) - (mf/with-effect [team] + (mf/with-effect [(:id team)] (st/emit! (dtm/fetch-members))) [:* @@ -1069,7 +1069,7 @@ (tr "dashboard.your-penpot") (:name team))))) - (mf/with-effect [(:id team) (:members team)] + (mf/with-effect [(:id team)] (st/emit! (dtm/fetch-invitations))) [:* From c0e7bfae007d00179e9fe92d897ead97f0a6381a Mon Sep 17 00:00:00 2001 From: Alonso Torres Date: Thu, 21 May 2026 11:02:47 +0200 Subject: [PATCH 17/53] :bug: Fix problem with shift and alt in numeric inputs --- .../src/app/main/ui/ds/controls/numeric_input.cljs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs index aed2b769d4..464fb2edf4 100644 --- a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs +++ b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs @@ -470,7 +470,11 @@ (let [parsed (parse-value (str/trim (mf/ref-val raw-value*)) (mf/ref-val last-value*) min max nillable) current-value (or parsed default) - new-val (increment current-value step min max)] + eff-step (cond + (kbd/shift? event) (* step 10) + (kbd/alt? event) (* step 0.1) + :else step) + new-val (increment current-value eff-step min max)] (dom/prevent-default event) (update-input (fmt/format-number new-val)) (apply-value (dm/str new-val)))) @@ -483,7 +487,11 @@ (let [parsed (parse-value (str/trim (mf/ref-val raw-value*)) (mf/ref-val last-value*) min max nillable) current-value (or parsed default) - new-val (decrement current-value step min max)] + eff-step (cond + (kbd/shift? event) (* step 10) + (kbd/alt? event) (* step 0.1) + :else step) + new-val (decrement current-value eff-step min max)] (dom/prevent-default event) (update-input (fmt/format-number new-val)) (apply-value (dm/str new-val)))))))) From 3512a57df7b9a550965d617d5b7761352fd6369d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 21 May 2026 11:18:13 +0200 Subject: [PATCH 18/53] :bug: Fix referential integrity data in old files (#9771) --- .../src/app/common/files/comp_processors.cljc | 18 +++++ common/src/app/common/files/migrations.cljc | 16 +++- .../files/comp_processors_test.cljc | 78 +++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/files/comp_processors.cljc b/common/src/app/common/files/comp_processors.cljc index 80e782e7cc..b757427ae6 100644 --- a/common/src/app/common/files/comp_processors.cljc +++ b/common/src/app/common/files/comp_processors.cljc @@ -38,6 +38,24 @@ (dissoc component :objects)) component))))) +(defn normalize-component-root + "Some old files have shapes with an explicit :component-root false. This is semantically + equivalent to the attribute being absent (instance-root? only treats true as root), but + breaks the subcopy-head? predicate, which expects nil. Remove the explicit false so the + downstream fixers can recognize these shapes as nested copy heads." + [file-data] + (ctf/update-all-shapes + file-data + (fn [shape] + (if (false? (:component-root shape)) + (do + (log/warn :msg "Normalizing :component-root false on shape" + :shape-id (:id shape) + :shape-name (:name shape) + :file-id (:id file-data)) + {:result :update :updated-shape (dissoc shape :component-root)}) + {:result :keep})))) + (defn fix-missing-swap-slots "Locate shapes that have been swapped (i.e. their shape-ref does not point to the near match) but they don't have a swap slot. In this case, add one pointing to the near match." diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index 5721910890..d4d848e3cf 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -1820,6 +1820,19 @@ (update :pages-index d/update-vals update-container) (d/update-when :components d/update-vals update-container)))) +;; Re-run the 0019 and 0020 fixers after normalizing :component-root. +;; Migrations 0019 and 0020 missed shapes with an explicit :component-root +;; false because subcopy-head? expects nil. Normalize first, then re-run. +(defmethod migrate-data "0022-normalize-component-root-and-resync" + [data _] + (let [libraries (if (:libs data) + (deref (:libs data)) + {})] + (-> data + (cfcp/normalize-component-root) + (cfcp/fix-missing-swap-slots libraries) + (cfcp/sync-component-id-with-ref-shape libraries)))) + (def available-migrations (into (d/ordered-set) ["legacy-2" @@ -1898,4 +1911,5 @@ "0018-remove-unneeded-objects-from-components" "0019-fix-missing-swap-slots" "0020-sync-component-id-with-near-main" - "0021-fix-shape-svg-attrs"])) + "0021-fix-shape-svg-attrs" + "0022-normalize-component-root-and-resync"])) diff --git a/common/test/common_tests/files/comp_processors_test.cljc b/common/test/common_tests/files/comp_processors_test.cljc index c1cabbbb72..412986ede4 100644 --- a/common/test/common_tests/files/comp_processors_test.cljc +++ b/common/test/common_tests/files/comp_processors_test.cljc @@ -114,6 +114,84 @@ (t/is (= expected-diff diff))))) +(t/deftest test-normalize-component-root + + (t/testing "nil file should return nil" + (let [file nil + file' (ctf/update-file-data file cfcp/normalize-component-root)] + (t/is (nil? file')))) + + (t/testing "empty file should not need any action" + (let [file (thf/sample-file :file1) + file' (ctf/update-file-data file cfcp/normalize-component-root)] + (t/is (empty? (d/map-diff file file'))))) + + (t/testing "shape with :component-root true should not be modified" + (let [file + (-> (thf/sample-file :file1) + (tho/add-simple-component :component1 :main1-root :main1-child) + (thc/instantiate-component :component1 :copy1-root)) + + file' (ctf/update-file-data file cfcp/normalize-component-root)] + + (t/is (empty? (d/map-diff file file'))))) + + (t/testing "shape with :component-root false should have it removed" + (let [file + (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 :main1-root :main1-child + :component2 :main2-root :nested-head + :copy2-root) + (ths/update-shape :nested-head :component-root false)) + + file' (ctf/update-file-data file cfcp/normalize-component-root) + + shape' (ths/get-shape file' :nested-head)] + + (t/is (not (contains? shape' :component-root)))))) + +(t/deftest test-migration-0022-fixes-component-root-false-mismatch + + (t/testing "a nested copy with :component-root false and a stale :component-id is fixed by the full migration sequence" + (let [file + ;; Reproduce the legacy corruption: a nested copy head has + ;; :component-root false (instead of absent) AND a stale + ;; component-id. Migrations 0019/0020 alone don't catch it + ;; because subcopy-head? expects nil. After normalize-component-root, + ;; sync-component-id-with-ref-shape can repair it. + (-> (thf/sample-file :file1) + (tho/add-nested-component :component1 :main1-root :main1-child + :component2 :main2-root :nested-head) + (thc/instantiate-component :component2 :copy2-root :children-labels [:copy2-nested-head]) + (ths/update-shape :copy2-nested-head :component-root false) + (ths/update-shape :copy2-nested-head :component-id (thi/new-id! :wrong-id))) + + ;; Run the old sequence (0019/0020 without normalization): the bad shape is skipped. + old-sequence + (-> file + (ctf/update-file-data #(cfcp/fix-missing-swap-slots % {})) + (ctf/update-file-data #(cfcp/sync-component-id-with-ref-shape % {}))) + + old-shape (ths/get-shape old-sequence :copy2-nested-head) + + ;; Run the new sequence (0022): normalize first, then 0019/0020 logic. + new-sequence + (-> file + (ctf/update-file-data cfcp/normalize-component-root) + (ctf/update-file-data #(cfcp/fix-missing-swap-slots % {})) + (ctf/update-file-data #(cfcp/sync-component-id-with-ref-shape % {}))) + + new-shape (ths/get-shape new-sequence :copy2-nested-head)] + + ;; Confirm the old sequence fails to repair (this guards against a future + ;; subcopy-head? change accidentally fixing it and masking the regression). + (t/is (= false (:component-root old-shape))) + (t/is (= (thi/id :wrong-id) (:component-id old-shape))) + + ;; Confirm the new sequence repairs both the explicit false and the bad ref. + (t/is (not (contains? new-shape :component-root))) + (t/is (= (thi/id :component1) (:component-id new-shape)))))) + (t/deftest test-fix-missing-swap-slots (t/testing "nil file should return nil" From 3cfd1e1a48729745a667e1c1d5dbb4add4a16754 Mon Sep 17 00:00:00 2001 From: Alonso Torres Date: Thu, 21 May 2026 11:34:45 +0200 Subject: [PATCH 19/53] :bug: Fix problem with request file access --- frontend/src/app/main/ui/static.cljs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/static.cljs b/frontend/src/app/main/ui/static.cljs index 49dfd92f20..1b4b0e16b0 100644 --- a/frontend/src/app/main/ui/static.cljs +++ b/frontend/src/app/main/ui/static.cljs @@ -229,8 +229,7 @@ (mf/deps profile) (fn [] (let [team-id (:default-team-id profile)] - (st/emit! (rt/assign-exception nil) - (dcm/go-to-dashboard-recent :team-id team-id))))) + (st/emit! (dcm/go-to-dashboard-recent :team-id team-id))))) on-success (mf/use-fn From f3053fc8440fb926cd040a09209f23945fec0d8e Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 21 May 2026 12:09:43 +0200 Subject: [PATCH 20/53] :bug: Fix 2.15 release notes crash on invalid slide index (#9805) --- frontend/src/app/main/ui/releases/v2_15.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/releases/v2_15.cljs b/frontend/src/app/main/ui/releases/v2_15.cljs index 8c2f61580f..5880a63de6 100644 --- a/frontend/src/app/main/ui/releases/v2_15.cljs +++ b/frontend/src/app/main/ui/releases/v2_15.cljs @@ -77,7 +77,7 @@ [:& c/navigation-bullets {:slide slide :navigate navigate - :total 4}] + :total 3}] [:button {:on-click next :class (stl/css :next-btn)} "Continue"]]]]]] @@ -118,7 +118,7 @@ [:& c/navigation-bullets {:slide slide :navigate navigate - :total 4}] + :total 3}] [:button {:on-click next :class (stl/css :next-btn)} "Continue"]]]]]] From e2ed6a488d6c36749847b8b74129795b2a606a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?andr=C3=A9s=20gonz=C3=A1lez?= Date: Thu, 21 May 2026 12:10:36 +0200 Subject: [PATCH 21/53] :sparkles: Polish workspace find and replace UX (#9687) * :sparkles: Polish workspace find and replace UX Co-authored-by: Cursor * :sparkles: Add toggle mode button This button toggles between search and search and replace modes * :recycle: Refactor and CSS cleanup --------- Co-authored-by: Cursor Co-authored-by: Luis de Dios --- frontend/src/app/main/data/workspace.cljs | 47 +- .../app/main/data/workspace/highlight.cljs | 26 + .../src/app/main/data/workspace/texts.cljs | 30 +- .../app/main/ui/components/search_bar.cljs | 9 +- .../src/app/main/ui/workspace/main_menu.cljs | 4 +- .../main/ui/workspace/sidebar/layer_item.cljs | 5 +- .../app/main/ui/workspace/sidebar/layers.cljs | 549 +++++++++++------- .../app/main/ui/workspace/sidebar/layers.scss | 431 +++++--------- .../main/ui/workspace/sidebar/shortcuts.cljs | 3 + frontend/translations/en.po | 21 +- frontend/translations/es.po | 11 + 11 files changed, 618 insertions(+), 518 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index d61ed1fded..98d66dc593 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -1493,18 +1493,47 @@ (update [_ state] (assoc-in state [:workspace-global :clipboard-style] style)))) -(defn open-layers-search +(defn- layers-search-config [mode] - (ptk/reify ::open-layers-search - ptk/UpdateEvent - (update [_ state] - (assoc-in state [:workspace-local :layers-panel-search] mode)))) + {:open? true + :mode mode + :scope (if (= mode :find-and-replace) :canvas :layers) + :find-replace-mode? (= mode :find-and-replace)}) -(def clear-layers-search - (ptk/reify ::clear-layers-search +(defn- layers-search-active? + [current target] + (and (:open? current false) + (= (:scope current) (:scope target)) + (= (:find-replace-mode? current) (:find-replace-mode? target)))) + +(defn open-layers-search + ([mode] (open-layers-search mode nil)) + ([mode options] + (let [force? (boolean (:force? options))] + (ptk/reify ::open-layers-search + ptk/UpdateEvent + (update [_ state] + (let [target (layers-search-config mode) + current (get-in state [:workspace-local :layers-search])] + (if (and (not force?) + (layers-search-active? current target)) + (update state :workspace-local dissoc :layers-search) + (assoc-in state [:workspace-local :layers-search] target)))))))) + +(def close-layers-search + (ptk/reify ::close-layers-search ptk/UpdateEvent (update [_ state] - (update state :workspace-local dissoc :layers-panel-search)))) + (update state :workspace-local dissoc :layers-search)))) + +(defn update-layers-search-scope + [scope] + (ptk/reify ::update-layers-search-scope + ptk/UpdateEvent + (update [_ state] + (if (get-in state [:workspace-local :layers-search]) + (assoc-in state [:workspace-local :layers-search :scope] scope) + state)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Exports @@ -1565,6 +1594,8 @@ ;; Highlight (dm/export dwh/highlight-shape) (dm/export dwh/dehighlight-shape) +(dm/export dwh/set-search-match-highlight) +(dm/export dwh/clear-search-match-highlight) ;; Shape flags (dm/export dwsh/update-shape-flags) diff --git a/frontend/src/app/main/data/workspace/highlight.cljs b/frontend/src/app/main/data/workspace/highlight.cljs index 6f91445bae..4cb252dffd 100644 --- a/frontend/src/app/main/data/workspace/highlight.cljs +++ b/frontend/src/app/main/data/workspace/highlight.cljs @@ -27,3 +27,29 @@ ptk/UpdateEvent (update [_ state] (update-in state [:workspace-local :highlighted] disj id)))) + +(defn set-search-match-highlight + "Highlight the active find/replace match on canvas and sidebar." + [current-id match-ids] + (dm/assert! (uuid? current-id)) + (let [match-ids (set match-ids)] + (ptk/reify ::set-search-match-highlight + ptk/UpdateEvent + (update [_ state] + (let [highlighted (-> (get-in state [:workspace-local :highlighted] #{}) + (set/difference match-ids) + (conj current-id))] + (-> state + (assoc-in [:workspace-local :search-match-highlight] current-id) + (assoc-in [:workspace-local :highlighted] highlighted))))))) + +(defn clear-search-match-highlight + [match-ids] + (let [match-ids (set match-ids)] + (ptk/reify ::clear-search-match-highlight + ptk/UpdateEvent + (update [_ state] + (-> state + (update-in [:workspace-local :highlighted] + #(set/difference (or % #{}) match-ids)) + (update :workspace-local dissoc :search-match-highlight)))))) diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index d492a43b4b..6d21a3d129 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -1206,18 +1206,24 @@ [ids search replacement] (ptk/reify ::replace-text-in-shapes ptk/WatchEvent - (watch [_ _ _] - (let [undo-group (uuid/next)] - (rx/of - (dwsh/update-shapes - ids - (fn [shape] - (if (and (= :text (:type shape)) (some? (:content shape))) - (let [new-content (txt/replace-text-in-content (:content shape) search replacement) - new-name (txt/generate-shape-name (txt/content->text new-content))] - (-> shape (assoc :content new-content) (assoc :name new-name))) - shape)) - {:attrs #{:content :name} :undo-group undo-group})))))) + (watch [_ state _] + (let [undo-group (uuid/next) + update-event + (dwsh/update-shapes + ids + (fn [shape] + (if (and (= :text (:type shape)) (some? (:content shape))) + (let [new-content (txt/replace-text-in-content (:content shape) search replacement) + new-name (txt/generate-shape-name (txt/content->text new-content))] + (-> shape (assoc :content new-content) (assoc :name new-name))) + shape)) + {:attrs #{:content :name} :undo-group undo-group})] + (rx/concat + (rx/of update-event) + (if (features/active-feature? state "render-wasm/v1") + (->> (rx/from ids) + (rx/map #(dwwt/resize-wasm-text-debounce % {:undo-group undo-group}))) + (rx/empty))))))) ;; -- Text Editor v3 diff --git a/frontend/src/app/main/ui/components/search_bar.cljs b/frontend/src/app/main/ui/components/search_bar.cljs index bfd50df0ff..90fe0969ac 100644 --- a/frontend/src/app/main/ui/components/search_bar.cljs +++ b/frontend/src/app/main/ui/components/search_bar.cljs @@ -13,7 +13,8 @@ [rumext.v2 :as mf])) (mf/defc search-bar* - [{:keys [id class value placeholder icon-id auto-focus on-change on-clear on-submit children]}] + [{:keys [id class value placeholder icon-id auto-focus input-ref + on-change on-clear on-submit on-key-down children]}] (let [handle-change (mf/use-fn (mf/deps on-change) @@ -31,8 +32,11 @@ handle-key-down (mf/use-fn - (mf/deps on-submit) + (mf/deps on-submit on-key-down) (fn [event] + (when (fn? on-key-down) + (on-key-down event)) + (let [enter? (kbd/enter? event) esc? (kbd/esc? event) node (dom/get-target event)] @@ -53,6 +57,7 @@ :size "s" :class (stl/css :icon)}]) [:input {:id id + :ref input-ref :class (stl/css :search-input) :on-change handle-change :value value diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index 7bdf91fb1f..ecd4b186bc 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -474,10 +474,10 @@ #(st/emit! (dw/select-all))) find - (mf/use-fn (fn [] (on-close) (st/emit! (dw/open-layers-search :find)))) + (mf/use-fn (fn [] (on-close) (st/emit! (dw/open-layers-search :find {:force? true})))) find-and-replace - (mf/use-fn (fn [] (on-close) (st/emit! (dw/open-layers-search :find-and-replace)))) + (mf/use-fn (fn [] (on-close) (st/emit! (dw/open-layers-search :find-and-replace {:force? true})))) undo (mf/use-fn diff --git a/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs b/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs index 8ba48062fb..3b768a823b 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs @@ -48,7 +48,10 @@ (let [{:keys [enter leave]} @sidebar-hover-queue enter (set/difference enter leave) - leave (set/difference leave enter)] + leave (set/difference leave enter) + search-match (get-in @st/state [:workspace-local :search-match-highlight]) + leave (cond-> leave + (some? search-match) (disj search-match))] (reset! sidebar-hover-queue {:enter #{} :leave #{}}) (reset! sidebar-hover-pending? false) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index df02e1d0d9..3b67ccc76b 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -19,7 +19,9 @@ [app.main.store :as st] [app.main.ui.components.search-bar :refer [search-bar*]] [app.main.ui.components.title-bar :refer [title-bar*]] + [app.main.ui.ds.buttons.button :refer [button*]] [app.main.ui.ds.buttons.icon-button :refer [icon-button*]] + [app.main.ui.ds.controls.input :refer [input*]] [app.main.ui.ds.foundations.assets.icon :refer [icon*] :as i] [app.main.ui.hooks :as hooks] [app.main.ui.notifications.badge :refer [badge-notification]] @@ -30,6 +32,7 @@ [app.util.keyboard :as kbd] [app.util.rxops :refer [throttle-fn]] [app.util.shape-icon :as usi] + [app.util.timers :as ts] [beicon.v2.core :as rx] [cuerdas.core :as str] [goog.events :as events] @@ -120,30 +123,28 @@ [:> hooks/sortable-container* {} (for [obj shapes] (if (cfh/frame-shape? obj) - [:> frame-wrapper* - {:item obj - :rename-id rename-id - :selected selected - :highlighted highlighted - :index (unchecked-get obj "__$__counter") - :objects objects - :key (dm/str (get obj :id)) - :is-sortable true - :is-filtered is-filtered - :parent-size parent-size - :depth -1}] - [:> layer-item* - {:item obj - :rename-id rename-id - :selected selected - :highlighted highlighted - :index (unchecked-get obj "__$__counter") - :objects objects - :key (dm/str (get obj :id)) - :is-sortable true - :is-filtered is-filtered - :depth -1 - :parent-size parent-size}]))]])) + [:> frame-wrapper* {:item obj + :rename-id rename-id + :selected selected + :highlighted highlighted + :index (unchecked-get obj "__$__counter") + :objects objects + :key (dm/str (get obj :id)) + :is-sortable true + :is-filtered is-filtered + :parent-size parent-size + :depth -1}] + [:> layer-item* {:item obj + :rename-id rename-id + :selected selected + :highlighted highlighted + :index (unchecked-get obj "__$__counter") + :objects objects + :key (dm/str (get obj :id)) + :is-sortable true + :is-filtered is-filtered + :depth -1 + :parent-size parent-size}]))]])) (mf/defc layers-tree-wrapper* {::mf/private true} @@ -175,21 +176,22 @@ {::mf/wrap [mf/memo #(mf/throttle % 300)] ::mf/private true} [{:keys [objects parent-size]}] - (let [selected (use-selected-shapes) - root (get objects uuid/zero)] + (let [selected (use-selected-shapes) + highlighted (mf/deref ref:highlighted-shapes) + root (get objects uuid/zero)] [:ul {:class (stl/css :element-list)} (for [[index id] (d/enumerate (:shapes root))] (when-let [obj (get objects id)] - [:> layer-item* - {:item obj - :selected selected - :index index - :objects objects - :key id - :is-sortable false - :is-filtered true - :depth -1 - :parent-size parent-size}]))])) + [:> layer-item* {:item obj + :selected selected + :highlighted highlighted + :index index + :objects objects + :key id + :is-sortable false + :is-filtered true + :depth -1 + :parent-size parent-size}]))])) (defn calc-reparented-objects [objects] @@ -208,8 +210,8 @@ ;; --- Layers Toolbox -(def ^:private ref:layers-panel-search - (l/derived (l/key :layers-panel-search) refs/workspace-local)) +(def ^:private ref:layers-search + (l/derived (l/key :layers-search) refs/workspace-local)) ;; FIXME: optimize (defn- match-filters? @@ -242,6 +244,21 @@ (false? (:masked-group shape)))) (and (contains? filters :mask) (true? (:masked-group shape)))))))) +(mf/defc radio-button* + {::mf/private true} + [{:keys [name checked text on-change]}] + [:label {:class (stl/css-case :radio-label true + :selected checked)} + [:span {:class (stl/css-case :radio-icon true + :checked checked)}] + [:input {:type "radio" + :name name + :class (stl/css :radio-input) + :checked checked + :on-change on-change}] + [:span {:class (stl/css :radio-text)} + text]]) + (defn use-search [page objects] (let [state* (mf/use-state @@ -254,7 +271,7 @@ :filters #{} :num-items 100 :current-match-idx 0})) - layers-search-request (mf/deref ref:layers-panel-search) + layers-search (mf/deref ref:layers-search) state (deref state*) current-filters (:filters state) current-items (:num-items state) @@ -265,13 +282,18 @@ find-replace-mode? (:find-replace-mode? state) search-scope (:search-scope state) current-match-idx (:current-match-idx state) + search-input-ref (mf/use-ref nil) clear-search-text (mf/use-fn - #(swap! state* assoc :search-text "" :num-items 100 :current-match-idx 0)) + #(swap! state* assoc + :search-text "" + :num-items 100 + :current-match-idx 0)) toggle-filters - (mf/use-fn #(swap! state* update :show-menu not)) + (mf/use-fn + #(swap! state* update :show-menu not)) on-toggle-filters-click (mf/use-fn @@ -280,51 +302,92 @@ (toggle-filters))) hide-menu - (mf/use-fn #(swap! state* assoc :show-menu false)) + (mf/use-fn + #(swap! state* assoc :show-menu false)) on-key-down - (mf/use-fn (fn [event] (when (kbd/esc? event) (hide-menu)))) + (mf/use-fn + (fn [event] + (when (kbd/esc? event) + (hide-menu)))) update-search-text (mf/use-fn - (fn [value _event] - (swap! state* assoc :search-text value :num-items 100 :current-match-idx 0))) + (fn [value] + (swap! state* assoc + :search-text value + :num-items 100 + :current-match-idx 0))) update-replace-text - (mf/use-fn (fn [value _event] (swap! state* assoc :replace-text value))) + (mf/use-fn + (fn [event] + (let [value (dom/get-target-val event)] + (swap! state* assoc :replace-text value)))) - clear-replace-text - (mf/use-fn #(swap! state* assoc :replace-text "")) + f-key? (kbd/is-key-ignore-case? "f") + h-key? (kbd/is-key-ignore-case? "h") + + handle-find-shortcut-keydown + (mf/use-fn + (fn [event] + (when (kbd/mod? event) + (cond + (f-key? event) + (do + (dom/prevent-default event) + (dom/stop-propagation event) + (st/emit! (dw/open-layers-search :find))) + + (h-key? event) + (do + (dom/prevent-default event) + (dom/stop-propagation event) + (st/emit! (dw/open-layers-search :find-and-replace))))))) set-search-scope (mf/use-fn (fn [scope] - (swap! state* assoc :search-scope scope :num-items 100 :current-match-idx 0))) + (swap! state* assoc + :search-scope scope + :num-items 100 + :current-match-idx 0) + (st/emit! (dw/update-layers-search-scope scope)))) + + toggle-mode + (mf/use-fn + (mf/deps find-replace-mode?) + (fn [] + (let [mode (if find-replace-mode? :find :find-and-replace)] + (st/emit! (dw/open-layers-search mode {:force? true}))))) toggle-search (mf/use-fn + (mf/deps show-search?) (fn [event] (let [node (dom/get-current-target event)] (dom/blur! node) - (swap! state* (fn [state] - (-> state - (assoc :search-text "" :replace-text "" :filters #{}) - (assoc :show-menu false :find-replace-mode? false) - (assoc :search-scope :layers :num-items 100 :current-match-idx 0) - (update :show-search not))))))) + (if show-search? + (st/emit! dw/close-layers-search) + (st/emit! (dw/open-layers-search :find {:force? true})))))) remove-filter (mf/use-fn (fn [event] - (let [fkey (-> (dom/get-current-target event) (dom/get-data "filter") (keyword))] + (let [fkey (-> (dom/get-current-target event) + (dom/get-data "filter") + (keyword))] (swap! state* (fn [state] - (-> state (update :filters disj fkey) (assoc :num-items 100))))))) + (-> state + (update :filters disj fkey) + (assoc :num-items 100))))))) add-filter (mf/use-fn (fn [event] (dom/stop-propagation event) - (let [key (-> (dom/get-current-target event) (dom/get-data "filter") (keyword))] + (let [key (-> (dom/get-current-target event) + (dom/get-data "filter") (keyword))] (swap! state* (fn [state] (-> state (update :filters conj key) @@ -374,7 +437,8 @@ (fn [_] (when (pos? text-match-count) (swap! state* update :current-match-idx - (fn [idx] (mod (inc idx) text-match-count)))))) + (fn [idx] + (mod (inc idx) text-match-count)))))) navigate-prev (mf/use-fn @@ -382,7 +446,8 @@ (fn [_] (when (pos? text-match-count) (swap! state* update :current-match-idx - (fn [idx] (mod (+ (dec idx) text-match-count) text-match-count)))))) + (fn [idx] + (mod (+ (dec idx) text-match-count) text-match-count)))))) handle-replace (mf/use-fn @@ -403,6 +468,24 @@ (st/emit! (dwt/replace-text-in-shapes text-match-ids current-search replace-text)) (st/emit! (dwt/replace-layer-names-in-shapes text-match-ids current-search replace-text)))))) + on-replace-keydown + (mf/use-fn + (mf/deps handle-replace) + (fn [event] + (when (or (kbd/enter? event) (kbd/space? event)) + (dom/prevent-default event) + (dom/stop-propagation event) + (handle-replace event)))) + + on-replace-all-keydown + (mf/use-fn + (mf/deps handle-replace-all) + (fn [event] + (when (or (kbd/enter? event) (kbd/space? event)) + (dom/prevent-default event) + (dom/stop-propagation event) + (handle-replace-all event)))) + filtered-objects (mf/with-memo [active? filtered-objects-all current-items] (when active? @@ -424,201 +507,242 @@ (events/unlistenByKey key1) (events/unlistenByKey key2)))) - (mf/with-effect [layers-search-request] - (when (some? layers-search-request) - (let [replace-mode? (= layers-search-request :find-and-replace)] + (mf/with-effect [layers-search] + (if-let [{:keys [open? find-replace-mode? scope]} layers-search] + (when open? (swap! state* (fn [s] - (-> s - (assoc :show-search true :find-replace-mode? replace-mode?) - (assoc :search-scope (if replace-mode? :canvas :layers)) - (assoc :search-text "" :replace-text "" :current-match-idx 0))))) - (st/emit! dw/clear-layers-search))) + (let [mode-changed? (not= (:find-replace-mode? s) find-replace-mode?) + opening? (not (:show-search s))] + (-> s + (assoc :show-search true + :find-replace-mode? find-replace-mode? + :search-scope scope) + (cond-> (or opening? mode-changed?) + (assoc :search-text "" :replace-text "" :current-match-idx 0))))))) + (swap! state* (fn [state] + (-> state + (assoc :search-text "" + :replace-text "" + :filters #{}) + (assoc :show-menu false + :find-replace-mode? false) + (assoc :search-scope :layers + :num-items 100 + :current-match-idx 0) + (assoc :show-search false)))))) + + (mf/with-effect [(get layers-search :scope)] + (when (and layers-search (:open? layers-search)) + (swap! state* assoc :search-scope (:scope layers-search)))) + + (mf/with-effect [layers-search show-search?] + (when (and layers-search (:open? layers-search) show-search?) + (ts/raf + (fn [] + (when-let [node (mf/ref-val search-input-ref)] + (dom/focus! node)))))) + + (mf/with-effect [find-replace-mode? show-search? safe-match-idx text-match-ids] + (let [match-ids text-match-ids] + (when (and find-replace-mode? show-search? (seq match-ids)) + (let [current-id (nth match-ids safe-match-idx)] + (st/emit! (dw/set-search-match-highlight current-id match-ids)))) + (fn [] + (when (seq match-ids) + (st/emit! (dw/clear-search-match-highlight match-ids)))))) [filtered-objects handle-show-more #(mf/html (if show-search? [:* - [:div {:class (stl/css :tool-window-bar :search)} - [:> search-bar* {:on-change update-search-text + [:div {:class (stl/css :tool-window-bar)} + [:> search-bar* {:input-ref search-input-ref + :class (stl/css :search-item) + :on-change update-search-text :value current-search :on-clear clear-search-text + :on-key-down handle-find-shortcut-keydown :placeholder (tr "workspace.sidebar.layers.search")} - [:button {:on-click on-toggle-filters-click - :class (stl/css-case :filter-button true :opened show-menu? :active active?)} - [:> icon* {:icon-id i/filter}]]] + [:> icon-button* {:variant "secondary" + :class (stl/css :filter-button) + :aria-pressed show-menu? + :aria-label (tr "workspace.sidebar.layers.filter") + :on-click on-toggle-filters-click + :icon i/filter}]] + [:> icon-button* {:variant "ghost" + :aria-pressed find-replace-mode? + :aria-label (tr "workspace.sidebar.layers.search-and-replace") + :on-click toggle-mode + :icon i/menu}] [:> icon-button* {:variant "ghost" :aria-label (tr "labels.close") :on-click toggle-search :icon i/close}]] - [:div {:class (stl/css :search-scope-row)} - [:label {:class (stl/css-case :scope-option true :scope-selected (= :canvas search-scope))} - [:span {:class (stl/css-case :scope-radio true :scope-radio-checked (= :canvas search-scope))}] - [:input {:type "radio" :name "search-scope" :class (stl/css :scope-radio-input) - :checked (= :canvas search-scope) - :on-change (fn [_] (set-search-scope :canvas))}] - [:span {:class (stl/css :scope-label)} - (tr "workspace.sidebar.layers.search-scope-canvas")]] - [:label {:class (stl/css-case :scope-option true :scope-selected (= :layers search-scope))} - [:span {:class (stl/css-case :scope-radio true :scope-radio-checked (= :layers search-scope))}] - [:input {:type "radio" :name "search-scope" :class (stl/css :scope-radio-input) - :checked (= :layers search-scope) - :on-change (fn [_] (set-search-scope :layers))}] - [:span {:class (stl/css :scope-label)} - (tr "workspace.sidebar.layers.search-scope-layers")]]] + [:div {:class (stl/css :replace-wrapper)} + (when ^boolean find-replace-mode? + [:div {:class (stl/css :replace-row)} + [:> input* {:type "text" + :placeholder (tr "workspace.sidebar.layers.replace-placeholder") + :on-key-down handle-find-shortcut-keydown + :on-change update-replace-text}] - (when ^boolean find-replace-mode? - [:* - [:div {:class (stl/css :tool-window-bar :replace-row)} - [:div {:class (stl/css :replace-input-wrapper)} - [:input {:class (stl/css :replace-input) - :value replace-text - :placeholder (tr "workspace.sidebar.layers.replace-placeholder") - :on-change (fn [event] - (update-replace-text (dom/get-target-val event) event))}] - (when (not= "" replace-text) - [:button {:class (stl/css :clear-icon) :on-click clear-replace-text} - [:> icon* {:icon-id i/delete-text :size "s"}]])] (when (d/not-empty? current-search) (if (pos? text-match-count) - [:div {:class (stl/css :match-navigation)} - [:span {:class (stl/css :match-count)} + [:div {:class (stl/css :replace-match-navigation)} + [:span {:class (stl/css :replace-match-count)} (dm/str (inc safe-match-idx) " / " text-match-count)] [:> icon-button* {:variant "ghost" :aria-label (tr "labels.previous") :on-click navigate-prev :icon i/arrow-up}] [:> icon-button* {:variant "ghost" :aria-label (tr "labels.next") :on-click navigate-next :icon i/arrow-down}]] - [:span {:class (stl/css :no-matches)} - (tr "workspace.sidebar.layers.no-matches")]))] + [:div {:class (stl/css :replace-match-count)} + (tr "workspace.sidebar.layers.no-matches")]))]) + + [:div {:class (stl/css :replace-scope-row)} + [:> radio-button* {:name "search-scope" + :checked (= :canvas search-scope) + :text (tr "workspace.sidebar.layers.search-scope-canvas") + :on-change (partial set-search-scope :canvas)}] + [:> radio-button* {:name "search-scope" + :checked (= :layers search-scope) + :text (tr "workspace.sidebar.layers.search-scope-layers") + :on-change (partial set-search-scope :layers)}]] + + (when ^boolean find-replace-mode? [:div {:class (stl/css :replace-actions-row)} - [:button {:class (stl/css :replace-button) - :on-click handle-replace - :disabled (or (zero? text-match-count) (str/empty? current-search))} + [:> button* {:variant "secondary" + :class (stl/css :replace-actions-button) + :on-click handle-replace + :on-key-down on-replace-keydown + :disabled (or (zero? text-match-count) (str/empty? current-search))} (tr "workspace.sidebar.layers.replace")] - [:button {:class (stl/css :replace-button) - :on-click handle-replace-all - :disabled (or (zero? text-match-count) (str/empty? current-search))} - (tr "workspace.sidebar.layers.replace-all")]]]) + [:> button* {:variant "secondary" + :class (stl/css :replace-actions-button) + :on-click handle-replace-all + :on-key-down on-replace-all-keydown + :disabled (or (zero? text-match-count) (str/empty? current-search))} + (tr "workspace.sidebar.layers.replace-all")]]) - [:div {:class (stl/css :active-filters)} - (for [fkey current-filters] - (let [fname (d/name fkey) + [:div {:class (stl/css :active-filters)} + (for [fkey current-filters] + (let [fname (d/name fkey) - name (case fkey - :frame (tr "workspace.sidebar.layers.frames") - :group (tr "workspace.sidebar.layers.groups") - :mask (tr "workspace.sidebar.layers.masks") - :component (tr "workspace.sidebar.layers.components") - :text (tr "workspace.sidebar.layers.texts") - :image (tr "workspace.sidebar.layers.images") - :shape (tr "workspace.sidebar.layers.shapes") - (tr fkey)) - filter-icon (usi/get-shape-icon-by-type fkey)] + name (case fkey + :frame (tr "workspace.sidebar.layers.frames") + :group (tr "workspace.sidebar.layers.groups") + :mask (tr "workspace.sidebar.layers.masks") + :component (tr "workspace.sidebar.layers.components") + :text (tr "workspace.sidebar.layers.texts") + :image (tr "workspace.sidebar.layers.images") + :shape (tr "workspace.sidebar.layers.shapes") + (tr fkey)) + filter-icon (usi/get-shape-icon-by-type fkey)] - [:button {:class (stl/css :layer-filter) - :key fname - :data-filter fname - :on-click remove-filter} - [:> icon* {:icon-id filter-icon :size "s" :class (stl/css :layer-filter-icon)}] - [:span {:class (stl/css :layer-filter-name)} - name] - [:> icon* {:icon-id i/close-small :class (stl/css :layer-filter-close)}]]))] + [:button {:class (stl/css :layer-filter) + :key fname + :data-filter fname + :on-click remove-filter} + [:> icon* {:icon-id filter-icon :size "s" :class (stl/css :layer-filter-icon)}] + [:span {:class (stl/css :layer-filter-name)} + name] + [:> icon* {:icon-id i/close-small :class (stl/css :layer-filter-close)}]]))] - (when ^boolean show-menu? - [:ul {:class (stl/css :filters-container)} - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :frame)) - :data-filter "frame" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/board :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.frames")]] + (when ^boolean show-menu? + [:ul {:class (stl/css :filters-container)} + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :frame)) + :data-filter "frame" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/board :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.frames")]] - (when (contains? current-filters :frame) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] + (when (contains? current-filters :frame) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :group)) - :data-filter "group" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/group :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.groups")]] + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :group)) + :data-filter "group" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/group :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.groups")]] - (when (contains? current-filters :group) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] + (when (contains? current-filters :group) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :mask)) - :data-filter "mask" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/mask :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.masks")]] + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :mask)) + :data-filter "mask" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/mask :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.masks")]] - (when (contains? current-filters :mask) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] + (when (contains? current-filters :mask) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :component)) - :data-filter "component" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/component :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.components")]] + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :component)) + :data-filter "component" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/component :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.components")]] - (when (contains? current-filters :component) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] + (when (contains? current-filters :component) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :text)) - :data-filter "text" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/text :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.texts")]] + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :text)) + :data-filter "text" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/text :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.texts")]] - (when (contains? current-filters :text) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] + (when (contains? current-filters :text) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :image)) - :data-filter "image" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/img :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.images")]] + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :image)) + :data-filter "image" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/img :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.images")]] - (when (contains? current-filters :image) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] + (when (contains? current-filters :image) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])] - [:li {:class (stl/css-case :filter-menu-item true - :selected (contains? current-filters :shape)) - :data-filter "shape" - :on-click add-filter} - [:div {:class (stl/css :filter-menu-item-name-wrapper)} - [:> icon* {:icon-id i/path :size "s" :class (stl/css :filter-menu-item-icon)}] - [:span {:class (stl/css :filter-menu-item-name)} - (tr "workspace.sidebar.layers.shapes")]] + [:li {:class (stl/css-case :filter-menu-item true + :selected (contains? current-filters :shape)) + :data-filter "shape" + :on-click add-filter} + [:div {:class (stl/css :filter-menu-item-name-wrapper)} + [:> icon* {:icon-id i/path :size "s" :class (stl/css :filter-menu-item-icon)}] + [:span {:class (stl/css :filter-menu-item-name)} + (tr "workspace.sidebar.layers.shapes")]] - (when (contains? current-filters :shape) - [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])]])] + (when (contains? current-filters :shape) + [:> icon* {:icon-id i/tick :size "s" :class (stl/css :filter-menu-item-tick)}])]])]] [:div {:class (stl/css :tool-window-bar)} [:> title-bar* {:collapsable false + :class (stl/css :tool-window-bar-title) :title (:name page) :on-btn-click toggle-search :btn-icon "search" :btn-title (tr "labels.search")}]]))])) - (defn- on-scroll [event] (let [children (dom/get-elements-by-class "sticky-children") @@ -699,19 +823,24 @@ (mf/use-fn #(st/emit! (dw/toggle-focus-mode)))] - [:div#layers {:class (stl/css :layers) :data-testid "layer-tree"} + [:div {:id "layers" + :class (stl/css :layers) + :data-testid "layer-tree"} + (if (d/not-empty? focus) [:div {:class (stl/css :tool-window-bar)} [:button {:class (stl/css :focus-title) :on-click toogle-focus-mode} - [:span {:class (stl/css :back-button)} - [:> icon* {:icon-id i/arrow}]] + [:span {:class (stl/css :focus-back-button)} + [:> icon* {:icon-id i/arrow-left}]] [:div {:class (stl/css :focus-name)} (or title (tr "workspace.sidebar.layers"))] [:div {:class (stl/css :focus-mode-tag-wrapper)} - [:& badge-notification {:content (tr "workspace.focus.focus-mode") :size :small :is-focus true}]]]] + [:& badge-notification {:content (tr "workspace.focus.focus-mode") + :size :small + :is-focus true}]]]] (filter-component)) @@ -724,11 +853,11 @@ :key (dm/str page-id) :parent-size size-parent}] [:div {:ref lazy-load-ref}]] + [:div {:on-scroll on-scroll :class (stl/css :tool-window-content) :data-scroll-container true :style {:display (when (some? filtered-objects) "none")}} - [:> layers-tree-wrapper* {:objects filtered-objects :key (dm/str page-id) :is-filtered true diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.scss b/frontend/src/app/main/ui/workspace/sidebar/layers.scss index 048aa08549..babec39c95 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.scss @@ -5,144 +5,100 @@ // Copyright (c) KALEIDOS INC @use "refactor/common-refactor.scss" as deprecated; +@use "ds/borders.scss" as *; +@use "ds/mixins.scss" as *; +@use "ds/sizes.scss" as *; +@use "ds/spacing.scss" as *; +@use "ds/typography.scss" as t; +@use "ds/_sizes.scss" as *; +@use "ds/_utils.scss" as *; + +.element-list { + display: grid; + position: relative; +} .tool-window-bar { display: flex; align-items: center; justify-content: space-between; - height: deprecated.$s-32; - min-height: deprecated.$s-32; - margin: deprecated.$s-8 0 deprecated.$s-4 deprecated.$s-8; - padding-right: deprecated.$s-12; - - &.search { - padding: 0 deprecated.$s-12 0 deprecated.$s-8; - gap: deprecated.$s-4; - - .filter-button { - @include deprecated.flex-center; - @include deprecated.button-style; - - height: deprecated.$s-32; - width: deprecated.$s-32; - margin: 0; - border: deprecated.$s-1 solid var(--color-background-tertiary); - border-radius: deprecated.$br-8 deprecated.$br-2 deprecated.$br-2 deprecated.$br-8; - background-color: var(--color-background-tertiary); - - svg { - height: deprecated.$s-16; - width: deprecated.$s-16; - stroke: var(--icon-foreground); - } - - &:focus { - border: deprecated.$s-1 solid var(--input-border-color-focus); - outline: 0; - background-color: var(--input-background-color-active); - color: var(--input-foreground-color-active); - - svg { - background-color: var(--input-background-color-active); - } - } - - &:hover { - border: deprecated.$s-1 solid var(--input-border-color-hover); - background-color: var(--input-background-color-hover); - - svg { - background-color: var(--input-background-color-hover); - stroke: var(--button-foreground-hover); - } - } - - &.opened { - @extend %button-icon-selected; - } - } - } + gap: var(--sp-xs); + padding: var(--sp-m) var(--sp-m) 0 var(--sp-m); } -.page-name { - @include deprecated.uppercase-title-typography; - - padding: 0 deprecated.$s-12; - color: var(--title-foreground-color); +.tool-window-bar-title { + margin-block-end: var(--sp-s); } -.icon-search { - @extend %button-tertiary; +.tool-window-content { + --calculated-height: calc(#{px2rem(136)} + var(--height, #{$sz-200})); - height: deprecated.$s-32; - width: deprecated.$s-28; - border-radius: deprecated.$br-8; - margin-right: deprecated.$s-8; - padding: 0; + display: flex; + flex-direction: column; + block-size: calc(100vh - var(--calculated-height)); + inline-size: calc(var(--left-sidebar-width) + var(--depth) * var(--layer-indentation-size)); + overflow: auto; + scrollbar-gutter: stable; +} - svg { - @extend %button-icon; - - stroke: var(--icon-foreground); - } +.filter-button { + border-start-end-radius: 0; + border-end-end-radius: 0; } .focus-title { - @include deprecated.button-style; - + border: none; + background: none; + block-size: var(--sp-xxxl); + inline-size: 100%; display: grid; grid-template-columns: auto 1fr auto; align-items: center; - width: 100%; + margin-block-end: var(--sp-s); padding: 0; } -.back-button { - @include deprecated.flex-center; - - height: deprecated.$s-32; - width: deprecated.$s-24; - padding: 0 deprecated.$s-4 0 deprecated.$s-8; - - svg { - @extend %button-icon-small; - - stroke: var(--icon-foreground); - transform: rotate(180deg); - } +.focus-back-button { + display: flex; + align-items: center; + justify-content: center; + block-size: var(--sp-xxxl); + padding-inline-start: var(--sp-s); + color: var(--icon-foreground); } .focus-name { - @include deprecated.text-ellipsis; - @include deprecated.body-small-typography; + @include t.use-typography("body-small"); + @include text-ellipsis; - padding-left: deprecated.$s-4; + padding-inline-end: var(--sp-xs); color: var(--title-foreground-color); } .focus-mode-tag-wrapper { - @include deprecated.flex-center; - - height: 100%; - margin-right: deprecated.$s-12; + display: flex; + align-items: center; + justify-content: center; + block-size: 100%; + margin-inline-end: var(--sp-m); } .active-filters { - @include deprecated.flex-row; - + display: flex; + align-items: center; + gap: var(--sp-xs); flex-wrap: wrap; - margin: 0 deprecated.$s-12; + margin: 0 var(--sp-m); } .layer-filter { @extend %button-tag; - gap: deprecated.$s-6; - height: deprecated.$s-24; - margin: deprecated.$s-2 0; - border-radius: deprecated.$br-6; + gap: px2rem(6); + block-size: var(--sp-xxl); + margin: var(--sp-xxs) 0; + border-radius: $br-6; background-color: var(--pill-background-color); - cursor: pointer; } .layer-filter-icon, @@ -151,9 +107,11 @@ } .layer-filter-name { - @include deprecated.flex-center; - @include deprecated.body-small-typography; + @include t.use-typography("body-small"); + display: flex; + align-items: center; + justify-content: center; color: var(--pill-foreground-color); } @@ -161,34 +119,117 @@ position: relative; } +.replace-wrapper { + display: flex; + flex-direction: column; + padding: var(--sp-xs) var(--sp-m); + gap: var(--sp-xs); +} + +.replace-row { + display: flex; + flex-direction: row; + gap: var(--sp-xs); +} + +.replace-scope-row { + display: flex; + gap: var(--sp-l); + align-items: center; + block-size: $sz-32; +} + +.replace-actions-row { + display: flex; + gap: var(--sp-xs); +} + +.replace-actions-button { + justify-content: center; + flex: 1 1 0; +} + +.replace-match-navigation { + display: flex; + align-items: center; + gap: var(--sp-xs); + flex-shrink: 0; +} + +.replace-match-count { + @include t.use-typography("body-small"); + + color: var(--color-foreground-secondary); + white-space: nowrap; + display: flex; + align-items: center; + padding: 0 var(--sp-xs); +} + +.radio-label { + display: flex; + align-items: center; + gap: px2rem(6); + + &.selected { + .radio-text { + color: var(--color-foreground-primary); + } + } +} + +.radio-icon { + block-size: var(--sp-m); + inline-size: var(--sp-m); + border: $b-1 solid var(--color-foreground-secondary); + border-radius: 50%; + background-color: transparent; + flex-shrink: 0; + + &.checked { + border-color: var(--color-accent-primary); + background-color: var(--color-accent-primary); + box-shadow: inset 0 0 0 var(--sp-xxs) var(--color-background-primary); + } +} + +.radio-input { + display: none; +} + +.radio-text { + @include t.use-typography("body-small"); + + color: var(--color-foreground-secondary); +} + .filters-container { @extend %menu-dropdown; position: absolute; - left: deprecated.$s-20; - width: deprecated.$s-192; + inline-size: $sz-192; .filter-menu-item { - @include deprecated.body-small-typography; + @include t.use-typography("body-small"); display: flex; align-items: center; justify-content: space-between; - width: 100%; - padding: deprecated.$s-6; - border-radius: deprecated.$br-8; + inline-size: 100%; + padding: px2rem(6); + border-radius: $br-8; .filter-menu-item-name-wrapper { display: flex; align-items: center; - gap: deprecated.$s-8; + gap: var(--sp-s); .filter-menu-item-icon { color: var(--menu-foreground-color); } .filter-menu-item-name { - padding-top: deprecated.$s-2; + padding-block-start: var(--sp-xxs); color: var(--menu-foreground-color); } } @@ -234,173 +275,3 @@ } } } - -.tool-window-content { - --calculated-height: calc(#{deprecated.$s-136} + var(--height, #{deprecated.$s-200})); - - display: flex; - flex-direction: column; - height: calc(100vh - var(--calculated-height)); - width: calc(var(--left-sidebar-width) + var(--depth) * var(--layer-indentation-size)); - overflow: auto; - scrollbar-gutter: stable; -} - -.replace-row { - padding: 0 deprecated.$s-12; - gap: deprecated.$s-4; -} - -.search-scope-row { - display: flex; - gap: deprecated.$s-16; - padding: deprecated.$s-4 deprecated.$s-12 deprecated.$s-8; - align-items: center; -} - -.scope-option { - display: flex; - align-items: center; - gap: deprecated.$s-6; - cursor: pointer; -} - -.scope-radio { - width: deprecated.$s-12; - height: deprecated.$s-12; - border: deprecated.$s-1 solid var(--color-foreground-secondary); - border-radius: 50%; - background-color: transparent; - flex-shrink: 0; -} - -.scope-radio-checked { - border-color: var(--color-accent-primary); - background-color: var(--color-accent-primary); - box-shadow: inset 0 0 0 deprecated.$s-2 var(--color-background-primary); -} - -.scope-radio-input { - display: none; -} - -.scope-label { - @include deprecated.body-small-typography; - - color: var(--color-foreground-secondary); - cursor: pointer; -} - -.scope-selected .scope-label { - color: var(--color-foreground-primary); -} - -.replace-actions-row { - display: flex; - gap: deprecated.$s-4; - padding: 0 deprecated.$s-12 deprecated.$s-8; -} - -.replace-input-wrapper { - @include deprecated.flex-center; - - flex: 1; - height: deprecated.$s-32; - border: deprecated.$s-1 solid var(--search-bar-input-border-color); - border-radius: deprecated.$br-8; - background-color: var(--search-bar-input-background-color); - - &:hover { - border: deprecated.$s-1 solid var(--input-border-color-hover); - background-color: var(--input-background-color-hover); - - .replace-input { - background-color: var(--input-background-color-hover); - } - } - - &:focus-within { - background-color: var(--input-background-color-active); - color: var(--input-foreground-color-active); - border: deprecated.$s-1 solid var(--input-border-color-focus); - - .replace-input { - background-color: var(--input-background-color-active); - } - } -} - -.replace-input { - width: 100%; - height: 100%; - margin: 0 deprecated.$s-8; - border: 0; - background-color: var(--input-background-color); - font-size: deprecated.$fs-12; - color: var(--input-foreground-color); - border-radius: deprecated.$br-8; - - &:focus { - outline: none; - } -} - -.replace-button { - @include deprecated.body-small-typography; - @include deprecated.button-style; - - flex: 1; - height: deprecated.$s-28; - padding: 0 deprecated.$s-8; - border: deprecated.$s-1 solid var(--color-background-tertiary); - border-radius: deprecated.$br-8; - background-color: var(--color-background-tertiary); - color: var(--color-foreground-primary); - white-space: nowrap; - text-transform: uppercase; - - &:hover:not(:disabled) { - border: deprecated.$s-1 solid var(--input-border-color-hover); - background-color: var(--input-background-color-hover); - } - - &:disabled { - opacity: 0.4; - cursor: default; - } -} - -.match-navigation { - display: flex; - align-items: center; - gap: deprecated.$s-2; - flex-shrink: 0; -} - -.match-count { - @include deprecated.body-small-typography; - - color: var(--color-foreground-secondary); - white-space: nowrap; -} - -.no-matches { - @include deprecated.body-small-typography; - - color: var(--color-foreground-secondary); - white-space: nowrap; - flex-shrink: 0; -} - -.clear-icon { - @extend %button-tag; - - flex: 0 0 deprecated.$s-32; - height: 100%; - color: var(--color-icon-default); -} - -.element-list { - display: grid; - position: relative; -} diff --git a/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs b/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs index 8a363d56eb..f58ffab8d1 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs @@ -111,6 +111,8 @@ (tr "shortcuts.duplicate") (tr "shortcuts.escape") (tr "shortcuts.export-shapes") + (tr "shortcuts.find") + (tr "shortcuts.find-and-replace") (tr "shortcuts.fit-all") (tr "shortcuts.flip-horizontal") (tr "shortcuts.flip-vertical") @@ -160,6 +162,7 @@ (tr "shortcuts.open-viewer") (tr "shortcuts.open-workspace") (tr "shortcuts.paste") + (tr "shortcuts.paste-replace") (tr "shortcuts.prev-frame") (tr "shortcuts.redo") (tr "shortcuts.rename") diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 4107130ea7..942d7fe43b 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -4662,6 +4662,14 @@ msgstr "Cancel" msgid "shortcuts.export-shapes" msgstr "Export shapes" +#: src/app/main/ui/workspace/sidebar/shortcuts.cljs +msgid "shortcuts.find" +msgstr "Find" + +#: src/app/main/ui/workspace/sidebar/shortcuts.cljs +msgid "shortcuts.find-and-replace" +msgstr "Find and replace" + #: src/app/main/ui/workspace/sidebar/shortcuts.cljs:114 msgid "shortcuts.fit-all" msgstr "Zoom to fit all" @@ -4866,6 +4874,10 @@ msgstr " or " msgid "shortcuts.paste" msgstr "Paste" +#: src/app/main/ui/workspace/sidebar/shortcuts.cljs +msgid "shortcuts.paste-replace" +msgstr "Paste and replace" + #: src/app/main/ui/workspace/sidebar/shortcuts.cljs:111 #, unused msgid "shortcuts.paste-props" @@ -8148,7 +8160,10 @@ msgstr "Masks" #: src/app/main/ui/workspace/sidebar/layers.cljs:293 msgid "workspace.sidebar.layers.search" -msgstr "Search layers" +msgstr "Find…" + +msgid "workspace.sidebar.layers.search-and-replace" +msgstr "Find and replace" #: src/app/main/ui/workspace/sidebar/layers.cljs:316, src/app/main/ui/workspace/sidebar/layers.cljs:410 msgid "workspace.sidebar.layers.shapes" @@ -8180,11 +8195,11 @@ msgstr "No matches" #: src/app/main/ui/workspace/sidebar/layers.cljs msgid "workspace.sidebar.layers.search-scope-layers" -msgstr "Search layers" +msgstr "Layer names" #: src/app/main/ui/workspace/sidebar/layers.cljs msgid "workspace.sidebar.layers.search-scope-canvas" -msgstr "Search on canvas" +msgstr "Text content" #: src/app/main/ui/inspect/attributes/svg.cljs:56, src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs:101 msgid "workspace.sidebar.options.svg-attrs.title" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 82da6d88d3..edc4661521 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -5897,6 +5897,14 @@ msgstr "Rehacer" msgid "workspace.header.menu.select-all" msgstr "Seleccionar todo" +#: src/app/main/ui/workspace/main_menu.cljs +msgid "workspace.header.menu.find" +msgstr "Buscar" + +#: src/app/main/ui/workspace/main_menu.cljs +msgid "workspace.header.menu.find-and-replace" +msgstr "Buscar y reemplazar" + #: src/app/main/ui/workspace/main_menu.cljs:423 msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nombres de tableros" @@ -7968,6 +7976,9 @@ msgstr "Máscaras" msgid "workspace.sidebar.layers.search" msgstr "Buscar capas" +msgid "workspace.sidebar.layers.search-and-replace" +msgstr "Buscar y reemplazar" + #: src/app/main/ui/workspace/sidebar/layers.cljs:316, src/app/main/ui/workspace/sidebar/layers.cljs:410 msgid "workspace.sidebar.layers.shapes" msgstr "Formas" From 6d6f624d09553a9dc899e815d6f673e5d0d613a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?andr=C3=A9s=20gonz=C3=A1lez?= Date: Thu, 21 May 2026 13:17:14 +0200 Subject: [PATCH 22/53] :sparkles: Track WebGL rendering toggle events (#9683) (#9772) * :sparkles: Track WebGL rendering toggle events (#9683) * :paperclip: Normalize workspace menu events origin * :paperclip: Normalize event origin for profile settings page --------- Co-authored-by: Andrey Antukh --- .../src/app/main/ui/settings/options.cljs | 7 +++- .../app/main/ui/settings/subscription.cljs | 4 +-- .../src/app/main/ui/workspace/main_menu.cljs | 36 ++++++++++--------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/main/ui/settings/options.cljs b/frontend/src/app/main/ui/settings/options.cljs index 7a2fc59413..43d5374476 100644 --- a/frontend/src/app/main/ui/settings/options.cljs +++ b/frontend/src/app/main/ui/settings/options.cljs @@ -8,6 +8,7 @@ (:require-macros [app.main.style :as stl]) (:require [app.config :as cf] + [app.main.data.event :as ev] [app.main.data.notifications :as ntf] [app.main.data.profile :as du] [app.main.refs :as refs] @@ -95,7 +96,11 @@ handle-render-change (mf/use-fn (fn [enabled?] - (st/emit! (du/update-profile-props {:renderer (if enabled? :wasm :svg)}) + (st/emit! (ev/event {::ev/name (if enabled? + "enable-webgl-rendering" + "disable-webgl-rendering") + ::ev/origin "settings"}) + (du/update-profile-props {:renderer (if enabled? :wasm :svg)}) (ntf/success (tr (if enabled? "webgl.toast.webgl-render-enabled" "webgl.toast.webgl-render-disabled"))))))] diff --git a/frontend/src/app/main/ui/settings/subscription.cljs b/frontend/src/app/main/ui/settings/subscription.cljs index 81726702d5..6b4f3e2ab7 100644 --- a/frontend/src/app/main/ui/settings/subscription.cljs +++ b/frontend/src/app/main/ui/settings/subscription.cljs @@ -430,7 +430,7 @@ (mf/deps subscription-editors nitrate-license) (fn [subscription-type current-subscription] (st/emit! (ev/event {::ev/name "open-subscription-modal" - ::ev/origin "settings:in-app"})) + ::ev/origin "settings"})) (if (= subscription-type "nitrate") (st/emit! (dnt/show-nitrate-popup :nitrate-dialog {:nitrate-license nitrate-license})) (st/emit! @@ -461,7 +461,7 @@ (st/emit! (ev/event {::ev/name "open-subscription-modal" - ::ev/origin "settings:from-pricing-page"}) + ::ev/origin "settings"}) (modal/show :management-dialog {:subscription-type (if (= params-subscription "subscription-to-penpot-unlimited") "unlimited" diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index ecd4b186bc..90ca611c41 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -63,21 +63,21 @@ (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "explore-help-center-click" - ::ev/origin "workspace-menu:in-app"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "https://help.penpot.app"))) nav-to-community (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "explore-community-click" - ::ev/origin "workspace-menu:in-app"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "https://community.penpot.app"))) nav-to-youtube (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "explore-tutorials-click" - ::ev/origin "workspace-menu:in-app"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "https://www.youtube.com/c/Penpot"))) nav-to-templates @@ -91,14 +91,14 @@ (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "explore-github-repository-click" - ::ev/origin "workspace-menu:in-app"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "https://github.com/penpot/penpot"))) nav-to-terms (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "explore-terms-service-click" - ::ev/origin "workspace-menu:in-app"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "https://penpot.app/terms"))) nav-to-feedback @@ -119,7 +119,7 @@ (st/emit! (-> (dw/toggle-layout-flag :shortcuts) - (vary-meta assoc ::ev/origin "workspace-header"))))) + (vary-meta assoc ::ev/origin "workspace:menu"))))) show-release-notes (mf/use-fn @@ -347,7 +347,7 @@ (r/set-resize-type! :bottom) (st/emit! (dw/remove-layout-flag :textpalette) (-> (dw/toggle-layout-flag :colorpalette) - (vary-meta assoc ::ev/origin "workspace-menu"))))) + (vary-meta assoc ::ev/origin "workspace:menu"))))) toggle-text-palette (mf/use-fn @@ -355,7 +355,7 @@ (r/set-resize-type! :bottom) (st/emit! (dw/remove-layout-flag :colorpalette) (-> (dw/toggle-layout-flag :textpalette) - (vary-meta assoc ::ev/origin "workspace-menu")))))] + (vary-meta assoc ::ev/origin "workspace:menu")))))] [:> dropdown-menu* {:show true :class (stl/css :base-menu :sub-menu :pos-3) @@ -629,7 +629,7 @@ (mf/deps file) (fn [_] (st/emit! (-> (fexp/open-export-dialog [file]) - (with-meta {::ev/origin "workspace"}))))) + (with-meta {::ev/origin "workspace:menu"}))))) on-export-file-key-down (mf/use-fn @@ -809,7 +809,7 @@ (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "manage-mpc-option" - ::ev/origin "workspace-menu"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "/#/settings/integrations"))) on-nav-to-integrations-key-down @@ -824,10 +824,10 @@ (if mcp-connected? (st/emit! (mcp/user-disconnect-mcp) (ev/event {::ev/name "disconnect-mcp-plugin" - ::ev/origin "workspace-menu"})) + ::ev/origin "workspace:menu"})) (st/emit! (mcp/connect-mcp) (ev/event {::ev/name "connect-mcp-plugin" - ::ev/origin "workspace-menu"}))))) + ::ev/origin "workspace:menu"}))))) on-toggle-mcp-plugin-key-down (mf/use-fn @@ -910,7 +910,7 @@ (mf/use-fn (fn [] (st/emit! (ev/event {::ev/name "explore-pricing-click" - ::ev/origin "workspace-menu"})) + ::ev/origin "workspace:menu"})) (dom/open-new-window "https://penpot.app/pricing"))) toggle-flag @@ -922,7 +922,7 @@ (keyword))] (st/emit! (-> (dw/toggle-layout-flag flag) - (vary-meta assoc ::ev/origin "workspace-menu"))) + (vary-meta assoc ::ev/origin "workspace:menu"))) (reset! show-menu* false) (reset! selected-sub-menu* nil)))) @@ -939,7 +939,11 @@ (dom/stop-propagation event) (let [renderer (or (-> profile :props :renderer) :svg) next-renderer (if (= renderer :wasm) :svg :wasm)] - (st/emit! (du/update-profile-props {:renderer next-renderer}) + (st/emit! (ev/event {::ev/name (if (= next-renderer :wasm) + "enable-webgl-rendering" + "disable-webgl-rendering") + ::ev/origin "workspace:menu"}) + (du/update-profile-props {:renderer next-renderer}) (ntf/success (tr (if (= next-renderer :wasm) "webgl.toast.webgl-render-enabled" "webgl.toast.webgl-render-disabled"))))))) @@ -973,7 +977,7 @@ :icon i/menu}] [:> dropdown-menu* {:show show-menu? - :id "workspace-menu" + :id "workspace:menu" :on-close close-menu :class (stl/css :base-menu :menu)} [:> dropdown-menu-item* {:class (stl/css :base-menu-item :menu-item) From 4a73a97a32bf0cb7932b871ecca11cca7b9753bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 19 May 2026 15:00:42 +0200 Subject: [PATCH 23/53] :bug: Fix shapes not being rendered after render switch --- frontend/src/app/main/data/changes.cljs | 38 ++++++++++++++++++++++- frontend/src/app/main/data/workspace.cljs | 25 --------------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/frontend/src/app/main/data/changes.cljs b/frontend/src/app/main/data/changes.cljs index e91fcf0f4e..be38f335fb 100644 --- a/frontend/src/app/main/data/changes.cljs +++ b/frontend/src/app/main/data/changes.cljs @@ -18,7 +18,9 @@ [app.main.data.helpers :as dsh] [app.main.features :as features] [app.main.worker :as mw] + [app.render-wasm.api :as wasm.api] [app.render-wasm.shape :as wasm.shape] + [app.render-wasm.wasm :as wasm] [beicon.v2.core :as rx] [potok.v2.core :as ptk])) @@ -76,6 +78,31 @@ (def ^:private xf:map-page-id (map :page-id)) +(def ^:private wasm-structural-change-types + #{:add-obj :mov-objects}) + +(defn- redo-changes-need-wasm-object-sync? + [redo-changes] + (some #(contains? wasm-structural-change-types (:type %)) redo-changes)) + +(defn- sync-wasm-structural-changes + [{:keys [redo-changes]}] + (ptk/reify ::sync-wasm-structural-changes + ptk/EffectEvent + (effect [_ state _] + (when (and wasm/context-initialized? + (not @wasm/context-lost?)) + (let [objects (dsh/lookup-page-objects state)] + (doseq [{:keys [type id parent-id]} redo-changes + :when (contains? wasm-structural-change-types type) + :let [shape-id (case type + :add-obj id + :mov-objects parent-id) + shape (get objects shape-id)] + :when shape] + (wasm.api/process-object shape)) + (wasm.api/request-render "sync-wasm-structural-changes")))))) + (defn- apply-changes-localy [{:keys [file-id redo-changes ignore-wasm?] :as commit} pending] (ptk/reify ::apply-changes-localy @@ -118,7 +145,16 @@ state) ;; wasm renderer deactivated - (update-in state [:files file-id :data] apply-changes)))))) + (update-in state [:files file-id :data] apply-changes)))) + + ptk/WatchEvent + (watch [_ state _] + ;; `:add-obj` / `:mov-objects` are not tracked via `*shape-changes*`. + ;; Emit only for structural commits, after file data is in state. + (when (and (not ignore-wasm?) + (features/active-feature? state "render-wasm/v1") + (redo-changes-need-wasm-object-sync? redo-changes)) + (rx/of (sync-wasm-structural-changes {:redo-changes redo-changes})))))) (defn commit "Create a commit event instance" diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 98d66dc593..f878234e1d 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -306,19 +306,6 @@ (rx/map bundle-fetched) (rx/take-until stopper-s)))))) -;; FIXME: this need docstring -(defn- process-wasm-object - [id] - (ptk/reify ::process-wasm-object - ptk/EffectEvent - (effect [_ state _] - (let [objects (dsh/lookup-page-objects state) - shape (get objects id)] - ;; Only process objects that exist in the current page - ;; This prevents errors when processing changes from other pages - (when shape - (wasm.api/process-object shape)))))) - (defn initialize-file [team-id file-id] (assert (uuid? team-id) "expected valud uuid for `team-id`") @@ -444,18 +431,6 @@ (rx/take 1) (rx/map #(dwcm/navigate-to-comment-id comment-id)))) - (->> stream - (rx/filter dch/commit?) - (rx/filter render-wasm-ready?) - (rx/map deref) - (rx/mapcat - (fn [{:keys [redo-changes]}] - (let [added (->> redo-changes - (filter #(= (:type %) :add-obj)) - (map :id))] - (->> (rx/from added) - (rx/map process-wasm-object)))))) - (let [local-commits-s (->> stream (rx/filter dch/commit?) From a7b17f54f175b137105a2613dd1b7fb30479511f Mon Sep 17 00:00:00 2001 From: Alonso Torres Date: Thu, 21 May 2026 16:39:26 +0200 Subject: [PATCH 24/53] :bug: Fix problem of path position on variant change (#9801) --- common/src/app/common/logic/libraries.cljc | 36 +++- common/test/common_tests/data_test.cljc | 2 +- .../logic/variants_switch_test.cljc | 177 +++++++++++++++++- common/test/common_tests/runner.cljc | 2 + 4 files changed, 208 insertions(+), 9 deletions(-) diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 917f2afe72..848b837fc0 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -20,6 +20,7 @@ [app.common.logging :as log] [app.common.logic.shapes :as cls] [app.common.logic.variant-properties :as clvp] + [app.common.math :as mth] [app.common.path-names :as cpn] [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] @@ -2086,19 +2087,40 @@ displacement (x/y). For :selrect we compare width/height only; for :points we normalise each vector so the first point is the - origin before comparing." + origin before comparing. + For :content on path shapes we compare the bounding-box width/height + of the path segments, again ignoring absolute position. + + Comparisons use `mth/close?` (and `gpt/close?` for points) rather than + exact `=` because `previous-shape` here may carry sub-pixel drift from + interactive transform modifiers (e.g. an alt-drag duplicate of a + variant whose children are component instances). Without tolerance + this guard would miss equivalent geometries and let the `:else` branch + in `update-attrs-on-switch` carry stale `:selrect`/`:points` from the + pre-switch shape onto the freshly instantiated target." [shape origin-shape attr] (or (and (= attr :selrect) - (= (-> shape :selrect :width) (-> origin-shape :selrect :width)) - (= (-> shape :selrect :height) (-> origin-shape :selrect :height))) + (mth/close? (-> shape :selrect :width) (-> origin-shape :selrect :width)) + (mth/close? (-> shape :selrect :height) (-> origin-shape :selrect :height))) (and (= attr :points) (let [normalize-pts (fn [pts] (when (seq pts) (let [f (first pts)] - (mapv #(gpt/subtract % f) pts))))] - (= (normalize-pts (get shape :points)) - (normalize-pts (get origin-shape :points))))))) - + (mapv #(gpt/subtract % f) pts)))) + a (normalize-pts (get shape :points)) + b (normalize-pts (get origin-shape :points))] + (and (= (count a) (count b)) + (every? identity (map gpt/close? a b))))) + (and (= attr :content) + (cfh/path-shape? shape) + (let [ca (:content shape) + cb (:content origin-shape)] + (and (some? ca) (some? cb) + (let [selrect-a (segment/content->selrect ca) + selrect-b (segment/content->selrect cb)] + (and (some? selrect-a) (some? selrect-b) + (mth/close? (:width selrect-a) (:width selrect-b)) + (mth/close? (:height selrect-a) (:height selrect-b))))))))) (defn update-attrs-on-switch "Copy attributes that have changed in the shape previous to the switch diff --git a/common/test/common_tests/data_test.cljc b/common/test/common_tests/data_test.cljc index 56b43078dc..70f13e5119 100644 --- a/common/test/common_tests/data_test.cljc +++ b/common/test/common_tests/data_test.cljc @@ -888,7 +888,7 @@ (t/is (not (d/editable-collection? "hello"))) (t/is (not (d/editable-collection? 42)))) -(t/deftest num-predicate +(t/deftest num-predicate-2 (t/is (d/num? 1)) (t/is (d/num? 0)) (t/is (d/num? -3.14)) diff --git a/common/test/common_tests/logic/variants_switch_test.cljc b/common/test/common_tests/logic/variants_switch_test.cljc index 99784dade5..0384a95a89 100644 --- a/common/test/common_tests/logic/variants_switch_test.cljc +++ b/common/test/common_tests/logic/variants_switch_test.cljc @@ -7,6 +7,9 @@ (ns common-tests.logic.variants-switch-test (:require [app.common.files.changes-builder :as pcb] + [app.common.files.helpers :as cfh] + [app.common.geom.point :as gpt] + [app.common.geom.shapes :as gsh] [app.common.logic.shapes :as cls] [app.common.test-helpers.components :as thc] [app.common.test-helpers.compositions :as tho] @@ -2860,4 +2863,176 @@ ;; Both variants are identical in size (100x50), so the override IS preserved (t/is (= (:width rect02') 150)) ;; The guard must not have suppressed :selrect — it should be consistent - (t/is (= (get-in rect02' [:selrect :width]) 150)))) \ No newline at end of file + (t/is (= (get-in rect02' [:selrect :width]) 150)))) + + +(t/deftest test-switch-when-source-master-child-has-touched-geometry + ;; Regression: when the previous-shape's geometry has sub-pixel drift + ;; relative to its source master (a state produced by interactive transform + ;; modifiers, e.g. alt-drag duplicate of a variant whose children are + ;; component copies), the equal-geometry? guard in update-attrs-on-switch + ;; uses exact equality and fails. The :else branch then copies + ;; previous-shape's :selrect verbatim onto the freshly-instantiated target, + ;; leaving :y correct (the per-attr y skip catches that) but :selrect.y + ;; stale. The shape ends up internally inconsistent (:y disagrees with + ;; :selrect.y); the renderer reads :selrect, so the child appears at the + ;; source variant's position inside a parent that has resized to the + ;; target's dimensions — the visible "cut off" symptom. + (let [;; ==== Setup + ;; A self-contained Input/Button-like component, plus a variant + ;; container whose two variants each instance that component + ;; at different y positions. This mirrors the production setup + ;; where the dragged variant's children are themselves component + ;; copies (and thus carry :touched on geometry within the master). + file (-> (thf/sample-file :file1) + (tho/add-simple-component :btn-comp :btn-root :btn-rect) + (thv/add-variant-with-copy + :v01 :c01 :m01 :c02 :m02 :child1 :child2 :btn-comp)) + + ;; Position child1 at y=101 (in m01) and child2 at y=73 (in m02). + ;; Use gsh/absolute-move so :selrect/:points stay consistent with + ;; :y — a plain (assoc :y …) would leave them out of sync and + ;; produce a different (artificial) failure mode. + page (thf/current-page file) + child1 (ths/get-shape file :child1) + child2 (ths/get-shape file :child2) + changes (-> (pcb/empty-changes nil (:id page)) + (cls/generate-update-shapes + #{(:id child1)} + #(gsh/absolute-move % (gpt/point (:x %) 101)) + (:objects page) {}) + (cls/generate-update-shapes + #{(:id child2)} + #(gsh/absolute-move % (gpt/point (:x %) 73)) + (:objects page) {})) + file (thf/apply-changes file changes) + file (thc/instantiate-component file :c01 :copy01) + + ;; The copy carries an Input/Button instance (Frame1). Introduce + ;; sub-pixel drift in its :width and :selrect.width — the kind of + ;; floating-point error produced by the alt-drag modifier path in + ;; production. This drift is what defeats equal-geometry?'s + ;; exact-equality comparison and lets the bug surface. + page (thf/current-page file) + copy01 (ths/get-shape file :copy01) + copy-btn-id (->> (cfh/get-children-ids-with-self (:objects page) (:id copy01)) + (map #(get-in page [:objects %])) + (filter #(= "Frame1" (:name %))) + first :id) + drift 0.00001 + changes (cls/generate-update-shapes + (pcb/empty-changes nil (:id page)) + #{copy-btn-id} + (fn [shape] + (let [w (+ (:width shape) drift) + sr (:selrect shape)] + (-> shape + (assoc :width w) + (assoc :selrect (-> sr + (assoc :width w) + (assoc :x2 (+ (:x1 sr) w))))))) + (:objects page) {}) + file (thf/apply-changes file changes) + m02 (ths/get-shape file :m02) + child2 (ths/get-shape file :child2) + + target-rel-y (- (:y child2) (:y m02)) + + ;; ==== Action + file' (tho/swap-component-in-shape file :copy01 :c02 + {:new-shape-label :copy02 + :keep-touched? true}) + + page' (thf/current-page file') + copy02 (ths/get-shape file' :copy02) + post-btn (->> (cfh/get-children-ids-with-self (:objects page') (:id copy02)) + (map #(get-in page' [:objects %])) + (filter #(= "Frame1" (:name %))) + first) + post-btn-rel-y (- (:y post-btn) (:y copy02)) + post-btn-selrect-rel-y (- (get-in post-btn [:selrect :y]) + (get-in copy02 [:selrect :y]))] + + ;; The post-switch button must sit at the target master's relative y. + ;; Its :y field already does (the per-attr :y skip handles that + ;; correctly); the failure is on :selrect. + (t/is (= target-rel-y post-btn-rel-y) + (str "Child's :y should match target master layout (" target-rel-y ")")) + + ;; The bug: :selrect.y is overwritten with the previous shape's value, + ;; not regenerated from the target master's layout. After fix, this + ;; assertion should pass. + (t/is (= target-rel-y post-btn-selrect-rel-y) + (str ":selrect.y should match target master layout (expected " + target-rel-y " got " post-btn-selrect-rel-y ")")) + + ;; And :y must agree with :selrect.y — a shape whose :y disagrees with + ;; its :selrect.y is internally inconsistent and renders incorrectly. + (t/is (= post-btn-rel-y post-btn-selrect-rel-y) + ":y and :selrect.y must agree after switch"))) + + +(t/deftest test-switch-does-not-override-path-content-when-only-repositioned + ;; Regression: when a path shape inside a variant has :geometry-group touched + ;; (e.g. because auto-layout repositioned it after the copy's parent was + ;; resized), switching variants must NOT copy the old variant's path position + ;; to the new variant. The path should stay at the new variant's default position. + ;; + ;; Root cause: equal-geometry? did not handle the :content attr for path shapes, + ;; so switch-path-change-value was always invoked and placed the new path at the + ;; pre-switch absolute position instead of the target master's default position. + (let [;; A small closed triangle path whose bounding box is 24x14 px, + ;; anchored at absolute position (x0, y0). + triangle (fn [x0 y0] + [{:command :move-to :params {:x x0 :y y0}} + {:command :line-to :params {:x (+ x0 24) :y y0}} + {:command :line-to :params {:x (+ x0 12) :y (+ y0 14)}} + {:command :close-path}]) + + ;; V1 has the path at y=10; V2 has the same-shape path at y=30. + file (-> (thf/sample-file :file1) + (thv/add-variant :v01 :c01 :m01 :c02 :m02 + {:variant1-params {:width 100 :height 100} + :variant2-params {:width 100 :height 100}}) + (ths/add-sample-shape :path1 :type :path + :parent-label :m01 + :content (triangle 0 10)) + (ths/add-sample-shape :path2 :type :path + :parent-label :m02 + :content (triangle 0 30)) + (thc/instantiate-component :c01 :copy01)) + + ;; Simulate auto-layout repositioning the path inside the copy by + ;; moving it to y=50. This touches :geometry-group on the copy's path. + page (thf/current-page file) + copy01 (ths/get-shape file :copy01) + copy-path (->> (cfh/get-children-with-self (:objects page) (:id copy01)) + (filter #(= :path (:type %))) + first) + changes (cls/generate-update-shapes + (pcb/empty-changes nil (:id page)) + #{(:id copy-path)} + #(gsh/absolute-move % (gpt/point (:x %) 50)) + (:objects page) {}) + file (thf/apply-changes file changes) + + ;; Switch copy01 from V1 (c01) to V2 (c02). + file' (tho/swap-component-in-shape file :copy01 :c02 {:keep-touched? true}) + + page' (thf/current-page file') + copy01' (ths/get-shape file' :copy01) + copy-path' (->> (cfh/get-children-with-self (:objects page') (:id copy01')) + (filter #(= :path (:type %))) + first) + + ;; Expected: V2's path sits at y=30 (its master default), not y=50 + ;; (the pre-switch repositioned position). + m02 (ths/get-shape file :m02) + path2 (ths/get-shape file :path2) + target-rel-y (- (-> path2 :selrect :y) (-> m02 :selrect :y)) + actual-rel-y (- (-> copy-path' :selrect :y) (-> copy01' :selrect :y))] + + (t/is (some? copy-path') "path should exist in switched copy") + (t/is (= target-rel-y actual-rel-y) + (str "path :selrect.y should match target master layout (expected " + target-rel-y " got " actual-rel-y ")")))) diff --git a/common/test/common_tests/runner.cljc b/common/test/common_tests/runner.cljc index 29540525db..9e1cd276a5 100644 --- a/common/test/common_tests/runner.cljc +++ b/common/test/common_tests/runner.cljc @@ -52,6 +52,7 @@ [common-tests.logic.swap-and-reset-test] [common-tests.logic.swap-as-override-test] [common-tests.logic.token-test] + [common-tests.logic.variants-switch-test] [common-tests.media-test] [common-tests.path-names-test] [common-tests.record-test] @@ -132,6 +133,7 @@ 'common-tests.logic.swap-and-reset-test 'common-tests.logic.swap-as-override-test 'common-tests.logic.token-test + 'common-tests.logic.variants-switch-test 'common-tests.media-test 'common-tests.path-names-test 'common-tests.record-test From 65c6b7be7c95b253b5e47cefb5f67a1820eaa8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Thu, 21 May 2026 16:46:52 +0200 Subject: [PATCH 25/53] :bug: Fix changed font size when editing a text with no changes --- frontend/src/app/util/text/content/from_dom.cljs | 11 ++++++++++- frontend/src/app/util/text/content/to_dom.cljs | 6 +++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/util/text/content/from_dom.cljs b/frontend/src/app/util/text/content/from_dom.cljs index dbc318cc08..da0fc394f2 100644 --- a/frontend/src/app/util/text/content/from_dom.cljs +++ b/frontend/src/app/util/text/content/from_dom.cljs @@ -8,6 +8,7 @@ (:require [app.common.data :as d] [app.common.types.text :as txt] + [app.util.dom :as dom] [app.util.text.content.styles :as styles])) (defn is-text-node @@ -60,7 +61,15 @@ (defn get-paragraph-styles [element] - (get-attrs-from-styles element (d/concat-set txt/paragraph-attrs txt/text-node-attrs) (d/merge txt/default-paragraph-attrs txt/default-text-attrs))) + (let [styles (get-attrs-from-styles element + (d/concat-set txt/paragraph-attrs txt/text-node-attrs) + (d/merge txt/default-paragraph-attrs txt/default-text-attrs)) + ;; Recover real font-size from data attribute, which to_dom/get-paragraph-styles may have + ;; changed to "0" ("0" trick to avoid it interfering with height calculation in the browser). + saved-font-size (dom/get-data element "saved-font-size")] + (cond-> styles + (some? saved-font-size) + (assoc :font-size saved-font-size)))) (defn get-root-styles [element] diff --git a/frontend/src/app/util/text/content/to_dom.cljs b/frontend/src/app/util/text/content/to_dom.cljs index 82ddf0fe32..50c48ebe30 100644 --- a/frontend/src/app/util/text/content/to_dom.cljs +++ b/frontend/src/app/util/text/content/to_dom.cljs @@ -133,7 +133,11 @@ (create-element "div" {:id (or (:key paragraph) (create-random-key)) - :data {:itype "paragraph"} + :data {:itype "paragraph" + ;; Save the real font size to be restored later in from-dom/get-paragraph-styles, + ;; because the function get-paragraph-styles here sets it to "0" in the css properties, + ;; to avoid the browser affecting the height calculation. + :saved-font-size (:font-size paragraph)} :style (get-paragraph-styles paragraph)} (mapv #(create-text-span % paragraph) (:children paragraph)))) From bfa338bdee72cb0e187908e00cd0f47df0149674 Mon Sep 17 00:00:00 2001 From: Luis de Dios Date: Thu, 21 May 2026 16:54:31 +0200 Subject: [PATCH 26/53] :bug: Fix resize line between sitemaps and layers --- frontend/src/app/main/ui/workspace/sidebar/layers.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.scss b/frontend/src/app/main/ui/workspace/sidebar/layers.scss index babec39c95..be7d5676a1 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.scss @@ -23,7 +23,7 @@ align-items: center; justify-content: space-between; gap: var(--sp-xs); - padding: var(--sp-m) var(--sp-m) 0 var(--sp-m); + margin: var(--sp-m) var(--sp-m) 0 var(--sp-m); } .tool-window-bar-title { From 8119ed132eccd6406efc5e7c47081854c22733a6 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 21 May 2026 17:15:07 +0200 Subject: [PATCH 27/53] :bug: Fix sorting of standalone and grouped tokens (#9736) --- .../tokens/management/token_tree.cljs | 126 +++++++++++------- 1 file changed, 76 insertions(+), 50 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs b/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs index b27db0bc85..798485cc87 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs @@ -11,8 +11,8 @@ [app.common.path-names :as cpn] [app.common.types.tokens-lib :as ctob] [app.main.data.workspace.tokens.library-edit :as dwtl] - [app.main.refs :as refs] [app.main.store :as st] + [app.main.ui.context :as ctx] [app.main.ui.ds.layers.layer-button :refer [layer-button*]] [app.main.ui.workspace.tokens.management.token-pill :refer [token-pill*]] [rumext.v2 :as mf])) @@ -44,18 +44,36 @@ on-token-pill-click on-pill-context-menu on-node-context-menu]}] - (let [full-path (str (name type) "." (:path node)) - is-folder-expanded (not (contains? (set (or folded-token-paths [])) full-path)) - swap-folder-expanded (mf/use-fn - (mf/deps full-path) - (fn [] - (st/emit! (dwtl/toggle-token-path full-path)))) + (let [full-path (str (name type) "." (:path node)) + is-folder-expanded (not (contains? (set (or folded-token-paths [])) full-path)) + children (:children node) + + sorted-children + (mf/with-memo [children] + (let [[leafs groups] + (reduce (fn [[l g] item] + (if (:leaf item) + [(conj l item) g] + [l (conj g item)])) + [[] []] + children) + sorted-leafs (d/natural-sort-by :name leafs) + sorted-groups (d/natural-sort-by :name groups)] + (concat sorted-leafs sorted-groups))) + + swap-folder-expanded + (mf/use-fn + (mf/deps full-path) + (fn [] + (st/emit! (dwtl/toggle-token-path full-path)))) + + node-context-menu-prep + (mf/use-fn + (mf/deps on-node-context-menu node) + (fn [event] + (when on-node-context-menu + (on-node-context-menu event node))))] - node-context-menu-prep (mf/use-fn - (mf/deps on-node-context-menu node) - (fn [event] - (when on-node-context-menu - (on-node-context-menu event node))))] [:li {:class (stl/css :folder-node)} [:> layer-button* {:label (:name node) :expanded is-folder-expanded @@ -65,36 +83,34 @@ :on-toggle-expand swap-folder-expanded :on-context-menu node-context-menu-prep}] (when is-folder-expanded - (let [children (:children node)] - [:div {:class (stl/css :folder-children-wrapper) - :id (str "folder-children-" (:path node))} - (when (seq children) - (let [sorted-children (d/natural-sort-by :name children)] - (for [child sorted-children] - (if (not (:leaf child)) - [:ul {:class (stl/css :node-parent) - :key (:path child)} - [:> folder-node* {:type type - :node child - :folded-token-paths folded-token-paths - :selected-shapes selected-shapes - :is-selected-inside-layout is-selected-inside-layout - :active-theme-tokens active-theme-tokens - :on-token-pill-click on-token-pill-click - :on-pill-context-menu on-pill-context-menu - :on-node-context-menu on-node-context-menu - :tokens-lib tokens-lib - :selected-token-set-id selected-token-set-id}]] - (let [id (:id (:leaf child)) - token (ctob/get-token tokens-lib selected-token-set-id id)] - [:> token-pill* - {:key id - :token token - :selected-shapes selected-shapes - :is-selected-inside-layout is-selected-inside-layout - :active-theme-tokens active-theme-tokens - :on-click on-token-pill-click - :on-context-menu on-pill-context-menu}])))))]))])) + [:div {:class (stl/css :folder-children-wrapper) + :id (str "folder-children-" (:path node))} + (when (seq children) + (for [child sorted-children] + (if (not (:leaf child)) + [:ul {:class (stl/css :node-parent) + :key (:path child)} + [:> folder-node* {:type type + :node child + :folded-token-paths folded-token-paths + :selected-shapes selected-shapes + :is-selected-inside-layout is-selected-inside-layout + :active-theme-tokens active-theme-tokens + :on-token-pill-click on-token-pill-click + :on-pill-context-menu on-pill-context-menu + :on-node-context-menu on-node-context-menu + :tokens-lib tokens-lib + :selected-token-set-id selected-token-set-id}]] + (let [id (:id (:leaf child)) + token (ctob/get-token tokens-lib selected-token-set-id id)] + [:> token-pill* + {:key id + :token token + :selected-shapes selected-shapes + :is-selected-inside-layout is-selected-inside-layout + :active-theme-tokens active-theme-tokens + :on-click on-token-pill-click + :on-context-menu on-pill-context-menu}]))))])])) (def ^:private schema:token-tree [:map @@ -124,19 +140,29 @@ on-pill-context-menu on-node-context-menu]}] (let [separator "." - tree (mf/use-memo - (mf/deps tokens) - (fn [] - (->> (cpn/build-tree-root tokens separator) - (d/natural-sort-by :name)))) - can-edit? (:can-edit (deref refs/permissions)) + raw-tree (mf/with-memo [tokens] + (cpn/build-tree-root tokens separator)) + permissions (mf/use-ctx ctx/permissions) + can-edit? (:can-edit permissions) on-node-context-menu (mf/use-fn (mf/deps can-edit? on-node-context-menu) (fn [event node] (when can-edit? - (on-node-context-menu event node))))] + (on-node-context-menu event node)))) + + ordered-nodes (mf/with-memo [raw-tree] + (let [[leafs groups] + (reduce (fn [[l g] item] + (if (:leaf item) + [(conj l item) g] + [l (conj g item)])) + [[] []] + raw-tree) + sorted-leafs (d/natural-sort-by :name leafs) + sorted-groups (d/natural-sort-by :name groups)] + (concat sorted-leafs sorted-groups)))] [:div {:class (stl/css :token-tree-wrapper)} - (for [node tree] + (for [node ordered-nodes] (if (:leaf node) (let [token (ctob/get-token tokens-lib selected-token-set-id (get-in node [:leaf :id]))] [:> token-pill* From 0e399b7ad851677501060ff48f14bfc1a92c020f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 19 May 2026 20:51:37 +0200 Subject: [PATCH 28/53] :wrench: Change the path to the cache directories in the custom runner --- .github/workflows/tests.yml | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e4b2d49efc..9e2c4b18d9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,8 +27,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -91,8 +91,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -110,8 +110,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - uses: actions/checkout@v6 @@ -165,8 +165,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -191,8 +191,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -220,8 +220,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs services: postgres: @@ -264,8 +264,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -283,8 +283,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -308,8 +308,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration @@ -344,8 +344,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration @@ -380,8 +380,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration From d574ec4ed2a869bcefb36c54ecae54784f80e33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 19 May 2026 20:51:37 +0200 Subject: [PATCH 29/53] :wrench: Change the path to the cache directories in the custom runner --- .github/workflows/tests.yml | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e4b2d49efc..9e2c4b18d9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,8 +27,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -91,8 +91,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -110,8 +110,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - uses: actions/checkout@v6 @@ -165,8 +165,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -191,8 +191,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -220,8 +220,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs services: postgres: @@ -264,8 +264,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -283,8 +283,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository @@ -308,8 +308,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration @@ -344,8 +344,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration @@ -380,8 +380,8 @@ jobs: container: image: penpotapp/devenv:latest volumes: - - /tmp/.m2:/root/.m2 - - /tmp/.gitlibs:/root/.gitlibs + - /var/cache/github-runner/m2:/root/.m2 + - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration From 3fd114550f546f34b1ae6b718376ce88a8addb5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 21 May 2026 19:50:12 +0200 Subject: [PATCH 30/53] :bug: Fix library update tab UX (#9812) * :bug: Fix update library modal UI not working properly when updating a lib * :sparkles: Add playwright test for bug 14214 --- .../data/workspace/get-file-14214_main.json | 236 +++++++++++++++++ .../data/workspace/get-file-14214_shared.json | 243 ++++++++++++++++++ .../workspace/get-file-libraries-14214.json | 1 + .../get-team-shared-files-14214.json | 224 ++++++++++++++++ .../ui/specs/workspace-shared-library.spec.js | 48 ++++ .../app/main/data/workspace/libraries.cljs | 2 +- 6 files changed, 753 insertions(+), 1 deletion(-) create mode 100644 frontend/playwright/data/workspace/get-file-14214_main.json create mode 100644 frontend/playwright/data/workspace/get-file-14214_shared.json create mode 100644 frontend/playwright/data/workspace/get-file-libraries-14214.json create mode 100644 frontend/playwright/data/workspace/get-team-shared-files-14214.json diff --git a/frontend/playwright/data/workspace/get-file-14214_main.json b/frontend/playwright/data/workspace/get-file-14214_main.json new file mode 100644 index 0000000000..fe64ae93d8 --- /dev/null +++ b/frontend/playwright/data/workspace/get-file-14214_main.json @@ -0,0 +1,236 @@ +{ + "~:features": { + "~#set": [ + "layout/grid", + "styles/v2", + "fdata/objects-map", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true, + "~:can-read": true, + "~:is-logged": true + }, + "~:has-media-trimmed": false, + "~:comment-thread-seqn": 0, + "~:name": "import component", + "~:revn": 6, + "~:modified-at": "~m1730384055106", + "~:vern": 0, + "~:id": "~u3622460c-3408-81e2-8005-2fd0e55888b7", + "~:is-shared": false, + "~:version": 56, + "~:project-id": "~u3622460c-3408-81e2-8005-2fc9059741e0", + "~:created-at": "~m1730103423332", + "~:data": { + "~:pages": [ + "~u3622460c-3408-81e2-8005-2fd0e55888b8" + ], + "~:pages-index": { + "~u3622460c-3408-81e2-8005-2fd0e55888b8": { + "~:options": {}, + "~:objects": { + "~u00000000-0000-0000-0000-000000000000": { + "~#shape": { + "~:y": 0, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:name": "Root Frame", + "~:width": 0.01, + "~:type": "~:frame", + "~:points": [ + {"~#point": {"~:x": 0.0, "~:y": 0.0}}, + {"~#point": {"~:x": 0.01, "~:y": 0.0}}, + {"~#point": {"~:x": 0.01, "~:y": 0.01}}, + {"~#point": {"~:x": 0.0, "~:y": 0.01}} + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:id": "~u00000000-0000-0000-0000-000000000000", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 0, + "~:proportion": 1.0, + "~:selrect": { + "~#rect": { + "~:x": 0, "~:y": 0, + "~:width": 0.01, "~:height": 0.01, + "~:x1": 0, "~:y1": 0, + "~:x2": 0.01, "~:y2": 0.01 + } + }, + "~:fills": [{"~:fill-color": "#FFFFFF", "~:fill-opacity": 1}], + "~:flip-x": null, + "~:height": 0.01, + "~:flip-y": null, + "~:shapes": [ + "~u2e0995e6-d90f-80ed-8005-2fd17ece8809" + ] + } + }, + "~u2e0995e6-d90f-80ed-8005-2fd17ece8809": { + "~#shape": { + "~:y": 221, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:hide-in-viewer": true, + "~:name": "Rectangle", + "~:width": 237, + "~:type": "~:frame", + "~:points": [ + {"~#point": {"~:x": 234, "~:y": 221}}, + {"~#point": {"~:x": 471, "~:y": 221}}, + {"~#point": {"~:x": 471, "~:y": 382}}, + {"~#point": {"~:x": 234, "~:y": 382}} + ], + "~:component-root": true, + "~:shape-ref": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:show-content": true, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd17ece8809", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:component-id": "~u2e0995e6-d90f-80ed-8005-2fd0c20489ce", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 234, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 234, "~:y": 221, + "~:width": 237, "~:height": 161, + "~:x1": 234, "~:y1": 221, + "~:x2": 471, "~:y2": 382 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": 161, + "~:component-file": "~u3622460c-3408-81e2-8005-2fc938010233", + "~:flip-y": null, + "~:shapes": [ + "~u2e0995e6-d90f-80ed-8005-2fd17ece880a" + ] + } + }, + "~u2e0995e6-d90f-80ed-8005-2fd17ece880a": { + "~#shape": { + "~:y": 221, + "~:r1": 0, + "~:r2": 0, + "~:r3": 0, + "~:r4": 0, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Rectangle", + "~:width": 237, + "~:type": "~:rect", + "~:points": [ + {"~#point": {"~:x": 234, "~:y": 221}}, + {"~#point": {"~:x": 471, "~:y": 221}}, + {"~#point": {"~:x": 471, "~:y": 382}}, + {"~#point": {"~:x": 234, "~:y": 382}} + ], + "~:shape-ref": "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183", + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:constraints-v": "~:scale", + "~:constraints-h": "~:scale", + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd17ece880a", + "~:parent-id": "~u2e0995e6-d90f-80ed-8005-2fd17ece8809", + "~:frame-id": "~u2e0995e6-d90f-80ed-8005-2fd17ece8809", + "~:strokes": [], + "~:x": 234, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 234, "~:y": 221, + "~:width": 237, "~:height": 161, + "~:x1": 234, "~:y1": 221, + "~:x2": 471, "~:y2": 382 + } + }, + "~:fills": [{"~:fill-color": "#B1B2B5", "~:fill-opacity": 1}], + "~:flip-x": null, + "~:ry": 0, + "~:height": 161, + "~:flip-y": null + } + } + }, + "~:id": "~u3622460c-3408-81e2-8005-2fd0e55888b8", + "~:name": "Page 1", + "~:background": "#e8e9ea" + } + }, + "~:id": "~u3622460c-3408-81e2-8005-2fd0e55888b7", + "~:options": { + "~:components-v2": true + }, + "~:components": {} + } +} diff --git a/frontend/playwright/data/workspace/get-file-14214_shared.json b/frontend/playwright/data/workspace/get-file-14214_shared.json new file mode 100644 index 0000000000..f82c06cafb --- /dev/null +++ b/frontend/playwright/data/workspace/get-file-14214_shared.json @@ -0,0 +1,243 @@ +{ + "~:features": { + "~#set": [ + "layout/grid", + "styles/v2", + "fdata/objects-map", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true, + "~:can-read": true, + "~:is-logged": true + }, + "~:has-media-trimmed": true, + "~:comment-thread-seqn": 0, + "~:name": "published component", + "~:revn": 3, + "~:modified-at": "~m1730103592325", + "~:vern": 0, + "~:id": "~u3622460c-3408-81e2-8005-2fc938010233", + "~:is-shared": true, + "~:version": 56, + "~:project-id": "~u3622460c-3408-81e2-8005-2fc9059741e0", + "~:created-at": "~m1730101410834", + "~:data": { + "~:pages": [ + "~u3622460c-3408-81e2-8005-2fc938010234" + ], + "~:pages-index": { + "~u3622460c-3408-81e2-8005-2fc938010234": { + "~:options": {}, + "~:objects": { + "~u00000000-0000-0000-0000-000000000000": { + "~#shape": { + "~:y": 0, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:name": "Root Frame", + "~:width": 0.01, + "~:type": "~:frame", + "~:points": [ + {"~#point": {"~:x": 0.0, "~:y": 0.0}}, + {"~#point": {"~:x": 0.01, "~:y": 0.0}}, + {"~#point": {"~:x": 0.01, "~:y": 0.01}}, + {"~#point": {"~:x": 0.0, "~:y": 0.01}} + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:id": "~u00000000-0000-0000-0000-000000000000", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 0, + "~:proportion": 1.0, + "~:selrect": { + "~#rect": { + "~:x": 0, "~:y": 0, + "~:width": 0.01, "~:height": 0.01, + "~:x1": 0, "~:y1": 0, + "~:x2": 0.01, "~:y2": 0.01 + } + }, + "~:fills": [{"~:fill-color": "#FFFFFF", "~:fill-opacity": 1}], + "~:flip-x": null, + "~:height": 0.01, + "~:flip-y": null, + "~:shapes": [ + "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a" + ] + } + }, + "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183": { + "~#shape": { + "~:y": 214, + "~:r1": 0, + "~:r2": 0, + "~:r3": 0, + "~:r4": 0, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Rectangle", + "~:width": 237, + "~:type": "~:rect", + "~:points": [ + {"~#point": {"~:x": 238, "~:y": 214}}, + {"~#point": {"~:x": 475, "~:y": 214}}, + {"~#point": {"~:x": 475, "~:y": 375}}, + {"~#point": {"~:x": 238, "~:y": 375}} + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:constraints-v": "~:scale", + "~:constraints-h": "~:scale", + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183", + "~:parent-id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:frame-id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:strokes": [], + "~:x": 238, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 238, "~:y": 214, + "~:width": 237, "~:height": 161, + "~:x1": 238, "~:y1": 214, + "~:x2": 475, "~:y2": 375 + } + }, + "~:fills": [{"~:fill-color": "#3656b4", "~:fill-opacity": 1}], + "~:flip-x": null, + "~:ry": 0, + "~:height": 161, + "~:flip-y": null + } + }, + "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a": { + "~#shape": { + "~:y": 214, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:hide-in-viewer": true, + "~:name": "Rectangle", + "~:width": 237, + "~:type": "~:frame", + "~:points": [ + {"~#point": {"~:x": 238, "~:y": 214}}, + {"~#point": {"~:x": 475, "~:y": 214}}, + {"~#point": {"~:x": 475, "~:y": 375}}, + {"~#point": {"~:x": 238, "~:y": 375}} + ], + "~:component-root": true, + "~:show-content": true, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:component-id": "~u2e0995e6-d90f-80ed-8005-2fd0c20489ce", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 238, + "~:main-instance": true, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 238, "~:y": 214, + "~:width": 237, "~:height": 161, + "~:x1": 238, "~:y1": 214, + "~:x2": 475, "~:y2": 375 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": 161, + "~:component-file": "~u3622460c-3408-81e2-8005-2fc938010233", + "~:flip-y": null, + "~:shapes": [ + "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183" + ] + } + } + }, + "~:id": "~u3622460c-3408-81e2-8005-2fc938010234", + "~:name": "Page 1" + } + }, + "~:id": "~u3622460c-3408-81e2-8005-2fc938010233", + "~:options": { + "~:components-v2": true + }, + "~:components": { + "~u2e0995e6-d90f-80ed-8005-2fd0c20489ce": { + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd0c20489ce", + "~:name": "Rectangle", + "~:path": "", + "~:modified-at": "~m1730103592327", + "~:main-instance-id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:main-instance-page": "~u3622460c-3408-81e2-8005-2fc938010234" + } + } + } +} diff --git a/frontend/playwright/data/workspace/get-file-libraries-14214.json b/frontend/playwright/data/workspace/get-file-libraries-14214.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/frontend/playwright/data/workspace/get-file-libraries-14214.json @@ -0,0 +1 @@ +[] diff --git a/frontend/playwright/data/workspace/get-team-shared-files-14214.json b/frontend/playwright/data/workspace/get-team-shared-files-14214.json new file mode 100644 index 0000000000..bfda81bea9 --- /dev/null +++ b/frontend/playwright/data/workspace/get-team-shared-files-14214.json @@ -0,0 +1,224 @@ +{ + "~#set": [ + { + "~:name": "published component", + "~:revn": 3, + "~:modified-at": "~m1730103592325", + "~:vern": 0, + "~:thumbnail-uri": "http://localhost:3449/assets/by-id/878a76a2-6235-4541-ba8a-d4f17cf5253c", + "~:id": "~u3622460c-3408-81e2-8005-2fc938010233", + "~:is-shared": true, + "~:project-id": "~u3622460c-3408-81e2-8005-2fc9059741e0", + "~:created-at": "~m1730101410834", + "~:library-summary": { + "~:components": { + "~:count": 1, + "~:sample": [ + { + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd0c20489ce", + "~:name": "Rectangle", + "~:path": "", + "~:modified-at": "~m1730103592327", + "~:main-instance-id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:main-instance-page": "~u3622460c-3408-81e2-8005-2fc938010234", + "~:objects": { + "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a": { + "~#shape": { + "~:y": 214, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:hide-in-viewer": true, + "~:name": "Rectangle", + "~:width": 237, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 238, + "~:y": 214 + } + }, + { + "~#point": { + "~:x": 475, + "~:y": 214 + } + }, + { + "~#point": { + "~:x": 475, + "~:y": 375 + } + }, + { + "~#point": { + "~:x": 238, + "~:y": 375 + } + } + ], + "~:component-root": true, + "~:show-content": true, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:component-id": "~u2e0995e6-d90f-80ed-8005-2fd0c20489ce", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 238, + "~:main-instance": true, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 238, + "~:y": 214, + "~:width": 237, + "~:height": 161, + "~:x1": 238, + "~:y1": 214, + "~:x2": 475, + "~:y2": 375 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": 161, + "~:component-file": "~u3622460c-3408-81e2-8005-2fc938010233", + "~:flip-y": null, + "~:shapes": [ + "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183" + ] + } + }, + "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183": { + "~#shape": { + "~:y": 214, + "~:r1": 0, + "~:r2": 0, + "~:r3": 0, + "~:r4": 0, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Rectangle", + "~:width": 237, + "~:type": "~:rect", + "~:points": [ + { + "~#point": { + "~:x": 238, + "~:y": 214 + } + }, + { + "~#point": { + "~:x": 475, + "~:y": 214 + } + }, + { + "~#point": { + "~:x": 475, + "~:y": 375 + } + }, + { + "~#point": { + "~:x": 238, + "~:y": 375 + } + } + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:constraints-v": "~:scale", + "~:constraints-h": "~:scale", + "~:id": "~u2e0995e6-d90f-80ed-8005-2fd0bd35e183", + "~:parent-id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:frame-id": "~u2e0995e6-d90f-80ed-8005-2fd0c2033a5a", + "~:strokes": [], + "~:x": 238, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 238, + "~:y": 214, + "~:width": 237, + "~:height": 161, + "~:x1": 238, + "~:y1": 214, + "~:x2": 475, + "~:y2": 375 + } + }, + "~:fills": [ + { + "~:fill-color": "#3656b4", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:ry": 0, + "~:height": 161, + "~:flip-y": null + } + } + } + } + ] + }, + "~:media": { + "~:count": 0, + "~:sample": [] + }, + "~:colors": { + "~:count": 0, + "~:sample": [] + }, + "~:typographies": { + "~:count": 0, + "~:sample": [] + } + } + } + ] +} diff --git a/frontend/playwright/ui/specs/workspace-shared-library.spec.js b/frontend/playwright/ui/specs/workspace-shared-library.spec.js index 8c312de625..9080be9a09 100644 --- a/frontend/playwright/ui/specs/workspace-shared-library.spec.js +++ b/frontend/playwright/ui/specs/workspace-shared-library.spec.js @@ -110,3 +110,51 @@ test("Bug 10113 - Empty library modal for non-empty library", async ({ workspace.page.getByText("Publish empty library"), ).not.toBeVisible(); }); + +test("BUG 14214 - Updates tab refreshes after syncing a freshly linked library", async ({ + page, +}) => { + const workspace = new WasmWorkspacePage(page); + await workspace.setupEmptyFile(page); + + await workspace.mockRPC( + new RegExp(`get\\-file\\?id=${mainFileId}`), + "workspace/get-file-14214_main.json", + ); + await workspace.mockRPC( + new RegExp(`get\\-file\\?id=${sharedFileId}`), + "workspace/get-file-14214_shared.json", + ); + await workspace.mockRPC( + "get-file-libraries?file-id=*", + "workspace/get-file-libraries-14214.json", + ); + await workspace.mockRPC( + "get-team-shared-files?team-id=*", + "workspace/get-team-shared-files-14214.json", + ); + await workspace.mockRPC( + "link-file-to-library", + "workspace/link-file-to-library.json", + ); + + await workspace.goToWorkspace({ fileId: mainFileId, pageId: mainPageId }); + + // Open the library modal + await workspace.clickAssets(); + await workspace.openLibrariesModal(); + await workspace.librariesModal + .getByRole("button", { name: "Connect library" }) + .click(); + + // Switch to the Updates tab — the library should appear as needing update. + await workspace.librariesModal.getByRole("tab", { name: "Updates" }).click(); + + const updatesPanel = workspace.librariesModal.getByRole("tabpanel", { + name: "UPDATES", + }); + await updatesPanel.getByRole("button", { name: "Update" }).click(); + await expect( + updatesPanel.getByText("There are no Shared Libraries that need update"), + ).toBeVisible(); +}); diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 5128f054d5..d78c2805bb 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -1162,7 +1162,7 @@ (update [_ state] (if (and (not= library-id (:current-file-id state)) (nil? asset-id)) - (d/assoc-in-when state [:files library-id :synced-at] (ct/now)) + (d/update-in-when state [:files library-id] assoc :synced-at (ct/now)) state)) ptk/WatchEvent From 649efd124e156d06961c2c3b61b181b06779cac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?andr=C3=A9s=20gonz=C3=A1lez?= Date: Fri, 22 May 2026 10:49:39 +0200 Subject: [PATCH 31/53] :books: Update User Guide with 2.6 features (#9768) --- docs/img/customfonts-download.webp | Bin 0 -> 8746 bytes .../41-design-tab-token-dropdown.webp | Bin 0 -> 34244 bytes docs/img/layers/pages-separator.webp | Bin 0 -> 3844 bytes .../libraries-import-tokens-button.webp | Bin 0 -> 27906 bytes .../libraries-import-tokens-confirm.webp | Bin 0 -> 30480 bytes docs/img/objects/board-copy-as-image.webp | Bin 0 -> 55810 bytes .../history-preview-banner.webp | Bin 0 -> 39850 bytes .../history-preview-menu.webp | Bin 0 -> 14142 bytes .../workspace-basics/pixel-grid-color.webp | Bin 0 -> 8556 bytes .../ruler-guide-pill-edit.webp | Bin 0 -> 120464 bytes docs/user-guide/account-teams/comments.njk | 1 + docs/user-guide/design-systems/assets.njk | 9 +- .../design-systems/design-tokens.njk | 19 ++++ docs/user-guide/design-systems/libraries.njk | 20 ++++ docs/user-guide/designing/color-stroke.njk | 5 +- .../user-guide/designing/flexible-layouts.njk | 2 +- docs/user-guide/designing/layers.njk | 12 ++- docs/user-guide/designing/text-typo.njk | 11 +- .../user-guide/designing/workspace-basics.njk | 55 +++++++++- docs/user-guide/first-steps/shortcuts.njk | 99 ++++++++++++++++++ 20 files changed, 222 insertions(+), 11 deletions(-) create mode 100644 docs/img/customfonts-download.webp create mode 100644 docs/img/design-tokens/41-design-tab-token-dropdown.webp create mode 100644 docs/img/layers/pages-separator.webp create mode 100644 docs/img/libraries/libraries-import-tokens-button.webp create mode 100644 docs/img/libraries/libraries-import-tokens-confirm.webp create mode 100644 docs/img/objects/board-copy-as-image.webp create mode 100644 docs/img/workspace-basics/history-preview-banner.webp create mode 100644 docs/img/workspace-basics/history-preview-menu.webp create mode 100644 docs/img/workspace-basics/pixel-grid-color.webp create mode 100644 docs/img/workspace-basics/ruler-guide-pill-edit.webp diff --git a/docs/img/customfonts-download.webp b/docs/img/customfonts-download.webp new file mode 100644 index 0000000000000000000000000000000000000000..cfe9ea98a9096f23016561416947bd9246bcb479 GIT binary patch literal 8746 zcmV+_BGuheNk&E@A^-qaMM6+kP&iB#A^-p{pF$=86$j%sk`z@>=O6XJ!ofQtCV*N` z4GsoDupGgSw(*u|7vk~_KVMt?xR=)1P7gp5Oz61Kds!^l7=UkJtd^s`TbBZ{$k`c4 zA`j@Dd0CH~UtykjMceN1>2oTpm~&Jc7dG4W9dN`e7wgF8u%I5>`~4M}@6493nv1{XGFQYkEXZJ3bb=sans|%Ba}h6X!<$GD(nQ$mrYvHb zCv(Le*DKzZ6j?NNQ^oy7JcG9$t&Wp9v2A@~b!^*K#p*b_d$Hb& zwQFs&&aT6@Z6wM4_q+d{NFZqo@7{klY$GZ1RQJpbePgJezR7>wY?up2m?+F#+7v1a zkzn{4Emu_`QVd6Ta8(rC1z5t=6qas{CrecnqGEV*ysLJy04Q!o%d&XWQTMw%#kR?{ zEa7z2E#X#T^+nFL1cyU#Xb^|2F~@b~9qkqAh~{*wQt6V_QVI2;qvvs;FCvli2|Edg zmPqwfDwVE^_gFwzP9jNiG&DzN&&0BV z?bTh0T98zwQaP%lJ{TxCseAvEcLJF3I7yP-M=(BG=?3-^GZkatsYQH*yh&vM-Sg1jCqI7ww+irKbm&+BkIm*jtM^)p ztNv9upQW(SO(kBYV}mwz8#}Q-06Od0THL(()oTr83D0C7`);U(K-81|o2C>pcvF!T zR;!4isi(6jDsB)R!e{V$$2|cf>yxzrOR4&?Jz&2)BwG8|{-bB|@iRULreZ4{6aa;) z4V%tpEp*Qh4W;9m&o85Uh{YOw?@qk64kLKp{kl{kJ#7Ei82F%Qf8a0s9UvRw5UbPr z1UMpmQnmq`c%%_Eo!!t`xVo;Usy}~`GN{E5`iih!UB}71K`06vfyiyR1F?XZh4UGL zH_j3Ymn@idvF$2jTTyKRG2>4a#jF!MT*4plLj(fRiq{O+msabQvq*!X%|m^*y{w`7 z5761jzTLkZpHYBMMx<^ESRb#Ir*M~2e09)fbWS+4>YvDkqmm7s5CC7O{AJKd7$F)W z$A_G^g=bUaFOFyQ?7jhwBGkwEl#U;czuj-s5Rao4aZFc^`xVEAC!=%}&aRXayZpAN zoFMGics@wMCa}0EgUO4F!>2{L$bRX7VIPFCk2ATn_1#*&5Ow{13=!vt?Y8cs#v#w-%wAQrYTj)mrL@QL~ zwkgbQm9^Y4k!edJoGJ)mbFOgwVJa~}-eTL0#3aQRvc_|guy__)i(weQ@m$wj;yz8r z_Pni+%Ow(LWun&a7@q>6{%QD30Ki=C)37{cb_r%IjR0#Y#it-qHNhjmNxrw^db@$# zpZmEkA90sC*?cOs3_f)#R~f6FcEJg`7&P&gwR$pWqoHC#rj?B(GIHum3&;O3bt-2e zcP6Lq?7uEVD;6Ar?Ht1tWIT&y9V4gqGB#q0pGtUl!ex{+*kC1z@q}61P`WdbqNJu^ zt*!-F6zhG1@hK4T{pGBtH97aJcW4>s6)1tF{604y*(hLnd<7GPOEzLFaG9w+qA`Xt z^(p|4lFk8`AGW9cc|js)FCEP!S4m~?(w-}2LJ>av@ZZL&*}xqq1cJ}{@ZmSEgY%4~ z$w47+z1Ee`{qVyN&qB{?*uxJ${0Bv=p7xrX#Vi$|6nN;g^BP&}zqj73E5)tZ`Qi_H zr+7?ceMAg}-K8O))^-J`Lp34QzYw7H>ut{0kT$3@(W6eQcn@E&0&n&=V*?AOyIi4?Kk~WFuyg!qwjxqFtDRbwyW7_I5tD1FDmK-m z^|!{$^&{n4YK!g{kDY{(!DhXwEQiifv-}r`%BAZwHOrtNus&0_+z0?nyG0c{XC(u*J+pSQ9p#3fHxSu3+t?Spu1w8&;E*W)M~a5XtPW(FKb zl^MQAQOe4U1a;9H(8B_|2rP;;0H1&gqK}LL!Gnxq;uA%Zx-1d&2F)tt9ymvH~hEwHOYSg4oy`n;3 zXk>aS4Iyk`E^v~h3?Jy}=7jpzyU9QM7%&nQ2n7h;DQi(Hjx~@8xecM=P;)mnl^r+| zFF~LHZe8wHjeQu+FGgTPb5uAPVnN`#7&!j$T|5Bs`;IFFRFOhA$V2* zD7&a8xMunplLA~wSDBup&?#OBxyF`8!s~HE%c1Z zy(HzQVaZc^>&2CZ>bg~$_r?{Yk#?DNNTDCWDM{d`W~~%SEB9OguEhjlmUK^BU_}5Mf*TEyrCd-@D!o+ZmNZ^;hOhdl$S6+Fg7N_7d zf5o#bltAas$xTPkN}XPLWn)-P@H?}v)xJylC2)1#-a;}ys{1*?ZH%0F|4BV52liE~8@g0BS{*s*!=_IGOIJ8dY zO}T+QpvK4h2EdTeF`9qg|4rp5X4>g1=U>GlttL11ql;rD?hZ!npij@tfyFeTAj}mI z-r|-QwXq%WFjV!CwGD}G^e;Q=ZYpd;--yl`ZbdbYo?d*1p9>GS3fdl5>uYS0YYeyI z#rj_V_~UnoXt#(>nluL!gQ|-xtxw$SGzB8_);QW<8Jsm-wSD7mr;~$>bKyJ=RND1s zTfr6L4UO6HJ1m(Lworu>vgyIX#Fna!+B9$vJn+D}#2-M_a(@h1d8mgohx_ljibob) ze7JwnRlJbF6%q{HZBj0zUsyUD6g_21Hqx0>)iCW6pD;A&RFGbktRLdc-}G_=W-lt4;K zAtd|q?U3%K0>vp$7XZ}rG6E~+%|Xg_HbHr9QSxIby3->o@c_eLEC<^FDA zO%K%m+NRzj z;mg$k)42tv6rF}eG2;*0CW>dT0d32TdN9*c(9=~XI{DjhL#nGE>q4Pa=WxPAr>vN) z{Z7-V6^as)mAipwrQSDxbkdFjGznDQGQ53&t^tvdD<@FsBxd0i~A;Ll0+4!NC>mhU|fcY4VMQYfCrA z#MZ8yUYijRsY|vjif2F=rxFV4a{!eZ%6Rr_0m?{+AD^4Sr!4DVYo+^U19UUehKJKB zNt>r;oM@}Y`sHjB*&N^jZeJ&}jU!};*%(c@3;c`b<@x6&hOAW%ThSwLn`C>X|52^y z`!kOi)d?qI%d6H3;@-YC*O+9PVzAtPK$Y>9jn3(Q#Nw$%EcBDVI*A>nqo!`L%*u!J ztWuTPtrG>09nT2_aWtVl(mTgD;*A(c_{uyc1UJ8lC#5rG0(cKMaw5FyenGWP_qM*AhER)A#QLbLEh@%I9AA6g&v?D0qO zWvg=mXLkzUl8Zu#OECCH9(`tlgjtZ`WUc7(nY2(^|CmI#MtwYR;|=TFzun2D|Zwu!=js<>b$8DuG_)N+B^Ut z7H4ZuxhR0UWgQ0XPs(BI5~o?6FZFWRhUNAJ>o_P|t_y&Wl0*TZ4kiHAOu@iz8W!v$ zq8PVxgugQ_77T!TzVrl2l>Vk7xpd%+gg}gR;jnh1E2gDdC%I>DP7@2gDyF!!Kuujk z7lBk5f)wTnDZOGE00(>X>>{(BxV(O8X+VpPO`2ss6%9PlOvV_qzmE2~+e&!@sH4)B z`u9tpL}M9U36@)>pd#apVJ9ZXsn+dvF-ka8rjye?!vrJGyG9(s*$4XtNOw@umnG#& zLvadXs zkFQBkiUqKT#79Ylu3UckT{#grXS=7~T1&Hdt^_GSl9gqsKOg3TEvs|LOgR?#5o87N zA%SzFi68_XA>VN(o(-)JUcRQHHeh*(fyHIYuG|XEiqcPCP32rZJakLVWfD;V04{bA z^0o?O(Jl&Q#~7(v?qriNp}&Dz;nDUL^eCBnh#~A!X1kM|Ah4R&N<^%nOyHMWLN#p! zX$@_rTM^|`8D^YK8ZOP|_7dz4o;7wYQ;tIbGIp1cQB#8VbUTK!&JE5ax_v!l10NSd z>l+?FKlBV}YSm^%DoTLv6^{^R%ugT+;xNMAb`lzU^&pQfiCa-m7auryeo15=&+n6a z+v>oNdbSPf@QHGj0GiQ5M5%>NRhNRK<{8=}49Fx7IV;LeZ^_M6Ajz(LT?Igd)n3O8 z%y*1&9cn@YFtB0PfhcBKeu{Sy;<}FI+w{?+XzbnVBEZSF2rfF5Z*3BuMpjquJt;iu zcIp=IuYX~rb%B=Uzaj`CzJ)hXyISGbS~lE(e$4^aql?aJ;G|MUH}brM%*w_YE%*`D zPCbB%8Hl)-BF7d9YJKtf1q75lZ}FcG^q>03RlP-YGk3%ZkFbToSvPV44KLN0N?>=kA=Wu zY@0OtYX&|p%$#~AE9>Mz&xo{Ib1RX9$YOxR6okEz0LA@7(Zx59{3oB*#7YX}uFb@e z_t9&ht>+Sgi~xXiijFUM5g4CwN2rwN-GILG?%s1A8{!P{l#@uN`nu)d;8*`>)^%=G=PV2 zA~)6En<;Y(j^h9_7ZqQgk%6_wkEY(tZm3w6f_u(fSF!zA5YE)71^Jt`npUg;-io5< zwPUNJh=+|NionmnEZt1J2e#d@y8Q2GioQH+&TSRtZ{bIt7+kG>W=7ra^saGe=%>Fl zCWi5O(`$EMmP#E{0*0n!AGVeh^`UOkxIE5nFWz0w-W|^GT~F`bPww4MFXrCu^xgja z-t**cngBJ48+D+y;voUUY@#R9Iq2#~pS-3GWA!4k9KNKA1CFHHFYZU!ZQi4eg1K{Vac7%F%w7psB zk6|e*^pv1JkQvm?Qb5h+wceCwU;wz>qmy?7R9CHos2pWZIa4~aymvn#003=O_hh;S z>Z^dq(@Z(MW1qhq@nI$n8c;^@yrDy70U;N0Qk(cj>~CR5S%Dzn;@tZ3J^J@|kxhhX z-Q0WV$v^JxF19I!%dHsdU3|yd=$tb);i}L1@?Gg^>oG#ubMV@u|LH;Fa#c}G%#O%` zGc+#!vimRZLYo*deC7M!>N~1Ly_7qjy(>R1J&}XUyzH{iIW((xy0IJ}PH4FQ@-DWH zWr6}5O%usTrdTD!1dq{gmvz1Vh>g6c8qV#e* zbRu44YuS>QkZkH{fx@6;9Fm;TUQ!_;CnqTs14^CIBo(Y5Mx zcrPoUcQ^hxS~5@;vhysp3YSAHlS`V4CTBXV(u7B>p3p64@{XrMESbjX#U8?eIirj*lwS=xiT~7f%o5O$0LVcP7^+8W%Z-<_9FvTO z@>suI*o)~^u#zQTGZr3|V(MWG!~L#ya+Y39HTZTRsx+-SxWDaDnFe!4Jq>)L<~391 zFu|#VN=Q1z_HmJ@C-9o)X*=TNaJ5;um%46@BJ9_Bgmh;xmSrqUN74T6#&e z3Qdems`S{2UzpG7$4WJDiJ<0I4TUo8v)*P-x}t@~EFbD-v4Z@)Hyp&T+I+CjAk&x^ z6r8AOZIc~s zuJndh-RS4bnMe_JKU|Xu7sOX6fTpQgx!_P}DB%>NB6OCG`z`n4>#!*HwXDY7cwCr(Y841eaR%%rC!d z-4A@NeG-v~Zc7AhUK6-^*@u;Rm8=g}ecUVF|1P9VvTFXp`Pv6W;>1nC<_!*Q-C=^!n|7x6}8QIG6-jfe4incJICS{#HvgM^iOK zeF@_DUt-m5FWwDrce$4?^|DK@0_(23USeIjPdBZ^M{$$b*z(s&%;eZp^_WY)?2mUn zeajst36`sbwJd9-A=Rh4R1?+FJ`=WU?s#jJeXH)lb=7^9mmXH=zZ4s+X>GC_d#2g6 zUiCb5U9U05geZSUMn>x6yrXMVO{xmrW?1;+nj2#a-_*Cq*fZ_+YQz36gk`xy3Rw4F z|KhG{;|J{w6Sj7w#%8(wRBdC+Psbf8HFS|WUIDwq4iQZXEAv-B|J7LEvl%9*8@E?w z*UB!FT{_FCyM=A(a2mE9l=f`6;B0-y8r|Wq&N6np`5;?V!^YGp7-MG~!0EzoNMzO6 z-Z+{iP_;{pk{Zcz|Cq^-P&^ckjf8878AU7Cg!1>oW2st} zfM+C=kFfl`8`CJ&kpAp{Rrpe`_N787)Dkn^G64P98{=(;DP%g3IW_q7Yi~?vMo|mV zuKzq;GQa)UO(w-zVn$7sQW&l|UZx6;jz}eCM{-cok}dSeNz-5#p|+F6dLhJ^V}EZ= zq2I9PyxVhXa&@^#4RZaPWGBWqD*LcpIih@UjN+?HlqM6%`T?Hi6}CT3(oUiF7lc(w5|_8 ziXycpfo9Xf6`p7Um?VN`&Ef54i(T)*N(N|eSJ^rF0Q(udit`wwx1y7)_ljlk|TAD>ax;i@m zC>t5U0hW*30RZ6Ud1rEwC4}>kQ7=gWw6u$W0PA?bqmhx+)nZW5LavhkP<=Sf3LW$o z!VD|LTV11NUOyCHY8yZCPk;P#A#OmhYEqx6k2u15wpPM@=6&|FuM)5t`tHZ>Sbb0< zuW`}>MD-2CEdI>rR07S_jE^o3X;=;la2n9AccAW~FZic#EgR6f@IUOA;&c}`dg+oR z6$;%%6t#)2q16Tr`TiU|cyLm_4d~_iLbJvMF{cLpi&IiuoW@w^pR~!h(55Qr+^)b5 z=9`Kh;^+<@oco7B+ffxJ_KOd1+n$ZuVqk0$j(ux^bjmljW>Ci7PBODF$W9C^f>cHS z+-cI-$GzSeIovqrnxmmRur6rG=Psv@k4e5P#4GsFx3(ZWGXfw$YALjLV7z$!c%T02 z?>!AY*}*SB*5vdL-}ccOb=Mkh-_GjwLtS5`Zu<=)#n;9SXmJSJ4I@@u(-5o z_6};zHCJNcP)%ebmpaYST;eqJ9Nbu9_Jd_H(ksBh<5NUDR9+W`15h;%q+W9(a4;IW&z;HIO4o!I(J)RgXy1-Nt{WRczsi0~>* z!+NPo0MMoIP&K_E_+LQNOh0C+X%p{IIn@<`l@}E+F{<5`ESZFdduN>&6)$ry3c}6~ z0APbxC=%gr9t7p(2o_*79)Qa24IJEmghfu6fPq1SqPxYZ0MxLu`8fa%7{CHnF)HG( zD!QL}!TmU#UX;l=6Bs-KFwO*8yab+1a7Ccyl@_z(F;arO(s+5#DYbG{xUm`zT^}bW zjbxSa9H+_v*w$hmiihElCapzL%Cm!(N1 U_`k}e3=o4Z?JswDAD4Xq0HV7V3jhEB literal 0 HcmV?d00001 diff --git a/docs/img/design-tokens/41-design-tab-token-dropdown.webp b/docs/img/design-tokens/41-design-tab-token-dropdown.webp new file mode 100644 index 0000000000000000000000000000000000000000..c642dc882454a141f0c1a696a786c06eaefb68ca GIT binary patch literal 34244 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 literal 0 HcmV?d00001 diff --git a/docs/img/libraries/libraries-import-tokens-confirm.webp b/docs/img/libraries/libraries-import-tokens-confirm.webp new file mode 100644 index 0000000000000000000000000000000000000000..cc923ac079cc306c9badf0eab2f0826c53e05500 GIT binary patch literal 30480 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 XOogO_4DqO01@TPvpX$Fg_^AK@%PKeS literal 0 HcmV?d00001 diff --git a/docs/img/objects/board-copy-as-image.webp b/docs/img/objects/board-copy-as-image.webp new file mode 100644 index 0000000000000000000000000000000000000000..b9e62408b277a6440d138e24e2e01924a40f5f0f GIT binary patch literal 55810 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 literal 0 HcmV?d00001 diff --git a/docs/img/workspace-basics/ruler-guide-pill-edit.webp b/docs/img/workspace-basics/ruler-guide-pill-edit.webp new file mode 100644 index 0000000000000000000000000000000000000000..987b8108b2069e2817e6f7cac627dcd2d97048c5 GIT binary patch literal 120464 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ΠTx5%(6HXG`)RG2essq?K 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%0D&$Ym2J*_K0U7G?Zr|pNFCU}uUK*|@zisS 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 the workspace

At the workspace, activate the comment tool by clicking the comment icon in the navbar or pressing the C key. More about comments at the Workspace

+

URLs in comments are detected automatically and open in a new browser tab when clicked.

At the View mode

You can activate comments at the View mode by pressing the comments icon at the top navbar. More about comments at the View mode.

diff --git a/docs/user-guide/design-systems/assets.njk b/docs/user-guide/design-systems/assets.njk index b0e0d91b2f..53c2818345 100644 --- a/docs/user-guide/design-systems/assets.njk +++ b/docs/user-guide/design-systems/assets.njk @@ -36,8 +36,10 @@ desc: Use Penpot's asset libraries for reusable design elements! Learn to create +

Semi-transparent colors in the library show their opacity percentage in the asset name.

Typographies

All typography styles created from the text properties (at the right sidebar) are automatically stored at the library. You can also click the “+” to create a new typography style from scratch.

+

Each typography group has its own add button to create a style directly in that group. When editing a typography style, use the delete and duplicate buttons in the typography dialog.