From f06d1df5bed8bc7ea5db2d12df10df139f98522e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Fri, 28 Aug 2026 11:54:02 +0200 Subject: [PATCH 1/7] :bug: Align management API with payments service (#11414) --- backend/src/app/http/management.clj | 2 +- backend/src/app/nitrate.clj | 2 +- backend/src/app/srepl/cli.clj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/app/http/management.clj b/backend/src/app/http/management.clj index 507a518e5c..f72c4b6d14 100644 --- a/backend/src/app/http/management.clj +++ b/backend/src/app/http/management.clj @@ -209,7 +209,7 @@ [:enum "customer_service" "low_quality" - "missing_feature" + "missing_features" "other" "switched_service" "too_complex" diff --git a/backend/src/app/nitrate.clj b/backend/src/app/nitrate.clj index 2d7c4e22f7..a189116458 100644 --- a/backend/src/app/nitrate.clj +++ b/backend/src/app/nitrate.clj @@ -245,7 +245,7 @@ [:enum "customer_service" "low_quality" - "missing_feature" + "missing_features" "other" "switched_service" "too_complex" diff --git a/backend/src/app/srepl/cli.clj b/backend/src/app/srepl/cli.clj index dc44047e32..c47043cbad 100644 --- a/backend/src/app/srepl/cli.clj +++ b/backend/src/app/srepl/cli.clj @@ -232,7 +232,7 @@ [:enum "customer_service" "low_quality" - "missing_feature" + "missing_features" "other" "switched_service" "too_complex" From 10e40e62a249f6f28d778244768eff5e5bf9c309 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 28 Aug 2026 13:58:18 +0200 Subject: [PATCH 2/7] :sparkles: Add airgapped check to nitrate (#11421) --- frontend/src/app/main/data/nitrate.cljs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/nitrate.cljs b/frontend/src/app/main/data/nitrate.cljs index 2addcc0429..4be62a2cbf 100644 --- a/frontend/src/app/main/data/nitrate.cljs +++ b/frontend/src/app/main/data/nitrate.cljs @@ -43,15 +43,25 @@ (swap! storage/storage dissoc nitrate-entry-pending-popup-key))) +(def ^:private offline-connectivity + {:licenses false}) + +(defn- air-gapped? + [] + (contains? cf/flags :air-gapped-conf)) + (defn show-nitrate-popup ([popup-type] (show-nitrate-popup popup-type {})) ([popup-type extra-props] (ptk/reify ::show-nitrate-popup ptk/WatchEvent (watch [_ _ _] - (->> (rp/cmd! ::get-nitrate-connectivity {}) - (rx/map (fn [connectivity] - (modal/show popup-type (merge (or connectivity {}) extra-props))))))))) + (if (air-gapped?) + (rx/of (modal/show popup-type (merge offline-connectivity extra-props))) + (->> (rp/cmd! ::get-nitrate-connectivity {}) + (rx/map (fn [connectivity] + (modal/show popup-type + (merge (or connectivity {}) extra-props)))))))))) (defn build-admin-console-url ([path] From c01306734a8433905e8e0cebabe9132adb63bc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Valderrama?= Date: Fri, 28 Aug 2026 14:04:56 +0200 Subject: [PATCH 3/7] :bug: Fix default team and UI labels to use Personal Projects (#11418) * :bug: Fix default team and UI labels to use Personal Projects * :paperclip: Code review --- .../email/request-file-access-yourpenpot-view/en.html | 2 +- .../email/request-file-access-yourpenpot-view/en.txt | 2 +- .../app/email/request-file-access-yourpenpot/en.html | 2 +- .../app/email/request-file-access-yourpenpot/en.txt | 2 +- backend/src/app/email.clj | 4 ++-- backend/src/app/rpc/commands/nitrate.clj | 2 +- backend/src/app/rpc/commands/profile.clj | 2 +- backend/src/app/rpc/commands/teams.clj | 4 ++-- backend/src/app/rpc/management/nitrate.clj | 10 +++++----- .../test/backend_tests/rpc_management_nitrate_test.clj | 2 +- frontend/playwright/ui/pages/DashboardPage.js | 2 +- frontend/playwright/ui/pages/OnboardingPage.js | 2 +- frontend/src/app/main/ui/dashboard/file_menu.cljs | 2 +- frontend/src/app/main/ui/dashboard/fonts.cljs | 2 +- frontend/src/app/main/ui/dashboard/libraries.cljs | 2 +- frontend/src/app/main/ui/dashboard/projects.cljs | 2 +- frontend/src/app/main/ui/dashboard/search.cljs | 2 +- frontend/src/app/main/ui/dashboard/sidebar.cljs | 6 +++--- frontend/src/app/main/ui/dashboard/team.cljs | 8 ++++---- frontend/translations/en.po | 7 ++----- frontend/translations/es.po | 7 ++----- 21 files changed, 34 insertions(+), 40 deletions(-) diff --git a/backend/resources/app/email/request-file-access-yourpenpot-view/en.html b/backend/resources/app/email/request-file-access-yourpenpot-view/en.html index 57f0bbb781..f26a4b65da 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot-view/en.html +++ b/backend/resources/app/email/request-file-access-yourpenpot-view/en.html @@ -191,7 +191,7 @@ file named “{{file-name|abbreviate:25}}”.

- Since this file is in your Penpot team, you can provide access by sending a view-only link. + Since this file is in your Personal Projects, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.

To proceed, please click the button below to generate and send the view-only link:

diff --git a/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt b/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt index 397f3c821d..c52649dd37 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt +++ b/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt @@ -2,7 +2,7 @@ Hello! {{requested-by|abbreviate:25}} ({{requested-by-email}}) wants to have view-only access to the file named “{{file-name|abbreviate:25}}”. -Since this file is in your Penpot team, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes. +Since this file is in your Personal Projects, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes. To proceed, please click the link below to generate and send the view-only link: diff --git a/backend/resources/app/email/request-file-access-yourpenpot/en.html b/backend/resources/app/email/request-file-access-yourpenpot/en.html index ca0b00ee27..cf3161a6b6 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot/en.html +++ b/backend/resources/app/email/request-file-access-yourpenpot/en.html @@ -191,7 +191,7 @@ “{{file-name|abbreviate:25}}”.

- Please note that the file is currently in Your Penpot 's team, so direct access cannot be + Please note that the file is currently in Personal Projects, so direct access cannot be granted. However, you have two options to provide the requested access:

    diff --git a/backend/resources/app/email/request-file-access-yourpenpot/en.txt b/backend/resources/app/email/request-file-access-yourpenpot/en.txt index 81f5d5c72e..e33a0bf80a 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot/en.txt +++ b/backend/resources/app/email/request-file-access-yourpenpot/en.txt @@ -5,7 +5,7 @@ Hello! {{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named “{{file-name|abbreviate:25}}”. -Please note that the file is currently in Your Penpot 's team, so direct access cannot be granted. However, you have two options to provide the requested access: +Please note that the file is currently in Personal Projects, so direct access cannot be granted. However, you have two options to provide the requested access: - Move the File to Another Team: diff --git a/backend/src/app/email.clj b/backend/src/app/email.clj index e069b2908b..120b721781 100644 --- a/backend/src/app/email.clj +++ b/backend/src/app/email.clj @@ -505,13 +505,13 @@ :schema schema:request-file-access)) (def request-file-access-yourpenpot - "File access on Your Penpot request email." + "File access on Personal Projects request email." (template-factory :id ::request-file-access-yourpenpot :schema schema:request-file-access)) (def request-file-access-yourpenpot-view - "File access on Your Penpot view mode request email." + "File access on Personal Projects view mode request email." (template-factory :id ::request-file-access-yourpenpot-view :schema schema:request-file-access)) diff --git a/backend/src/app/rpc/commands/nitrate.clj b/backend/src/app/rpc/commands/nitrate.clj index 8714c5c841..2ca0032949 100644 --- a/backend/src/app/rpc/commands/nitrate.clj +++ b/backend/src/app/rpc/commands/nitrate.clj @@ -336,7 +336,7 @@ (doseq [{:keys [id reassign-to]} teams-to-leave] (teams/leave-team cfg {:profile-id profile-id :id id :reassign-to reassign-to})) - ;; Process organization "Your Penpot" team: keep with prefix if needed, otherwise delete. + ;; Process organization "Personal Projects" team: keep with prefix if needed, otherwise delete. (when default-team-id (if keep-default-team? (db/exec! conn [sql:prefix-team-name-and-unset-default organization-prefix default-team-id]) diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index 114f07be3e..4027efc6a4 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -524,7 +524,7 @@ ;; Penpot back through two paths: ::notify-user-organizations-deletion ;; (during delete-owned-organizations) and ::notify-organization-deletion. ;; Both preserve organization teams unchanged and only prefix or delete - ;; imported "Your Penpot" teams according to whether they still have files. + ;; imported "Personal Projects" teams according to whether they still have files. ;; Let Nitrate clean up the data associated with the deleted Penpot user: ;; owned organizations, remaining memberships, and subscription cancellation. (when (contains? cf/flags :admin-console) diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index ab2a0628a5..17f23fcf9c 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -575,7 +575,7 @@ (set/difference cfeat/frontend-only-features) (set/difference cfeat/no-team-inheritable-features)) params {:profile-id profile-id - :name "Your Penpot" + :name "Personal Projects" :features features :organization-id organization-id :is-default true} @@ -829,7 +829,7 @@ :code :only-owner-can-delete-team)) ;; Protect the user's personal default team from deletion. - ;; Organization-scoped default teams ("Your Penpot") are allowed to be deleted when they have no files. + ;; Organization-scoped default teams ("Personal Projects") are allowed to be deleted when they have no files. (when (and (:is-default team) (not in-organization?)) (ex/raise :type :validation :code :non-deletable-team diff --git a/backend/src/app/rpc/management/nitrate.clj b/backend/src/app/rpc/management/nitrate.clj index 5df54b7e7f..9dc140ba4a 100644 --- a/backend/src/app/rpc/management/nitrate.clj +++ b/backend/src/app/rpc/management/nitrate.clj @@ -318,7 +318,7 @@ RETURNING id, deleted_at;") (defn manage-deleted-organization-teams "For a deleted organization, preserve organization teams unchanged and only prefix or - delete member Your Penpot teams depending on whether they still contain files." + delete member Personal Projects teams depending on whether they still contain files." [cfg {:keys [organization-id organization-name teams]}] (let [all-team-ids (->> teams (map :id) @@ -347,13 +347,13 @@ RETURNING id, deleted_at;") teams-to-delete (->> your-penpot-team-ids (remove teams-with-files) (into []))] ;; Organization teams move to the fallback organization unchanged. Only imported - ;; Your Penpot teams keep the organization prefix when they still have files. + ;; Personal Projects teams keep the organization prefix when they still have files. (when (seq teams-to-prefix) (db/exec! conn [sql:prefix-teams-name-and-unset-default organization-prefix (db/create-array conn "uuid" teams-to-prefix)])) - ;; Empty imported Your Penpot teams disappear entirely. + ;; Empty imported Personal Projects teams disappear entirely. (soft-delete-teams! cfg teams-to-delete) (notifications/notify-organization-deletion cfg organization-id organization-name all-team-ids teams-to-delete) @@ -362,7 +362,7 @@ RETURNING id, deleted_at;") (sv/defmethod ::notify-organization-deletion "For a deleted organization, preserve organization teams and only prefix or delete - imported Your Penpot teams before notifying connected users." + imported Personal Projects before notifying connected users." {::doc/added "2.18" ::sm/params schema:notify-organization-deletion ::rpc/auth false} @@ -382,7 +382,7 @@ RETURNING id, deleted_at;") (sv/defmethod ::notify-user-organizations-deletion "For a given user, find all owned organizations and apply the deleted-organization - transfer rules to their imported Your Penpot teams." + transfer rules to their imported Personal Projects teams." {::doc/added "2.18" ::sm/params schema:notify-user-organizations-deletion ::nitrate/sso false} diff --git a/backend/test/backend_tests/rpc_management_nitrate_test.clj b/backend/test/backend_tests/rpc_management_nitrate_test.clj index 455f875fd3..aabf58f31d 100644 --- a/backend/test/backend_tests/rpc_management_nitrate_test.clj +++ b/backend/test/backend_tests/rpc_management_nitrate_test.clj @@ -268,7 +268,7 @@ new-team (th/db-get :team {:id new-team-id})] (t/is (th/success? out)) (t/is (= 1 (count (set/difference after-teams before-teams)))) - (t/is (= "Your Penpot" (:name new-team))) + (t/is (= "Personal Projects" (:name new-team))) (t/is (true? (:is-default new-team)))))) (t/deftest get-managed-profiles-returns-unique-members-for-owned-teams diff --git a/frontend/playwright/ui/pages/DashboardPage.js b/frontend/playwright/ui/pages/DashboardPage.js index 4dee04f18e..eb4bea0b9f 100644 --- a/frontend/playwright/ui/pages/DashboardPage.js +++ b/frontend/playwright/ui/pages/DashboardPage.js @@ -86,7 +86,7 @@ export class DashboardPage extends BaseWebSocketPage { this.searchInput = page.getByPlaceholder("Search…"); this.teamDropdown = this.sidebar.getByRole("button", { - name: "Your Penpot", + name: "Personal Projects", }); this.userAccount = this.sidebar.getByRole("button", { name: /Princesa Leia/, diff --git a/frontend/playwright/ui/pages/OnboardingPage.js b/frontend/playwright/ui/pages/OnboardingPage.js index bbf59bbab6..0fe447463e 100644 --- a/frontend/playwright/ui/pages/OnboardingPage.js +++ b/frontend/playwright/ui/pages/OnboardingPage.js @@ -7,7 +7,7 @@ export class OnboardingPage extends BaseWebSocketPage { } async fillOnboardingInputsStep1() { - await this.page.getByText("Personal").click(); + await this.page.getByText("Personal", { exact: true }).click(); await this.page.getByText("Select option").click(); await this.page.getByText("Product Management").click(); diff --git a/frontend/src/app/main/ui/dashboard/file_menu.cljs b/frontend/src/app/main/ui/dashboard/file_menu.cljs index c3d466e3d3..bbd38efed2 100644 --- a/frontend/src/app/main/ui/dashboard/file_menu.cljs +++ b/frontend/src/app/main/ui/dashboard/file_menu.cljs @@ -37,7 +37,7 @@ (defn- get-team-name [team] (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))) (defn- group-by-team diff --git a/frontend/src/app/main/ui/dashboard/fonts.cljs b/frontend/src/app/main/ui/dashboard/fonts.cljs index 6c248beb04..b5795a69ac 100644 --- a/frontend/src/app/main/ui/dashboard/fonts.cljs +++ b/frontend/src/app/main/ui/dashboard/fonts.cljs @@ -43,7 +43,7 @@ (mf/with-effect [team] (when team (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (case section :fonts (dom/set-html-title (tr "title.dashboard.fonts" tname)) diff --git a/frontend/src/app/main/ui/dashboard/libraries.cljs b/frontend/src/app/main/ui/dashboard/libraries.cljs index f907d04b53..c5443b7bca 100644 --- a/frontend/src/app/main/ui/dashboard/libraries.cljs +++ b/frontend/src/app/main/ui/dashboard/libraries.cljs @@ -52,7 +52,7 @@ (mf/with-effect [team] (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (dom/set-html-title (tr "title.dashboard.shared-libraries" tname)))) diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 441bf5cc5c..521a20cd55 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -357,7 +357,7 @@ (mf/with-effect [team] (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (dom/set-html-title (tr "title.dashboard.projects" tname)))) diff --git a/frontend/src/app/main/ui/dashboard/search.cljs b/frontend/src/app/main/ui/dashboard/search.cljs index bd52a5fa57..01ad54548e 100644 --- a/frontend/src/app/main/ui/dashboard/search.cljs +++ b/frontend/src/app/main/ui/dashboard/search.cljs @@ -44,7 +44,7 @@ (mf/with-effect [team] (when team (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (dom/set-html-title (tr "title.dashboard.search" tname))))) diff --git a/frontend/src/app/main/ui/dashboard/sidebar.cljs b/frontend/src/app/main/ui/dashboard/sidebar.cljs index 3036dad42c..1767ce9e23 100644 --- a/frontend/src/app/main/ui/dashboard/sidebar.cljs +++ b/frontend/src/app/main/ui/dashboard/sidebar.cljs @@ -438,7 +438,7 @@ (when-not (contains? cf/flags :admin-console) [:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon]) - [:span {:class (stl/css :team-text)} (if (contains? cf/flags :admin-console) (tr "dashboard.personal-projects") (tr "dashboard.your-penpot"))] + [:span {:class (stl/css :team-text)} (tr "dashboard.personal-projects")] (when (= default-team-id (:id team)) tick-icon)] @@ -725,7 +725,7 @@ current-organization (dtm/team->organization team) - ;; Find the "your-penpot" teams, and transform them in organizations. When + ;; Find the "personal-projects" teams, and transform them in organizations. When ;; the selected team is directly accessible but not listed in ;; membership teams, include only its organization so the organization selector can ;; show the current selection without leaking the team into the @@ -972,7 +972,7 @@ :team-name-no-logo nitrate?)} (when-not nitrate? [:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon]) - [:span {:class (stl/css :team-text)} (if nitrate? (tr "dashboard.personal-projects") (tr "dashboard.default-team-name"))]] + [:span {:class (stl/css :team-text)} (tr "dashboard.personal-projects")]] (and (contains? cf/flags :subscriptions) (not is-default?) diff --git a/frontend/src/app/main/ui/dashboard/team.cljs b/frontend/src/app/main/ui/dashboard/team.cljs index a39b5eb9be..df94f26837 100644 --- a/frontend/src/app/main/ui/dashboard/team.cljs +++ b/frontend/src/app/main/ui/dashboard/team.cljs @@ -644,7 +644,7 @@ (dom/set-html-title (tr "title.team-members" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [(:id team)] @@ -1248,7 +1248,7 @@ (dom/set-html-title (tr "title.team-invitations" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [(:id team)] @@ -1528,7 +1528,7 @@ (dom/set-html-title (tr "title.team-webhooks" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [] @@ -1635,7 +1635,7 @@ (mf/with-effect [team] (dom/set-html-title (tr "title.team-settings" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [] diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 50bf6b331e..3254e20103 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -413,7 +413,7 @@ msgstr "Pin this version" #: src/app/main/ui/components/context_menu_a11y.cljs:300, src/app/main/ui/dashboard/sidebar.cljs:882 msgid "dashboard.default-team-name" -msgstr "Your Penpot" +msgstr "Personal Projects" #: src/app/main/ui/dashboard/deleted.cljs:265 msgid "dashboard.delete-all-forever-confirmation.description" @@ -1437,9 +1437,6 @@ msgid "dashboard.your-name" msgstr "Your name" #: src/app/main/ui/dashboard/file_menu.cljs:40, src/app/main/ui/dashboard/fonts.cljs:46, src/app/main/ui/dashboard/libraries.cljs:55, src/app/main/ui/dashboard/projects.cljs:352, src/app/main/ui/dashboard/search.cljs:47, src/app/main/ui/dashboard/sidebar.cljs:411, src/app/main/ui/dashboard/team.cljs:616, src/app/main/ui/dashboard/team.cljs:1191, src/app/main/ui/dashboard/team.cljs:1471, src/app/main/ui/dashboard/team.cljs:1577 -msgid "dashboard.your-penpot" -msgstr "Your Penpot" - msgid "dashboard.personal-projects" msgstr "Personal Projects" @@ -4631,7 +4628,7 @@ msgstr "You don't have access to this file." #: src/app/main/ui/static.cljs:62, src/app/main/ui/static.cljs:265, src/app/main/ui/static.cljs:271, src/app/main/ui/static.cljs:277, src/app/main/ui/static.cljs:283, src/app/main/ui/static.cljs:292, src/app/main/ui/static.cljs:301 msgid "not-found.no-permission.go-dashboard" -msgstr "Go to your Penpot" +msgstr "Go to Personal Projects" #: src/app/main/ui/static.cljs:289, src/app/main/ui/static.cljs:298 msgid "not-found.no-permission.if-approves" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 4ff509285e..146a4b72e3 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -420,7 +420,7 @@ msgstr "Guardar esta versión" #: src/app/main/ui/components/context_menu_a11y.cljs:300, src/app/main/ui/dashboard/sidebar.cljs:882 msgid "dashboard.default-team-name" -msgstr "Tu Penpot" +msgstr "Proyectos Personales" #: src/app/main/ui/dashboard/deleted.cljs:265 msgid "dashboard.delete-all-forever-confirmation.description" @@ -1444,9 +1444,6 @@ msgid "dashboard.your-name" msgstr "Tu nombre" #: src/app/main/ui/dashboard/file_menu.cljs:40, src/app/main/ui/dashboard/fonts.cljs:46, src/app/main/ui/dashboard/libraries.cljs:55, src/app/main/ui/dashboard/projects.cljs:352, src/app/main/ui/dashboard/search.cljs:47, src/app/main/ui/dashboard/sidebar.cljs:411, src/app/main/ui/dashboard/team.cljs:616, src/app/main/ui/dashboard/team.cljs:1191, src/app/main/ui/dashboard/team.cljs:1471, src/app/main/ui/dashboard/team.cljs:1577 -msgid "dashboard.your-penpot" -msgstr "Tu Penpot" - msgid "dashboard.personal-projects" msgstr "Proyectos Personales" @@ -4503,7 +4500,7 @@ msgstr "No tienes permiso para acceder a este archivo." #: src/app/main/ui/static.cljs:62, src/app/main/ui/static.cljs:265, src/app/main/ui/static.cljs:271, src/app/main/ui/static.cljs:277, src/app/main/ui/static.cljs:283, src/app/main/ui/static.cljs:292, src/app/main/ui/static.cljs:301 msgid "not-found.no-permission.go-dashboard" -msgstr "Ir a tu Penpot" +msgstr "Ir a tus Proyectos Personales" #: src/app/main/ui/static.cljs:289, src/app/main/ui/static.cljs:298 msgid "not-found.no-permission.if-approves" From 4c9aeab65e10515e459c5032d68e8f52eef8d2ad Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 28 Aug 2026 14:55:30 +0000 Subject: [PATCH 4/7] :books: Add issue/PR CLI auto-trigger to agent guide When an issue or PR is mentioned in conversation, fetch details via gh CLI or scripts/gh.py instead of WebFetch. Use gh issue view for issues, gh pr view for single PRs, and scripts/gh.py prs for multiple PRs. AI-assisted-by: glm-5.3-flash --- AGENTS.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index d4d1e238e7..69d33e7eba 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -40,6 +40,15 @@ Skipping this step is the #1 cause of incorrect or incomplete work. `github.com/penpot/penpot/security/advisories/GHSA-*`, extract the GHSA ID from the URL and run `python3 scripts/gh.py advisories ` to fetch full advisory details before proceeding. +- **Issue or PR mentioned** — When the user mentions a penpot/penpot issue or + PR (URL like `github.com/penpot/penpot/issues/` / `.../pull/`, or a + bare `#` when context clearly refers to this repo), fetch details via CLI + instead of WebFetch: + - Issue → `gh issue view --repo penpot/penpot` (add `--comments` when + discussion context matters). + - Single PR → `gh pr view --repo penpot/penpot`. + - Multiple PRs (list, file, or milestone) → `python3 scripts/gh.py prs ...`. + Do this before proceeding. Only use WebFetch if the CLI fails. ## Writing Rules From 995a5460e5b37c74415bcc21f242f8fff8ea9d4d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 28 Aug 2026 21:20:17 +0200 Subject: [PATCH 5/7] :paperclip: Update agents and opencode on devenv --- AGENTS.md | 10 +++++++++- docker/devenv/Dockerfile | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 69d33e7eba..06507f18d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,7 +52,15 @@ Skipping this step is the #1 cause of incorrect or incomplete work. ## Writing Rules -Use the `ste` skill when the user explicitly requests STE, `/ste`, or ASD-STE100. +Writing rules, from Orwell, 1946. These govern prose: docs, PR text, messages. Never touch code or technical terms; swap in everyday words only where precision survives. + +1. Never use a metaphor, simile or other figure of speech which you are used to seeing in print. +2. Never use a long word where a short one will do. +3. If it is possible to cut a word out, always cut it out. +4. Never use the passive where you can use the active. +5. Never use a foreign phrase, a scientific word or a jargon word if you can think of an everyday English equivalent. +6. Break any of these rules sooner than say anything outright barbarous. +Review every prose output against these rules before delivering. --- diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index 450cff5b5a..5a493a862f 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -100,7 +100,7 @@ RUN set -eux; \ FROM base AS setup-opencode -ENV OPENCODE_VERSION=1.18.19 +ENV OPENCODE_VERSION=1.18.25 RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \ From 169e6fcbca5c672a648e9b5ce7fa343d564e28dc Mon Sep 17 00:00:00 2001 From: Luis de Dios Date: Mon, 31 Aug 2026 11:50:59 +0200 Subject: [PATCH 6/7] :bug: Fix comments not close main menu (#11347) --- frontend/src/app/main/ui/workspace/main_menu.cljs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index e08de97b03..4824dd1f99 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -344,7 +344,7 @@ (mf/defc view-menu* {::mf/private true ::mf/wrap [mf/memo]} - [{:keys [layout toggle-flag on-close]}] + [{:keys [layout toggle-flag on-close on-close-all]}] (let [read-only? (mf/use-ctx ctx/workspace-read-only?) toggle-color-palette @@ -365,11 +365,11 @@ toggle-comments-visibility (mf/use-fn - (mf/deps on-close) + (mf/deps on-close-all) (fn [event] (dom/stop-propagation event) (st/emit! (dwcm/toggle-comments-visibility {:origin "workspace:menu"})) - (on-close)))] + (on-close-all)))] [:> dropdown-menu* {:show true :class (stl/css :base-menu :sub-menu :pos-3) @@ -1139,7 +1139,8 @@ :view [:> view-menu* {:layout layout :toggle-flag toggle-flag - :on-close close-sub-menu}] + :on-close close-sub-menu + :on-close-all close-all-menus}] :preferences [:> preferences-menu* {:layout layout From 2ed0981e8a1f3aebde587fa518c10ec249d7a500 Mon Sep 17 00:00:00 2001 From: Luis de Dios Date: Mon, 31 Aug 2026 11:51:42 +0200 Subject: [PATCH 7/7] :bug: Fix disabled numeric input with token applied is broken (#11324) --- frontend/src/app/main/ui/ds/controls/numeric_input.cljs | 3 ++- .../src/app/main/ui/ds/controls/utilities/token_field.scss | 3 ++- 2 files changed, 4 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 f04c30b849..b356e88af4 100644 --- a/frontend/src/app/main/ui/ds/controls/numeric_input.cljs +++ b/frontend/src/app/main/ui/ds/controls/numeric_input.cljs @@ -839,7 +839,8 @@ (mf/with-effect [handle-unmount] handle-unmount) [:div {:class [class (stl/css-case :input-wrapper true - :resizable (not is-token-applied?))] + :resizable (and (not is-token-applied?) + (not disabled)))] :ref wrapper-ref :on-pointer-down on-scrub-pointer-down :on-pointer-move on-scrub-pointer-move diff --git a/frontend/src/app/main/ui/ds/controls/utilities/token_field.scss b/frontend/src/app/main/ui/ds/controls/utilities/token_field.scss index 765e6d5eae..e8d1586fbd 100644 --- a/frontend/src/app/main/ui/ds/controls/utilities/token_field.scss +++ b/frontend/src/app/main/ui/ds/controls/utilities/token_field.scss @@ -22,9 +22,10 @@ column-gap: var(--sp-xs); align-items: center; inline-size: 100%; + block-size: var(--token-field-height); background: var(--token-field-bg-color); border-radius: $br-8; - padding-inline-end: var(--sp-xs); + padding: 0 var(--input-padding-size, var(--sp-s)); outline: $b-1 solid var(--token-field-outline-color); position: relative;