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

This commit is contained in:
Andrey Antukh 2025-05-12 13:44:24 +02:00
commit 94312bb35c
11 changed files with 299 additions and 48 deletions

View file

@ -52,6 +52,7 @@ root.
### :boom: Breaking changes & Deprecations ### :boom: Breaking changes & Deprecations
### :heart: Community contributions (Thank you!) ### :heart: Community contributions (Thank you!)
- Design improvements to the Invitations page with an empty state [GitHub #2608](https://github.com/penpot/penpot/issues/2608) by [@iprithvitharun](https://github.com/iprithvitharun)
### :sparkles: New features ### :sparkles: New features
@ -62,9 +63,9 @@ root.
- Add set selection in create Token themes flow [Taiga #10746](https://tree.taiga.io/project/penpot/issue/10746) - Add set selection in create Token themes flow [Taiga #10746](https://tree.taiga.io/project/penpot/issue/10746)
- Display indicator on not active sets [Taiga #10668](https://tree.taiga.io/project/penpot/issue/10668) - Display indicator on not active sets [Taiga #10668](https://tree.taiga.io/project/penpot/issue/10668)
- Create `input*` wrapper component, and `label*`, `input-field*` and `hint-message*` components [Taiga #10713](https://tree.taiga.io/project/penpot/us/10713) - Create `input*` wrapper component, and `label*`, `input-field*` and `hint-message*` components [Taiga #10713](https://tree.taiga.io/project/penpot/us/10713)
- Fix problem in viewer with the back button [Taiga #10907](https://tree.taiga.io/project/penpot/issue/10907)
### :bug: Bugs fixed ### :bug: Bugs fixed
- Fix problem in viewer with the back button [Taiga #10907](https://tree.taiga.io/project/penpot/issue/10907)
- Fix resize bar background on tokens panel [Taiga #10811](https://tree.taiga.io/project/penpot/issue/10811) - Fix resize bar background on tokens panel [Taiga #10811](https://tree.taiga.io/project/penpot/issue/10811)
- Fix shortcut for history version panel [Taiga #11006](https://tree.taiga.io/project/penpot/issue/11006) - Fix shortcut for history version panel [Taiga #11006](https://tree.taiga.io/project/penpot/issue/11006)
- Fix positioning of comment drafts when near the right / bottom edges of viewport [Taiga #10534](https://tree.taiga.io/project/penpot/issue/10534) - Fix positioning of comment drafts when near the right / bottom edges of viewport [Taiga #10534](https://tree.taiga.io/project/penpot/issue/10534)
@ -90,7 +91,7 @@ root.
- Fix cannot rename Design Token Sets when group of same name exists [Taiga Issue #10773](https://tree.taiga.io/project/penpot/issue/10773) - Fix cannot rename Design Token Sets when group of same name exists [Taiga Issue #10773](https://tree.taiga.io/project/penpot/issue/10773)
- Fix problem when duplicating grid layout [Github #6391](https://github.com/penpot/penpot/issues/6391) - Fix problem when duplicating grid layout [Github #6391](https://github.com/penpot/penpot/issues/6391)
## 2.6.2 (Unreleased) ## 2.6.2
### :bug: Bugs fixed ### :bug: Bugs fixed

View file

@ -208,7 +208,7 @@
[:project-id {:optional true} ::sm/uuid]]) [:project-id {:optional true} ::sm/uuid]])
(defn- migrate-file (defn- migrate-file
[{:keys [::db/conn] :as cfg} {:keys [id] :as file}] [{:keys [::db/conn] :as cfg} {:keys [id] :as file} {:keys [read-only?]}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id) (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)
pmap/*tracked* (pmap/create-tracked)] pmap/*tracked* (pmap/create-tracked)]
(let [;; For avoid unnecesary overhead of creating multiple pointers and (let [;; For avoid unnecesary overhead of creating multiple pointers and
@ -219,43 +219,45 @@
file (-> file file (-> file
(update :data feat.fdata/process-pointers deref) (update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {})) (update :data feat.fdata/process-objects (partial into {}))
(fmg/migrate-file)) (fmg/migrate-file))]
;; When file is migrated, we break the rule of no perform (if (or read-only? (db/read-only? conn))
;; mutations on get operations and update the file with all file
;; migrations applied (let [;; When file is migrated, we break the rule of no perform
;; ;; mutations on get operations and update the file with all
;; WARN: he following code will not work on read-only mode, ;; migrations applied
;; it is a known issue; we keep is not implemented until we file (if (contains? (:features file) "fdata/objects-map")
;; really need this. (feat.fdata/enable-objects-map file)
file (if (contains? (:features file) "fdata/objects-map") file)
(feat.fdata/enable-objects-map file) file (if (contains? (:features file) "fdata/pointer-map")
file) (feat.fdata/enable-pointer-map file)
file (if (contains? (:features file) "fdata/pointer-map") file)]
(feat.fdata/enable-pointer-map file)
file)]
(db/update! conn :file (db/update! conn :file
{:data (blob/encode (:data file)) {:data (blob/encode (:data file))
:version (:version file) :version (:version file)
:features (db/create-array conn "text" (:features file))} :features (db/create-array conn "text" (:features file))}
{:id id}) {:id id}
{::db/return-keys false})
(when (contains? (:features file) "fdata/pointer-map") (when (contains? (:features file) "fdata/pointer-map")
(feat.fdata/persist-pointers! cfg id)) (feat.fdata/persist-pointers! cfg id))
(feat.fmigr/upsert-migrations! conn file) (feat.fmigr/upsert-migrations! conn file)
(feat.fmigr/resolve-applied-migrations cfg file)))) (feat.fmigr/resolve-applied-migrations cfg file))))))
(defn get-file (defn get-file
[{:keys [::db/conn ::wrk/executor] :as cfg} id [{:keys [::db/conn ::wrk/executor] :as cfg} id
& {:keys [project-id & {:keys [project-id
migrate? migrate?
include-deleted? include-deleted?
lock-for-update?] lock-for-update?
preload-pointers?]
:or {include-deleted? false :or {include-deleted? false
lock-for-update? false lock-for-update? false
migrate? true}}] migrate? true
preload-pointers? false}
:as options}]
(assert (db/connection? conn) "expected cfg with valid connection") (assert (db/connection? conn) "expected cfg with valid connection")
@ -273,10 +275,16 @@
;; because it has heavy and synchronous operations for ;; because it has heavy and synchronous operations for
;; decoding file body that are not very friendly with virtual ;; decoding file body that are not very friendly with virtual
;; threads. ;; threads.
file (px/invoke! executor #(decode-row file))] file (px/invoke! executor #(decode-row file))
file (if (and migrate? (fmg/need-migration? file))
(migrate-file cfg file options)
file)]
(if preload-pointers?
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)]
(update file :data feat.fdata/process-pointers deref))
(if (and migrate? (fmg/need-migration? file))
(migrate-file cfg file)
file))) file)))
(defn get-minimal-file (defn get-minimal-file
@ -484,7 +492,7 @@
(let [perms (get-permissions conn profile-id file-id share-id) (let [perms (get-permissions conn profile-id file-id share-id)
file (get-file cfg file-id) file (get-file cfg file-id :read-only? true)
proj (db/get conn :project {:id (:project-id file)}) proj (db/get conn :project {:id (:project-id file)})
@ -741,7 +749,9 @@
:project-id project-id :project-id project-id
:file-id id) :file-id id)
file (get-file cfg id :project-id project-id)] file (get-file cfg id
:project-id project-id
:read-only? true)]
(-> (cfeat/get-team-enabled-features cf/flags team) (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params)) (cfeat/check-client-features! (:features params))

View file

@ -10,7 +10,6 @@
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.features :as cfeat] [app.common.features :as cfeat]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.migrations :as fmg]
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.thumbnails :as thc] [app.common.thumbnails :as thc]
@ -18,7 +17,6 @@
[app.config :as cf] [app.config :as cf]
[app.db :as db] [app.db :as db]
[app.db.sql :as-alias sql] [app.db.sql :as-alias sql]
[app.features.fdata :as feat.fdata]
[app.loggers.audit :as-alias audit] [app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks] [app.loggers.webhooks :as-alias webhooks]
[app.media :as media] [app.media :as media]
@ -200,14 +198,13 @@
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}] (db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
(files/check-read-permissions! conn profile-id file-id) (files/check-read-permissions! conn profile-id file-id)
(let [team (teams/get-team conn (let [team (teams/get-team conn
:profile-id profile-id :profile-id profile-id
:file-id file-id) :file-id file-id)
file (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)] file (files/get-file cfg file-id
(-> (files/get-file cfg file-id :migrate? false) :preload-pointers? true
(update :data feat.fdata/process-pointers deref) :read-only? true)]
(fmg/migrate-file)))]
(-> (cfeat/get-team-enabled-features cf/flags team) (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-file-features! (:features file))) (cfeat/check-file-features! (:features file)))

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View file

@ -33,6 +33,7 @@
[app.main.ui.releases.v2-4] [app.main.ui.releases.v2-4]
[app.main.ui.releases.v2-5] [app.main.ui.releases.v2-5]
[app.main.ui.releases.v2-6] [app.main.ui.releases.v2-6]
[app.main.ui.releases.v2-7]
[app.util.object :as obj] [app.util.object :as obj]
[app.util.timers :as tm] [app.util.timers :as tm]
[rumext.v2 :as mf])) [rumext.v2 :as mf]))
@ -97,4 +98,4 @@
(defmethod rc/render-release-notes "0.0" (defmethod rc/render-release-notes "0.0"
[params] [params]
(rc/render-release-notes (assoc params :version "2.6"))) (rc/render-release-notes (assoc params :version "2.7")))

View file

@ -0,0 +1,142 @@
;; 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 app.main.ui.releases.v2-7
(:require-macros [app.main.style :as stl])
(:require
[app.common.data.macros :as dm]
[app.main.ui.releases.common :as c]
[rumext.v2 :as mf]))
(defmethod c/render-release-notes "2.7"
[{:keys [slide klass next finish navigate version]}]
(mf/html
(case slide
:start
[:div {:class (stl/css-case :modal-overlay true)}
[:div.animated {:class klass}
[:div {:class (stl/css :modal-container)}
[:img {:src "images/features/2.7-slide-0.jpg"
:class (stl/css :start-image)
:border "0"
:alt "Design Tokens make their debut in Penpot!"}]
[:div {:class (stl/css :modal-content)}
[:div {:class (stl/css :modal-header)}
[:h1 {:class (stl/css :modal-title)}
"Whats new in Penpot?"]
[:div {:class (stl/css :version-tag)}
(dm/str "Version " version)]]
[:div {:class (stl/css :features-block)}
[:span {:class (stl/css :feature-title)}
"Penpot 2.7 is out!"]
[:p {:class (stl/css :feature-content)}
"After the huge excitement around our last release. The first-ever native Design Tokens support in a design tool (yay!), were keeping the momentum going with a fresh batch of new features and improvements."]
[:p {:class (stl/css :feature-content)}
"This update brings the first set of upgrades to our new Design Tokens system, a few of the many to come. Weve also expanded who can create sharing prototype links and improved the invitations area. Last but not least, we fixed a bunch of bugs and optimizations that will make the experience more enjoyable for all."]
[:p {:class (stl/css :feature-content)}
"Lets dive in!"]]
[:div {:class (stl/css :navigation)}
[:button {:class (stl/css :next-btn)
:on-click next} "Continue"]]]]]]
0
[:div {:class (stl/css-case :modal-overlay true)}
[:div.animated {:class klass}
[:div {:class (stl/css :modal-container)}
[:img {:src "images/features/2.7-duplicate-set.gif"
:class (stl/css :start-image)
:border "0"
:alt "Design Tokens improvements"}]
[:div {:class (stl/css :modal-content)}
[:div {:class (stl/css :modal-header)}
[:h1 {:class (stl/css :modal-title)}
"Design Tokens improvements"]]
[:div {:class (stl/css :feature)}
[:p {:class (stl/css :feature-content)}
"It hasnt been long since we launched Design Tokens in Penpot (the first native Design Tokens support in a design tool!), and were already rolling out the first set of improvements."]
[:p {:class (stl/css :feature-content)}
"The highlight: you can now duplicate token sets directly from a menu item. A huge time-saver, especially when working from existing sets. Weve also made it easier to create themes by letting you select their set right away, and weve polished some info indicators to make everything a bit clearer. Plus, weve fixed a bunch of early-stage bugs to keep things running smoothly."]]
[:div {:class (stl/css :navigation)}
[:& c/navigation-bullets
{:slide slide
:navigate navigate
:total 3}]
[:button {:on-click next
:class (stl/css :next-btn)} "Continue"]]]]]]
1
[:div {:class (stl/css-case :modal-overlay true)}
[:div.animated {:class klass}
[:div {:class (stl/css :modal-container)}
[:img {:src "images/features/2.7-share.gif"
:class (stl/css :start-image)
:border "0"
:alt "Editors and viewers can now create Share prototype links"}]
[:div {:class (stl/css :modal-content)}
[:div {:class (stl/css :modal-header)}
[:h1 {:class (stl/css :modal-title)}
"Editors and viewers can now create Share prototype links"]]
[:div {:class (stl/css :feature)}
[:p {:class (stl/css :feature-content)}
"From now on, both editors and viewers can create Share Prototype links. Sharing prototypes is key for better team collaboration, no matter the role. Its a common need, team members often have to share presentations without risking any accidental changes to the designs, which means they dont necessarily need editing permissions. In the future, Penpot will introduce more fine-grained control over these permissions."]
[:p {:class (stl/css :feature-content)}
"This update gives editors and viewers the same ability to configure, create, copy, and delete sharing links. A capability that, until now, was limited to owners and admins."]]
[:div {:class (stl/css :navigation)}
[:& c/navigation-bullets
{:slide slide
:navigate navigate
:total 3}]
[:button {:on-click next
:class (stl/css :next-btn)} "Continue"]]]]]]
2
[:div {:class (stl/css-case :modal-overlay true)}
[:div.animated {:class klass}
[:div {:class (stl/css :modal-container)}
[:img {:src "images/features/2.7-invitations.gif"
:class (stl/css :start-image)
:border "0"
:alt "A clearer way to invite your first team members"}]
[:div {:class (stl/css :modal-content)}
[:div {:class (stl/css :modal-header)}
[:h1 {:class (stl/css :modal-title)}
"A clearer way to invite your first team members"]]
[:div {:class (stl/css :feature)}
[:p {:class (stl/css :feature-content)}
"Penpot works perfectly for solo projects, but its always more fun with a team. Thats why weve updated the initial state of the invitations area. Instead of starting blank, it now offers clearer guidance to help you invite your first team members."]
[:p {:class (stl/css :feature-content)}
"This improvement in design and UX writing comes from community member Prithvi Tharun (credit where its due!) Not all open source contributions are about code, and this is a fantastic example of how design and writing make a real difference too."]]
[:div {:class (stl/css :navigation)}
[:& c/navigation-bullets
{:slide slide
:navigate navigate
:total 3}]
[:button {:on-click finish
:class (stl/css :next-btn)} "Let's go"]]]]]])))

View file

@ -0,0 +1,102 @@
// 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
@import "refactor/common-refactor.scss";
.modal-overlay {
@extend .modal-overlay-base;
}
.modal-container {
display: grid;
grid-template-columns: $s-324 1fr;
height: $s-500;
width: $s-888;
border-radius: $br-8;
background-color: var(--modal-background-color);
border: $s-2 solid var(--modal-border-color);
}
.start-image {
width: $s-324;
border-radius: $br-8 0 0 $br-8;
}
.modal-content {
padding: $s-40;
display: grid;
grid-template-rows: auto 1fr $s-32;
gap: $s-24;
a {
color: var(--button-primary-background-color-rest);
}
}
.modal-header {
display: grid;
gap: $s-8;
}
.version-tag {
@include flexCenter;
@include headlineSmallTypography;
height: $s-32;
width: $s-96;
background-color: var(--communication-tag-background-color);
color: var(--communication-tag-foreground-color);
border-radius: $br-8;
}
.modal-title {
@include headlineLargeTypography;
color: var(--modal-title-foreground-color);
}
.features-block {
display: flex;
flex-direction: column;
gap: $s-16;
width: $s-440;
}
.feature {
display: flex;
flex-direction: column;
gap: $s-8;
}
.feature-title {
@include bodyLargeTypography;
color: var(--modal-title-foreground-color);
}
.feature-content {
@include bodyMediumTypography;
margin: 0;
color: var(--modal-text-foreground-color);
}
.feature-list {
@include bodyMediumTypography;
color: var(--modal-text-foreground-color);
list-style: disc;
display: grid;
gap: $s-8;
}
.navigation {
width: 100%;
display: grid;
grid-template-areas: "bullets button";
}
.next-btn {
@extend .button-primary;
width: $s-100;
justify-self: flex-end;
grid-area: button;
}

View file

@ -421,11 +421,9 @@
:uri uri})) :uri uri}))
(rx/catch (rx/catch
(fn [cause] (fn [cause]
(rx/of (ex/raise :type :internal (rx/of {:type :error
:code :export-error :file-id (:id file)
:hint "unexpected error on exporting file" :hint (ex-message cause)})))))))
:file-id (:id file)
:cause cause))))))))
(= format :legacy-zip) (= format :legacy-zip)
(->> (rx/from files) (->> (rx/from files)