mirror of
https://github.com/penpot/penpot.git
synced 2026-09-07 04:29:31 +00:00
Merge branch 'staging' into niwinz-upgrade-deps
This commit is contained in:
commit
be8d9c03f6
1
.gitignore
vendored
1
.gitignore
vendored
@ -24,6 +24,7 @@ opencode.json
|
|||||||
!AGENTS.md
|
!AGENTS.md
|
||||||
!CODE_OF_CONDUCT.md
|
!CODE_OF_CONDUCT.md
|
||||||
!SECURITY.md
|
!SECURITY.md
|
||||||
|
!HIGHLIGHTS.md
|
||||||
/*.png
|
/*.png
|
||||||
/*.svg
|
/*.svg
|
||||||
/*.sql
|
/*.sql
|
||||||
|
|||||||
19
AGENTS.md
19
AGENTS.md
@ -40,10 +40,27 @@ Skipping this step is the #1 cause of incorrect or incomplete work.
|
|||||||
`github.com/penpot/penpot/security/advisories/GHSA-*`, extract the GHSA ID
|
`github.com/penpot/penpot/security/advisories/GHSA-*`, extract the GHSA ID
|
||||||
from the URL and run `python3 scripts/gh.py advisories <GHSA-ID>` to fetch
|
from the URL and run `python3 scripts/gh.py advisories <GHSA-ID>` to fetch
|
||||||
full advisory details before proceeding.
|
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/<n>` / `.../pull/<n>`, or a
|
||||||
|
bare `#<n>` when context clearly refers to this repo), fetch details via CLI
|
||||||
|
instead of WebFetch:
|
||||||
|
- Issue → `gh issue view <n> --repo penpot/penpot` (add `--comments` when
|
||||||
|
discussion context matters).
|
||||||
|
- Single PR → `gh pr view <n> --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
|
## 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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
26
HIGHLIGHTS.md
Normal file
26
HIGHLIGHTS.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# HIGHLIGHTS
|
||||||
|
|
||||||
|
## 2.17.0
|
||||||
|
|
||||||
|
- Background blur is here
|
||||||
|
- WebGL rendering gets stronger
|
||||||
|
- MCP connection status and more
|
||||||
|
- Design tokens: more visible, more user-friendly
|
||||||
|
|
||||||
|
|
||||||
|
## 2.16.0
|
||||||
|
|
||||||
|
- Design tokens in the design panel
|
||||||
|
- Major community contributions
|
||||||
|
- WebGL rendering (beta)
|
||||||
|
|
||||||
|
|
||||||
|
## 2.15.0
|
||||||
|
|
||||||
|
- AI connected to real design context
|
||||||
|
- Multi-directional workflow
|
||||||
|
- Your stack, your model, your decision
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -191,7 +191,7 @@
|
|||||||
file named “{{file-name|abbreviate:25}}”.
|
file named “{{file-name|abbreviate:25}}”.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
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.
|
This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.
|
||||||
</p>
|
</p>
|
||||||
<p>To proceed, please click the button below to generate and send the view-only link:</p>
|
<p>To proceed, please click the button below to generate and send the view-only link:</p>
|
||||||
|
|||||||
@ -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}}”.
|
{{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:
|
To proceed, please click the link below to generate and send the view-only link:
|
||||||
|
|
||||||
|
|||||||
@ -191,7 +191,7 @@
|
|||||||
“{{file-name|abbreviate:25}}”.
|
“{{file-name|abbreviate:25}}”.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
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:
|
granted. However, you have two options to provide the requested access:
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@ -5,7 +5,7 @@ Hello!
|
|||||||
|
|
||||||
{{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named “{{file-name|abbreviate:25}}”.
|
{{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:
|
- Move the File to Another Team:
|
||||||
|
|
||||||
|
|||||||
@ -505,13 +505,13 @@
|
|||||||
:schema schema:request-file-access))
|
:schema schema:request-file-access))
|
||||||
|
|
||||||
(def request-file-access-yourpenpot
|
(def request-file-access-yourpenpot
|
||||||
"File access on Your Penpot request email."
|
"File access on Personal Projects request email."
|
||||||
(template-factory
|
(template-factory
|
||||||
:id ::request-file-access-yourpenpot
|
:id ::request-file-access-yourpenpot
|
||||||
:schema schema:request-file-access))
|
:schema schema:request-file-access))
|
||||||
|
|
||||||
(def request-file-access-yourpenpot-view
|
(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
|
(template-factory
|
||||||
:id ::request-file-access-yourpenpot-view
|
:id ::request-file-access-yourpenpot-view
|
||||||
:schema schema:request-file-access))
|
:schema schema:request-file-access))
|
||||||
|
|||||||
@ -209,7 +209,7 @@
|
|||||||
[:enum
|
[:enum
|
||||||
"customer_service"
|
"customer_service"
|
||||||
"low_quality"
|
"low_quality"
|
||||||
"missing_feature"
|
"missing_features"
|
||||||
"other"
|
"other"
|
||||||
"switched_service"
|
"switched_service"
|
||||||
"too_complex"
|
"too_complex"
|
||||||
|
|||||||
@ -245,7 +245,7 @@
|
|||||||
[:enum
|
[:enum
|
||||||
"customer_service"
|
"customer_service"
|
||||||
"low_quality"
|
"low_quality"
|
||||||
"missing_feature"
|
"missing_features"
|
||||||
"other"
|
"other"
|
||||||
"switched_service"
|
"switched_service"
|
||||||
"too_complex"
|
"too_complex"
|
||||||
|
|||||||
@ -336,7 +336,7 @@
|
|||||||
(doseq [{:keys [id reassign-to]} teams-to-leave]
|
(doseq [{:keys [id reassign-to]} teams-to-leave]
|
||||||
(teams/leave-team cfg {:profile-id profile-id :id id :reassign-to reassign-to}))
|
(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
|
(when default-team-id
|
||||||
(if keep-default-team?
|
(if keep-default-team?
|
||||||
(db/exec! conn [sql:prefix-team-name-and-unset-default organization-prefix default-team-id])
|
(db/exec! conn [sql:prefix-team-name-and-unset-default organization-prefix default-team-id])
|
||||||
|
|||||||
@ -524,7 +524,7 @@
|
|||||||
;; Penpot back through two paths: ::notify-user-organizations-deletion
|
;; Penpot back through two paths: ::notify-user-organizations-deletion
|
||||||
;; (during delete-owned-organizations) and ::notify-organization-deletion.
|
;; (during delete-owned-organizations) and ::notify-organization-deletion.
|
||||||
;; Both preserve organization teams unchanged and only prefix or delete
|
;; 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:
|
;; Let Nitrate clean up the data associated with the deleted Penpot user:
|
||||||
;; owned organizations, remaining memberships, and subscription cancellation.
|
;; owned organizations, remaining memberships, and subscription cancellation.
|
||||||
(when (contains? cf/flags :admin-console)
|
(when (contains? cf/flags :admin-console)
|
||||||
|
|||||||
@ -575,7 +575,7 @@
|
|||||||
(set/difference cfeat/frontend-only-features)
|
(set/difference cfeat/frontend-only-features)
|
||||||
(set/difference cfeat/no-team-inheritable-features))
|
(set/difference cfeat/no-team-inheritable-features))
|
||||||
params {:profile-id profile-id
|
params {:profile-id profile-id
|
||||||
:name "Your Penpot"
|
:name "Personal Projects"
|
||||||
:features features
|
:features features
|
||||||
:organization-id organization-id
|
:organization-id organization-id
|
||||||
:is-default true}
|
:is-default true}
|
||||||
@ -829,7 +829,7 @@
|
|||||||
:code :only-owner-can-delete-team))
|
:code :only-owner-can-delete-team))
|
||||||
|
|
||||||
;; Protect the user's personal default team from deletion.
|
;; 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?))
|
(when (and (:is-default team) (not in-organization?))
|
||||||
(ex/raise :type :validation
|
(ex/raise :type :validation
|
||||||
:code :non-deletable-team
|
:code :non-deletable-team
|
||||||
|
|||||||
@ -318,7 +318,7 @@ RETURNING id, deleted_at;")
|
|||||||
|
|
||||||
(defn manage-deleted-organization-teams
|
(defn manage-deleted-organization-teams
|
||||||
"For a deleted organization, preserve organization teams unchanged and only prefix or
|
"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]}]
|
[cfg {:keys [organization-id organization-name teams]}]
|
||||||
(let [all-team-ids (->> teams
|
(let [all-team-ids (->> teams
|
||||||
(map :id)
|
(map :id)
|
||||||
@ -347,13 +347,13 @@ RETURNING id, deleted_at;")
|
|||||||
teams-to-delete (->> your-penpot-team-ids (remove teams-with-files) (into []))]
|
teams-to-delete (->> your-penpot-team-ids (remove teams-with-files) (into []))]
|
||||||
|
|
||||||
;; Organization teams move to the fallback organization unchanged. Only imported
|
;; 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)
|
(when (seq teams-to-prefix)
|
||||||
(db/exec! conn [sql:prefix-teams-name-and-unset-default
|
(db/exec! conn [sql:prefix-teams-name-and-unset-default
|
||||||
organization-prefix
|
organization-prefix
|
||||||
(db/create-array conn "uuid" teams-to-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)
|
(soft-delete-teams! cfg teams-to-delete)
|
||||||
|
|
||||||
(notifications/notify-organization-deletion cfg organization-id organization-name all-team-ids 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
|
(sv/defmethod ::notify-organization-deletion
|
||||||
"For a deleted organization, preserve organization teams and only prefix or delete
|
"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"
|
{::doc/added "2.18"
|
||||||
::sm/params schema:notify-organization-deletion
|
::sm/params schema:notify-organization-deletion
|
||||||
::rpc/auth false}
|
::rpc/auth false}
|
||||||
@ -382,7 +382,7 @@ RETURNING id, deleted_at;")
|
|||||||
|
|
||||||
(sv/defmethod ::notify-user-organizations-deletion
|
(sv/defmethod ::notify-user-organizations-deletion
|
||||||
"For a given user, find all owned organizations and apply the deleted-organization
|
"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"
|
{::doc/added "2.18"
|
||||||
::sm/params schema:notify-user-organizations-deletion
|
::sm/params schema:notify-user-organizations-deletion
|
||||||
::nitrate/sso false}
|
::nitrate/sso false}
|
||||||
|
|||||||
@ -232,7 +232,7 @@
|
|||||||
[:enum
|
[:enum
|
||||||
"customer_service"
|
"customer_service"
|
||||||
"low_quality"
|
"low_quality"
|
||||||
"missing_feature"
|
"missing_features"
|
||||||
"other"
|
"other"
|
||||||
"switched_service"
|
"switched_service"
|
||||||
"too_complex"
|
"too_complex"
|
||||||
|
|||||||
@ -268,7 +268,7 @@
|
|||||||
new-team (th/db-get :team {:id new-team-id})]
|
new-team (th/db-get :team {:id new-team-id})]
|
||||||
(t/is (th/success? out))
|
(t/is (th/success? out))
|
||||||
(t/is (= 1 (count (set/difference after-teams before-teams))))
|
(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/is (true? (:is-default new-team))))))
|
||||||
|
|
||||||
(t/deftest get-managed-profiles-returns-unique-members-for-owned-teams
|
(t/deftest get-managed-profiles-returns-unique-members-for-owned-teams
|
||||||
|
|||||||
@ -100,7 +100,7 @@ RUN set -eux; \
|
|||||||
|
|
||||||
FROM base AS setup-opencode
|
FROM base AS setup-opencode
|
||||||
|
|
||||||
ENV OPENCODE_VERSION=1.18.19
|
ENV OPENCODE_VERSION=1.18.25
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
ARCH="$(dpkg --print-architecture)"; \
|
ARCH="$(dpkg --print-architecture)"; \
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 6.7 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.2 KiB |
@ -10,7 +10,7 @@ desc: Learn how to organize your work in Penpot. Create, manage and organize pro
|
|||||||
|
|
||||||
<h2 id="projects-management">Projects</h2>
|
<h2 id="projects-management">Projects</h2>
|
||||||
<p>Projects are containers that help you organize and group related design files together. Think of them as folders in a file system. You can create as many projects as you need to organize your work by client, product, feature, or any other structure that fits your workflow.</p>
|
<p>Projects are containers that help you organize and group related design files together. Think of them as folders in a file system. You can create as many projects as you need to organize your work by client, product, feature, or any other structure that fits your workflow.</p>
|
||||||
<p>If you're working with others, projects should be created inside a team so that team members can collaborate on the files within them. Projects created in your personal space ("Your Penpot") remain private to you.</p>
|
<p>If you're working with others, projects should be created inside a team so that team members can collaborate on the files within them. Projects created in your personal space ("Personal Projects") remain private to you.</p>
|
||||||
<figure>
|
<figure>
|
||||||
<img src="/img/files-projects/01-projects.webp" alt="Projects view in dashboard" />
|
<img src="/img/files-projects/01-projects.webp" alt="Projects view in dashboard" />
|
||||||
</figure>
|
</figure>
|
||||||
|
|||||||
@ -16,7 +16,7 @@ member is allowed to do depends on their permissions.</p>
|
|||||||
<h3>Select team</h3>
|
<h3>Select team</h3>
|
||||||
<p>At the top left of the dashboard you can find the team selector.</p>
|
<p>At the top left of the dashboard you can find the team selector.</p>
|
||||||
|
|
||||||
<p>"Your Penpot" is the name of your personal space at Penpot. It is like any other team but in which no members can be invited so that you will always have your own private dashboard. Create or join other teams to collaborate with other Penpot users.</p>
|
<p>"Personal Projects" is the name of your personal space at Penpot. It is like any other team but in which no members can be invited so that you will always have your own private dashboard. Create or join other teams to collaborate with other Penpot users.</p>
|
||||||
<figure><img src="/img/teams/team-selector.webp" alt="Teams selector" /></figure>
|
<figure><img src="/img/teams/team-selector.webp" alt="Teams selector" /></figure>
|
||||||
|
|
||||||
<h3>Create teams</h3>
|
<h3>Create teams</h3>
|
||||||
|
|||||||
@ -86,7 +86,7 @@ export class DashboardPage extends BaseWebSocketPage {
|
|||||||
this.searchInput = page.getByPlaceholder("Search…");
|
this.searchInput = page.getByPlaceholder("Search…");
|
||||||
|
|
||||||
this.teamDropdown = this.sidebar.getByRole("button", {
|
this.teamDropdown = this.sidebar.getByRole("button", {
|
||||||
name: "Your Penpot",
|
name: "Personal Projects",
|
||||||
});
|
});
|
||||||
this.userAccount = this.sidebar.getByRole("button", {
|
this.userAccount = this.sidebar.getByRole("button", {
|
||||||
name: /Princesa Leia/,
|
name: /Princesa Leia/,
|
||||||
|
|||||||
@ -7,7 +7,7 @@ export class OnboardingPage extends BaseWebSocketPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fillOnboardingInputsStep1() {
|
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("Select option").click();
|
||||||
await this.page.getByText("Product Management").click();
|
await this.page.getByText("Product Management").click();
|
||||||
|
|
||||||
|
|||||||
@ -43,15 +43,25 @@
|
|||||||
(swap! storage/storage dissoc
|
(swap! storage/storage dissoc
|
||||||
nitrate-entry-pending-popup-key)))
|
nitrate-entry-pending-popup-key)))
|
||||||
|
|
||||||
|
(def ^:private offline-connectivity
|
||||||
|
{:licenses false})
|
||||||
|
|
||||||
|
(defn- air-gapped?
|
||||||
|
[]
|
||||||
|
(contains? cf/flags :air-gapped-conf))
|
||||||
|
|
||||||
(defn show-nitrate-popup
|
(defn show-nitrate-popup
|
||||||
([popup-type] (show-nitrate-popup popup-type {}))
|
([popup-type] (show-nitrate-popup popup-type {}))
|
||||||
([popup-type extra-props]
|
([popup-type extra-props]
|
||||||
(ptk/reify ::show-nitrate-popup
|
(ptk/reify ::show-nitrate-popup
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ _ _]
|
(watch [_ _ _]
|
||||||
(->> (rp/cmd! ::get-nitrate-connectivity {})
|
(if (air-gapped?)
|
||||||
(rx/map (fn [connectivity]
|
(rx/of (modal/show popup-type (merge offline-connectivity extra-props)))
|
||||||
(modal/show popup-type (merge (or 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
|
(defn build-admin-console-url
|
||||||
([path]
|
([path]
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
(defn- get-team-name
|
(defn- get-team-name
|
||||||
[team]
|
[team]
|
||||||
(if (:is-default team)
|
(if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team)))
|
(:name team)))
|
||||||
|
|
||||||
(defn- group-by-team
|
(defn- group-by-team
|
||||||
|
|||||||
@ -43,7 +43,7 @@
|
|||||||
(mf/with-effect [team]
|
(mf/with-effect [team]
|
||||||
(when team
|
(when team
|
||||||
(let [tname (if (:is-default team)
|
(let [tname (if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team))]
|
(:name team))]
|
||||||
(case section
|
(case section
|
||||||
:fonts (dom/set-html-title (tr "title.dashboard.fonts" tname))
|
:fonts (dom/set-html-title (tr "title.dashboard.fonts" tname))
|
||||||
|
|||||||
@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
(mf/with-effect [team]
|
(mf/with-effect [team]
|
||||||
(let [tname (if (:is-default team)
|
(let [tname (if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team))]
|
(:name team))]
|
||||||
(dom/set-html-title (tr "title.dashboard.shared-libraries" tname))))
|
(dom/set-html-title (tr "title.dashboard.shared-libraries" tname))))
|
||||||
|
|
||||||
|
|||||||
@ -357,7 +357,7 @@
|
|||||||
|
|
||||||
(mf/with-effect [team]
|
(mf/with-effect [team]
|
||||||
(let [tname (if (:is-default team)
|
(let [tname (if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team))]
|
(:name team))]
|
||||||
(dom/set-html-title (tr "title.dashboard.projects" tname))))
|
(dom/set-html-title (tr "title.dashboard.projects" tname))))
|
||||||
|
|
||||||
|
|||||||
@ -44,7 +44,7 @@
|
|||||||
(mf/with-effect [team]
|
(mf/with-effect [team]
|
||||||
(when team
|
(when team
|
||||||
(let [tname (if (:is-default team)
|
(let [tname (if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team))]
|
(:name team))]
|
||||||
(dom/set-html-title (tr "title.dashboard.search" tname)))))
|
(dom/set-html-title (tr "title.dashboard.search" tname)))))
|
||||||
|
|
||||||
|
|||||||
@ -371,8 +371,8 @@
|
|||||||
[:span {:class (stl/css :my-teams-icon)}
|
[:span {:class (stl/css :my-teams-icon)}
|
||||||
[:> raw-svg* {:id penpot-logo-icon-subtle}]]
|
[:> raw-svg* {:id penpot-logo-icon-subtle}]]
|
||||||
[:span {:class (stl/css :team-text)
|
[:span {:class (stl/css :team-text)
|
||||||
:title (tr "dashboard.my-teams")}
|
:title (tr "dashboard.other-teams")}
|
||||||
(tr "dashboard.my-teams")]
|
(tr "dashboard.other-teams")]
|
||||||
(when (= default-team-id (:default-team-id organization))
|
(when (= default-team-id (:default-team-id organization))
|
||||||
tick-icon)]
|
tick-icon)]
|
||||||
(when (seq organizations)
|
(when (seq organizations)
|
||||||
@ -438,7 +438,7 @@
|
|||||||
(when-not (contains? cf/flags :admin-console)
|
(when-not (contains? cf/flags :admin-console)
|
||||||
[:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon])
|
[:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon])
|
||||||
|
|
||||||
[:span {:class (stl/css :team-text)} (if (contains? cf/flags :admin-console) (tr "dashboard.my-files") (tr "dashboard.your-penpot"))]
|
[:span {:class (stl/css :team-text)} (tr "dashboard.personal-projects")]
|
||||||
(when (= default-team-id (:id team))
|
(when (= default-team-id (:id team))
|
||||||
tick-icon)]
|
tick-icon)]
|
||||||
|
|
||||||
@ -725,7 +725,7 @@
|
|||||||
|
|
||||||
current-organization (dtm/team->organization team)
|
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
|
;; the selected team is directly accessible but not listed in
|
||||||
;; membership teams, include only its organization so the organization selector can
|
;; membership teams, include only its organization so the organization selector can
|
||||||
;; show the current selection without leaking the team into the
|
;; show the current selection without leaking the team into the
|
||||||
@ -835,7 +835,7 @@
|
|||||||
[:span {:class (stl/css :my-teams-icon-xxxl)}
|
[:span {:class (stl/css :my-teams-icon-xxxl)}
|
||||||
[:> raw-svg* {:id penpot-logo-icon-subtle}]]
|
[:> raw-svg* {:id penpot-logo-icon-subtle}]]
|
||||||
[:span {:class (stl/css :team-text)}
|
[:span {:class (stl/css :team-text)}
|
||||||
(tr "dashboard.my-teams")]]
|
(tr "dashboard.other-teams")]]
|
||||||
[:*
|
[:*
|
||||||
[:> organization-avatar* {:organization current-organization :size "xxxl"}]
|
[:> organization-avatar* {:organization current-organization :size "xxxl"}]
|
||||||
[:span {:class (stl/css :team-text)}
|
[:span {:class (stl/css :team-text)}
|
||||||
@ -972,7 +972,7 @@
|
|||||||
:team-name-no-logo nitrate?)}
|
:team-name-no-logo nitrate?)}
|
||||||
(when-not nitrate?
|
(when-not nitrate?
|
||||||
[:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon])
|
[:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon])
|
||||||
[:span {:class (stl/css :team-text)} (if nitrate? (tr "dashboard.my-files") (tr "dashboard.default-team-name"))]]
|
[:span {:class (stl/css :team-text)} (tr "dashboard.personal-projects")]]
|
||||||
|
|
||||||
(and (contains? cf/flags :subscriptions)
|
(and (contains? cf/flags :subscriptions)
|
||||||
(not is-default?)
|
(not is-default?)
|
||||||
|
|||||||
@ -644,7 +644,7 @@
|
|||||||
(dom/set-html-title
|
(dom/set-html-title
|
||||||
(tr "title.team-members"
|
(tr "title.team-members"
|
||||||
(if (:is-default team)
|
(if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team)))))
|
(:name team)))))
|
||||||
|
|
||||||
(mf/with-effect [(:id team)]
|
(mf/with-effect [(:id team)]
|
||||||
@ -1248,7 +1248,7 @@
|
|||||||
(dom/set-html-title
|
(dom/set-html-title
|
||||||
(tr "title.team-invitations"
|
(tr "title.team-invitations"
|
||||||
(if (:is-default team)
|
(if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team)))))
|
(:name team)))))
|
||||||
|
|
||||||
(mf/with-effect [(:id team)]
|
(mf/with-effect [(:id team)]
|
||||||
@ -1528,7 +1528,7 @@
|
|||||||
(dom/set-html-title
|
(dom/set-html-title
|
||||||
(tr "title.team-webhooks"
|
(tr "title.team-webhooks"
|
||||||
(if (:is-default team)
|
(if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team)))))
|
(:name team)))))
|
||||||
|
|
||||||
(mf/with-effect []
|
(mf/with-effect []
|
||||||
@ -1635,7 +1635,7 @@
|
|||||||
(mf/with-effect [team]
|
(mf/with-effect [team]
|
||||||
(dom/set-html-title (tr "title.team-settings"
|
(dom/set-html-title (tr "title.team-settings"
|
||||||
(if (:is-default team)
|
(if (:is-default team)
|
||||||
(tr "dashboard.your-penpot")
|
(tr "dashboard.personal-projects")
|
||||||
(:name team)))))
|
(:name team)))))
|
||||||
|
|
||||||
(mf/with-effect []
|
(mf/with-effect []
|
||||||
|
|||||||
@ -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
|
#: src/app/main/ui/components/context_menu_a11y.cljs:300, src/app/main/ui/dashboard/sidebar.cljs:882
|
||||||
msgid "dashboard.default-team-name"
|
msgid "dashboard.default-team-name"
|
||||||
msgstr "Your Penpot"
|
msgstr "Personal Projects"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/deleted.cljs:265
|
#: src/app/main/ui/dashboard/deleted.cljs:265
|
||||||
msgid "dashboard.delete-all-forever-confirmation.description"
|
msgid "dashboard.delete-all-forever-confirmation.description"
|
||||||
@ -875,8 +875,8 @@ msgid "dashboard.move-to-other-team"
|
|||||||
msgstr "Move to other team"
|
msgstr "Move to other team"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/sidebar.cljs:348, src/app/main/ui/dashboard/sidebar.cljs:349, src/app/main/ui/dashboard/sidebar.cljs:761
|
#: src/app/main/ui/dashboard/sidebar.cljs:348, src/app/main/ui/dashboard/sidebar.cljs:349, src/app/main/ui/dashboard/sidebar.cljs:761
|
||||||
msgid "dashboard.my-teams"
|
msgid "dashboard.other-teams"
|
||||||
msgstr "My Teams"
|
msgstr "Other teams"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/files.cljs:106, src/app/main/ui/dashboard/projects.cljs:253, src/app/main/ui/dashboard/projects.cljs:254
|
#: src/app/main/ui/dashboard/files.cljs:106, src/app/main/ui/dashboard/projects.cljs:253, src/app/main/ui/dashboard/projects.cljs:254
|
||||||
msgid "dashboard.new-file"
|
msgid "dashboard.new-file"
|
||||||
@ -1437,11 +1437,8 @@ msgid "dashboard.your-name"
|
|||||||
msgstr "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
|
#: 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"
|
msgid "dashboard.personal-projects"
|
||||||
msgstr "Your Penpot"
|
msgstr "Personal Projects"
|
||||||
|
|
||||||
msgid "dashboard.my-files"
|
|
||||||
msgstr "My Files"
|
|
||||||
|
|
||||||
#: src/app/main/ui/alert.cljs:36
|
#: src/app/main/ui/alert.cljs:36
|
||||||
msgid "ds.alert-ok"
|
msgid "ds.alert-ok"
|
||||||
@ -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
|
#: 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"
|
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
|
#: src/app/main/ui/static.cljs:289, src/app/main/ui/static.cljs:298
|
||||||
msgid "not-found.no-permission.if-approves"
|
msgid "not-found.no-permission.if-approves"
|
||||||
|
|||||||
@ -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
|
#: src/app/main/ui/components/context_menu_a11y.cljs:300, src/app/main/ui/dashboard/sidebar.cljs:882
|
||||||
msgid "dashboard.default-team-name"
|
msgid "dashboard.default-team-name"
|
||||||
msgstr "Tu Penpot"
|
msgstr "Proyectos Personales"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/deleted.cljs:265
|
#: src/app/main/ui/dashboard/deleted.cljs:265
|
||||||
msgid "dashboard.delete-all-forever-confirmation.description"
|
msgid "dashboard.delete-all-forever-confirmation.description"
|
||||||
@ -879,8 +879,8 @@ msgid "dashboard.move-to-other-team"
|
|||||||
msgstr "Mover a otro equipo"
|
msgstr "Mover a otro equipo"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/sidebar.cljs:348, src/app/main/ui/dashboard/sidebar.cljs:349, src/app/main/ui/dashboard/sidebar.cljs:761
|
#: src/app/main/ui/dashboard/sidebar.cljs:348, src/app/main/ui/dashboard/sidebar.cljs:349, src/app/main/ui/dashboard/sidebar.cljs:761
|
||||||
msgid "dashboard.my-teams"
|
msgid "dashboard.other-teams"
|
||||||
msgstr "Mis Equipos"
|
msgstr "Otros equipos"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/files.cljs:106, src/app/main/ui/dashboard/projects.cljs:253, src/app/main/ui/dashboard/projects.cljs:254
|
#: src/app/main/ui/dashboard/files.cljs:106, src/app/main/ui/dashboard/projects.cljs:253, src/app/main/ui/dashboard/projects.cljs:254
|
||||||
msgid "dashboard.new-file"
|
msgid "dashboard.new-file"
|
||||||
@ -1444,11 +1444,8 @@ msgid "dashboard.your-name"
|
|||||||
msgstr "Tu nombre"
|
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
|
#: 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"
|
msgid "dashboard.personal-projects"
|
||||||
msgstr "Tu Penpot"
|
msgstr "Proyectos Personales"
|
||||||
|
|
||||||
msgid "dashboard.my-files"
|
|
||||||
msgstr "Mis Archivos"
|
|
||||||
|
|
||||||
#: src/app/main/ui/alert.cljs:36
|
#: src/app/main/ui/alert.cljs:36
|
||||||
msgid "ds.alert-ok"
|
msgid "ds.alert-ok"
|
||||||
@ -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
|
#: 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"
|
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
|
#: src/app/main/ui/static.cljs:289, src/app/main/ui/static.cljs:298
|
||||||
msgid "not-found.no-permission.if-approves"
|
msgid "not-found.no-permission.if-approves"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user