From 4501d1396177f090562cbaf6e19397cf1ab964ef Mon Sep 17 00:00:00 2001 From: Francis Santiago Date: Tue, 22 Jul 2025 14:05:02 +0200 Subject: [PATCH 1/7] :books: Clarify OpenShift requirements (#6937) * :books: Clarify OpenShift requirements * :books: Remove the click for expanding --- docs/technical-guide/getting-started/kubernetes.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/technical-guide/getting-started/kubernetes.md b/docs/technical-guide/getting-started/kubernetes.md index 142f498947..a3fac318e3 100644 --- a/docs/technical-guide/getting-started/kubernetes.md +++ b/docs/technical-guide/getting-started/kubernetes.md @@ -97,6 +97,11 @@ file itself, which you can use as a basis for creating your own settings. You can also consult the list of parameters on the ArtifactHub page of the project. +### Using OpenShift? +If you are deploying Penpot on OpenShift, we recommend following the specific guidelines provided in our Penpot-helm documentation: +`Installing the chart with OpenShift requirements` + +Make sure to review the section **OpenShift Requirements** for important security and compatibility considerations. ## Upgrade Penpot From 6abd045273e0b8baf65150bedbf2592f42d468d2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 7 Aug 2025 12:36:14 +0200 Subject: [PATCH 2/7] :bug: Add missing generator for token-set file change operation (#7080) * :bug: Add missing generator for token-set file change operation * :bug: Use ::sm/any instead of :any for on get-file-data-for-thumbnail rpc method Mainly because :any will use a very generic generator that can generate instances of Character that are not directly serializable to JSON --- backend/src/app/rpc/commands/files_thumbnails.clj | 2 +- common/src/app/common/files/changes.cljc | 9 ++++++++- common/src/app/common/types/tokens_lib.cljc | 8 +++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index 9d64ec504d..c74f023b9d 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -185,7 +185,7 @@ [:map {:title "PartialFile"} [:id ::sm/uuid] [:revn {:min 0} ::sm/int] - [:page :any]]) + [:page [:map-of :keyword ::sm/any]]]) (sv/defmethod ::get-file-data-for-thumbnail "Retrieves the data for generate the thumbnail of the file. Used diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index d9965ce556..8915402b06 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -418,7 +418,14 @@ [:type [:= :set-token-set]] [:set-name :string] [:group? :boolean] - [:token-set [:maybe [:fn ctob/token-set?]]]]] + + ;; FIXME: we should not pass private types as part of changes + ;; protocol, the changes protocol should reflect a + ;; method/protocol for perform surgical operations on file data, + ;; this has nothing todo with internal types of a file data + ;; structure. + [:token-set {:gen/gen (sg/generator ctob/schema:token-set)} + [:maybe [:fn ctob/token-set?]]]]] [:set-token [:map {:title "SetTokenChange"} diff --git a/common/src/app/common/types/tokens_lib.cljc b/common/src/app/common/types/tokens_lib.cljc index a802679a2c..498801f2d8 100644 --- a/common/src/app/common/types/tokens_lib.cljc +++ b/common/src/app/common/types/tokens_lib.cljc @@ -186,6 +186,10 @@ :modified-at modified-at :tokens tokens})]) + #?@(:clj + [json/JSONWriter + (-write [this writter options] (json/-write (deref this) writter options))]) + #?@(:cljs [cljs.core/IEncodeJS (-clj->js [_] (js-obj "id" (clj->js id) "name" (clj->js name) @@ -292,7 +296,9 @@ (declare make-token-set) (def schema:token-set - (sm/required-keys schema:token-set-attrs)) + [:schema {:gen/gen (->> (sg/generator schema:token-set-attrs) + (sg/fmap #(make-token-set %)))} + (sm/required-keys schema:token-set-attrs)]) (sm/register! ::token-set schema:token-set) ;; need to register for the recursive schema of token-sets From 23a6f4b7c12626206a2f4524bf00ba364d50fb57 Mon Sep 17 00:00:00 2001 From: Yamila Moreno Date: Thu, 7 Aug 2025 18:07:47 +0200 Subject: [PATCH 3/7] :paperclip: Improve gh actions --- .github/workflows/build-bundles.yml | 105 ++++++---------------------- .github/workflows/build-develop.yml | 12 ++++ .github/workflows/build-staging.yml | 12 ++++ 3 files changed, 44 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/build-develop.yml create mode 100644 .github/workflows/build-staging.yml diff --git a/.github/workflows/build-bundles.yml b/.github/workflows/build-bundles.yml index ff2f37f75f..a8efc23fa3 100644 --- a/.github/workflows/build-bundles.yml +++ b/.github/workflows/build-bundles.yml @@ -1,28 +1,14 @@ -name: Build and Upload Penpot Bundles non-prod +name: Build and Upload Penpot Bundles on: - # Create bundler for every tag - push: - tags: - - '**' # Pattern matched against refs/tags - # Create bundler every hour between 5:00 and 20:00 on working days - schedule: - - cron: '0 5-20 * * 1-5' - # Create bundler from manual action + # Create bundle from manual action workflow_dispatch: + workflow_call: inputs: - zip_mode: - # zip_mode defines how the build artifacts are packaged: - # - 'individual': creates one ZIP file per component (frontend, backend, exporter) - # - 'all': creates a single ZIP containing all components - # - null: for the rest of cases (non-manual events) - description: 'Bundle packaging mode' - required: false - default: 'individual' - type: choice - options: - - individual - - all + gh_ref: + description: 'Name of the branch' + type: string + required: true jobs: build-bundles: @@ -38,15 +24,15 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: ${{ inputs.gh_ref }} - - name: Extract somer useful variables + - name: Extract some useful variables id: vars run: | echo "commit_hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "gh_branch=${{ github.base_ref || github.ref_name }}" >> $GITHUB_OUTPUT - # Set up Docker Buildx for multi-arch build - - name: Set up Docker Buildx + - name: Set up Docker Buildx for multi-arch build uses: docker/setup-buildx-action@v3 - name: Run manage.sh build-bundle from host @@ -57,73 +43,22 @@ jobs: mkdir zips mv bundles penpot - - name: Create zip bundles for zip_mode == 'all' - if: ${{ github.event.inputs.zip_mode == 'all' }} + - name: Create zip bundles run: | - echo "๐Ÿ“ฆ Packaging Penpot 'all' bundles..." - zip -r zips/penpot-all-bundles.zip penpot + echo "๐Ÿ“ฆ Packaging Penpot bundles..." + zip -r zips/penpot.zip penpot - - name: Create zip bundles for zip_mode != 'all' - if: ${{ github.event.inputs.zip_mode != 'all' }} + - name: Upload Penpot bundle to S3 run: | - echo "๐Ÿ“ฆ Packaging Penpot 'individual' bundles..." - zip -r zips/penpot-frontend.zip penpot/frontend - zip -r zips/penpot-backend.zip penpot/backend - zip -r zips/penpot-exporter.zip penpot/exporter + aws s3 cp zips/penpot.zip s3://${{ secrets.S3_BUCKET }}/penpot-${{ steps.vars.outputs.gh_branch}}-latest.zip + aws s3 cp zips/penpot.zip s3://${{ secrets.S3_BUCKET }}/penpot-${{ steps.vars.outputs.commit_hash }}.zip - - name: Upload unified 'all' bundle - if: ${{ github.event.inputs.zip_mode == 'all' }} - uses: actions/upload-artifact@v4 - with: - name: penpot-all-bundles - path: zips/penpot-all-bundles.zip - - - name: Upload individual bundles - if: ${{ github.event.inputs.zip_mode != 'all' }} - uses: actions/upload-artifact@v4 - with: - name: penpot-individual-bundles - path: | - zips/penpot-frontend.zip - zips/penpot-backend.zip - zips/penpot-exporter.zip - - - name: Upload unified 'all' bundle to S3 - if: ${{ github.event.inputs.zip_mode == 'all' }} - run: | - aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.gh_branch}}.zip - aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.commit_hash }}.zip - - - name: Upload 'individual' bundles to S3 - if: ${{ github.event.inputs.zip_mode != 'all' }} - run: | - for name in penpot-frontend penpot-backend penpot-exporter; do - aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.gh_branch }}-latest.zip - aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.commit_hash }}.zip - done - - - name: Notify Mattermost about automatic bundles - if: github.event_name == 'pull_request' + - name: Notify Mattermost + if: failure() uses: mattermost/action-mattermost-notify@master with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} TEXT: | - ๐Ÿ“ฆ *Penpot bundle automatically generated* - ๐Ÿ“„ PR: ${{ github.event.pull_request.title }} - ๐Ÿ” From: \`${{ github.head_ref }}\` to \`{{ github.base_ref }}\` + โŒ *[PENPOT] Error during the execution of the job* + ๐Ÿ“„ Triggered from ref: `${{ steps.vars.outputs.gh_branch}}` ๐Ÿ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: Notify Mattermost about manual bundles - if: github.event_name == 'workflow_dispatch' - uses: mattermost/action-mattermost-notify@master - with: - MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} - TEXT: | - ๐Ÿ“ฆ *Penpot bundle manually generated* - ๐Ÿ“„ Triggered from branch: `${{ github.ref_name}}` - ๐Ÿ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: Print artifact summary URL - run: | - echo "๐Ÿ“ฆ Artifacts available at:" - echo "๐Ÿ”— https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/build-develop.yml b/.github/workflows/build-develop.yml new file mode 100644 index 0000000000..dddcceeeb9 --- /dev/null +++ b/.github/workflows/build-develop.yml @@ -0,0 +1,12 @@ +name: Build and Upload Penpot DEVELOP Bundles + +on: + schedule: + - cron: '16 5-20 * * 1-5' + +jobs: + build-develop-bundle: + uses: ./.github/workflows/build-bundles.yml + secrets: inherit + with: + gh_ref: "develop" diff --git a/.github/workflows/build-staging.yml b/.github/workflows/build-staging.yml new file mode 100644 index 0000000000..1d49914d9c --- /dev/null +++ b/.github/workflows/build-staging.yml @@ -0,0 +1,12 @@ +name: Build and Upload Penpot STAGING Bundles + +on: + schedule: + - cron: '0 5 * * 1-5' + +jobs: + build-staging-bundle: + uses: ./.github/workflows/build-bundles.yml + secrets: inherit + with: + gh_ref: "staging" From c1aae12327f8d5fe29b0ebfd3903d1ef5af4a26a Mon Sep 17 00:00:00 2001 From: Yamila Moreno Date: Thu, 7 Aug 2025 18:08:25 +0200 Subject: [PATCH 4/7] :paperclip: Improve gh actions --- .github/workflows/build-bundles.yml | 105 ++++++---------------------- .github/workflows/build-develop.yml | 12 ++++ .github/workflows/build-staging.yml | 12 ++++ 3 files changed, 44 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/build-develop.yml create mode 100644 .github/workflows/build-staging.yml diff --git a/.github/workflows/build-bundles.yml b/.github/workflows/build-bundles.yml index ff2f37f75f..a8efc23fa3 100644 --- a/.github/workflows/build-bundles.yml +++ b/.github/workflows/build-bundles.yml @@ -1,28 +1,14 @@ -name: Build and Upload Penpot Bundles non-prod +name: Build and Upload Penpot Bundles on: - # Create bundler for every tag - push: - tags: - - '**' # Pattern matched against refs/tags - # Create bundler every hour between 5:00 and 20:00 on working days - schedule: - - cron: '0 5-20 * * 1-5' - # Create bundler from manual action + # Create bundle from manual action workflow_dispatch: + workflow_call: inputs: - zip_mode: - # zip_mode defines how the build artifacts are packaged: - # - 'individual': creates one ZIP file per component (frontend, backend, exporter) - # - 'all': creates a single ZIP containing all components - # - null: for the rest of cases (non-manual events) - description: 'Bundle packaging mode' - required: false - default: 'individual' - type: choice - options: - - individual - - all + gh_ref: + description: 'Name of the branch' + type: string + required: true jobs: build-bundles: @@ -38,15 +24,15 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: ${{ inputs.gh_ref }} - - name: Extract somer useful variables + - name: Extract some useful variables id: vars run: | echo "commit_hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "gh_branch=${{ github.base_ref || github.ref_name }}" >> $GITHUB_OUTPUT - # Set up Docker Buildx for multi-arch build - - name: Set up Docker Buildx + - name: Set up Docker Buildx for multi-arch build uses: docker/setup-buildx-action@v3 - name: Run manage.sh build-bundle from host @@ -57,73 +43,22 @@ jobs: mkdir zips mv bundles penpot - - name: Create zip bundles for zip_mode == 'all' - if: ${{ github.event.inputs.zip_mode == 'all' }} + - name: Create zip bundles run: | - echo "๐Ÿ“ฆ Packaging Penpot 'all' bundles..." - zip -r zips/penpot-all-bundles.zip penpot + echo "๐Ÿ“ฆ Packaging Penpot bundles..." + zip -r zips/penpot.zip penpot - - name: Create zip bundles for zip_mode != 'all' - if: ${{ github.event.inputs.zip_mode != 'all' }} + - name: Upload Penpot bundle to S3 run: | - echo "๐Ÿ“ฆ Packaging Penpot 'individual' bundles..." - zip -r zips/penpot-frontend.zip penpot/frontend - zip -r zips/penpot-backend.zip penpot/backend - zip -r zips/penpot-exporter.zip penpot/exporter + aws s3 cp zips/penpot.zip s3://${{ secrets.S3_BUCKET }}/penpot-${{ steps.vars.outputs.gh_branch}}-latest.zip + aws s3 cp zips/penpot.zip s3://${{ secrets.S3_BUCKET }}/penpot-${{ steps.vars.outputs.commit_hash }}.zip - - name: Upload unified 'all' bundle - if: ${{ github.event.inputs.zip_mode == 'all' }} - uses: actions/upload-artifact@v4 - with: - name: penpot-all-bundles - path: zips/penpot-all-bundles.zip - - - name: Upload individual bundles - if: ${{ github.event.inputs.zip_mode != 'all' }} - uses: actions/upload-artifact@v4 - with: - name: penpot-individual-bundles - path: | - zips/penpot-frontend.zip - zips/penpot-backend.zip - zips/penpot-exporter.zip - - - name: Upload unified 'all' bundle to S3 - if: ${{ github.event.inputs.zip_mode == 'all' }} - run: | - aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.gh_branch}}.zip - aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.commit_hash }}.zip - - - name: Upload 'individual' bundles to S3 - if: ${{ github.event.inputs.zip_mode != 'all' }} - run: | - for name in penpot-frontend penpot-backend penpot-exporter; do - aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.gh_branch }}-latest.zip - aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.commit_hash }}.zip - done - - - name: Notify Mattermost about automatic bundles - if: github.event_name == 'pull_request' + - name: Notify Mattermost + if: failure() uses: mattermost/action-mattermost-notify@master with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} TEXT: | - ๐Ÿ“ฆ *Penpot bundle automatically generated* - ๐Ÿ“„ PR: ${{ github.event.pull_request.title }} - ๐Ÿ” From: \`${{ github.head_ref }}\` to \`{{ github.base_ref }}\` + โŒ *[PENPOT] Error during the execution of the job* + ๐Ÿ“„ Triggered from ref: `${{ steps.vars.outputs.gh_branch}}` ๐Ÿ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: Notify Mattermost about manual bundles - if: github.event_name == 'workflow_dispatch' - uses: mattermost/action-mattermost-notify@master - with: - MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} - TEXT: | - ๐Ÿ“ฆ *Penpot bundle manually generated* - ๐Ÿ“„ Triggered from branch: `${{ github.ref_name}}` - ๐Ÿ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: Print artifact summary URL - run: | - echo "๐Ÿ“ฆ Artifacts available at:" - echo "๐Ÿ”— https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/build-develop.yml b/.github/workflows/build-develop.yml new file mode 100644 index 0000000000..dddcceeeb9 --- /dev/null +++ b/.github/workflows/build-develop.yml @@ -0,0 +1,12 @@ +name: Build and Upload Penpot DEVELOP Bundles + +on: + schedule: + - cron: '16 5-20 * * 1-5' + +jobs: + build-develop-bundle: + uses: ./.github/workflows/build-bundles.yml + secrets: inherit + with: + gh_ref: "develop" diff --git a/.github/workflows/build-staging.yml b/.github/workflows/build-staging.yml new file mode 100644 index 0000000000..1d49914d9c --- /dev/null +++ b/.github/workflows/build-staging.yml @@ -0,0 +1,12 @@ +name: Build and Upload Penpot STAGING Bundles + +on: + schedule: + - cron: '0 5 * * 1-5' + +jobs: + build-staging-bundle: + uses: ./.github/workflows/build-bundles.yml + secrets: inherit + with: + gh_ref: "staging" From 32bd08533d1c6b82061bd5a526d24f1beeae17f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?andr=C3=A9s=20gonz=C3=A1lez?= Date: Fri, 8 Aug 2025 09:46:40 +0200 Subject: [PATCH 5/7] :lipstick: Remove slide about overrides in the release notes (#7086) --- frontend/src/app/main/ui/releases/v2_9.cljs | 34 ++------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/frontend/src/app/main/ui/releases/v2_9.cljs b/frontend/src/app/main/ui/releases/v2_9.cljs index 47f4183117..600df72665 100644 --- a/frontend/src/app/main/ui/releases/v2_9.cljs +++ b/frontend/src/app/main/ui/releases/v2_9.cljs @@ -74,42 +74,12 @@ [:& c/navigation-bullets {:slide slide :navigate navigate - :total 3}] + :total 2}] [: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.9-overrides.gif" - :class (stl/css :start-image) - :border "0" - :alt "Component text overrides"}] - - [:div {:class (stl/css :modal-content)} - [:div {:class (stl/css :modal-header)} - [:h1 {:class (stl/css :modal-title)} - "Component text overrides"]] - - [:div {:class (stl/css :feature)} - [:p {:class (stl/css :feature-content)} - "You can now edit the text content independently from its propertiesโ€”such as color, effects, font size, or weightโ€”allowing you to update the wording while preserving the styling."] - - [:p {:class (stl/css :feature-content)} - "This change (inspired by community feedback) greatly improves consistency, predictability, and control when working with texts in components."]] - - [: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)} @@ -135,7 +105,7 @@ [:& c/navigation-bullets {:slide slide :navigate navigate - :total 3}] + :total 2}] [:button {:on-click finish :class (stl/css :next-btn)} "Let's go"]]]]]]))) From 0131cd6f8b7853ecc8c8f7e7e4aa8c6b13a8367f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Mon, 11 Aug 2025 09:07:24 +0200 Subject: [PATCH 6/7] :sparkles: Display the total price of the subscription and the cap amount (#7088) --- .../src/app/main/ui/settings/subscription.cljs | 11 ++++++++++- .../src/app/main/ui/settings/subscription.scss | 14 ++++++++++++++ frontend/translations/en.po | 4 +++- frontend/translations/es.po | 4 +++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/settings/subscription.cljs b/frontend/src/app/main/ui/settings/subscription.cljs index e693da8f33..b1bbad4342 100644 --- a/frontend/src/app/main/ui/settings/subscription.cljs +++ b/frontend/src/app/main/ui/settings/subscription.cljs @@ -150,7 +150,16 @@ :class (stl/css :input-field)}]] [:div {:class (stl/css :editors-cost)} [:span {:class (stl/css :modal-text-small)} - (tr "subscription.settings.management.dialog.price-month" (or (get-in @form [:clean-data :min-members]) 0))] + (when (> (get-in @form [:clean-data :min-members]) 25) + [:> i18n/tr-html* + {:class (stl/css :modal-text-cap) + :tag-name "span" + :content (tr "subscription.settings.management.dialog.price-month" "175")}]) + [:> i18n/tr-html* + {:class (stl/css-case :text-strikethrough (> (get-in @form [:clean-data :min-members]) 25)) + :tag-name "span" + :content (tr "subscription.settings.management.dialog.price-month" + (* 7 (or (get-in @form [:clean-data :min-members]) 0)))}]] [:span {:class (stl/css :modal-text-small)} (tr "subscription.settings.management.dialog.payment-explanation")]]] diff --git a/frontend/src/app/main/ui/settings/subscription.scss b/frontend/src/app/main/ui/settings/subscription.scss index b69ea7a115..43b8df9804 100644 --- a/frontend/src/app/main/ui/settings/subscription.scss +++ b/frontend/src/app/main/ui/settings/subscription.scss @@ -199,6 +199,20 @@ @include t.use-typography("body-small"); } +.modal-text-cap { + margin-inline-end: var(--sp-s); +} + +.text-strikethrough { + text-decoration: line-through; +} + +.modal-text-small strong, +.text-strikethrough strong, +.modal-text-cap strong { + font-weight: $fw700; +} + .modal-content, .modal-end { color: var(--color-foreground-secondary); diff --git a/frontend/translations/en.po b/frontend/translations/en.po index c3328ae363..c1e2ff5347 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -4441,8 +4441,10 @@ msgid "subscription.settings.management.dialog.payment-explanation" msgstr "(No payment will be made now)" #: src/app/main/ui/settings/subscription.cljs:124 +#, markdown msgid "subscription.settings.management.dialog.price-month" -msgstr "$7 per editor/month x %s" +msgstr "" +"**$%s** per month" #: src/app/main/ui/settings/subscription.cljs:112 msgid "subscription.settings.management.dialog.select-editors" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 562c8e1752..6b38dbc10e 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -4474,8 +4474,10 @@ msgid "subscription.settings.management.dialog.payment-explanation" msgstr "(Ahora no se efectuarรก ningรบn pago)" #: src/app/main/ui/settings/subscription.cljs:124 +#, markdown msgid "subscription.settings.management.dialog.price-month" -msgstr "$7 por editor/mes x %s" +msgstr "" +"**$%s** por mes" #: src/app/main/ui/settings/subscription.cljs:112 msgid "subscription.settings.management.dialog.select-editors" From 8e0a6e41230195731230590a59f953bb6d2bd680 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 11 Aug 2025 09:07:43 +0200 Subject: [PATCH 7/7] :bug: Fix auto height is fixed in the HTML inspect tab for text elements (#7078) --- CHANGES.md | 1 + frontend/src/app/util/code_gen/style_css_values.cljs | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 832b1be0ad..dadd4462c8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -58,6 +58,7 @@ - Fix export button width on inspect tab [Taiga #11394](https://tree.taiga.io/project/penpot/issue/11394) - Fix stroke width token application [Taiga #11724](https://tree.taiga.io/project/penpot/issue/11724) - Fix number token application on shape [Taiga #11331](https://tree.taiga.io/project/penpot/task/11331) +- Fix auto height is fixed in the HTML inspect tab for text elements [Taiga #11680](https://tree.taiga.io/project/penpot/task/11680) ## 2.8.1 diff --git a/frontend/src/app/util/code_gen/style_css_values.cljs b/frontend/src/app/util/code_gen/style_css_values.cljs index fe2179c8d4..1053e44bb5 100644 --- a/frontend/src/app/util/code_gen/style_css_values.cljs +++ b/frontend/src/app/util/code_gen/style_css_values.cljs @@ -116,13 +116,17 @@ (let [root? (contains? (:root-shapes options) (:id shape))] (if (and root? (ctl/any-layout? shape)) :fill - (get-shape-size shape objects :width)))) + ;; Don't set fixed width for auto-width text shapes + (when-not (and (cfh/text-shape? shape) (= (:grow-type shape) :auto-width)) + (get-shape-size shape objects :width))))) (defmethod get-value :height [_ shape objects options] (let [root? (contains? (:root-shapes options) (:id shape))] (when-not (and root? (ctl/any-layout? shape)) - (get-shape-size shape objects :height)))) + ;; Don't set fixed height for auto-height text shapes + (when-not (and (cfh/text-shape? shape) (= (:grow-type shape) :auto-height)) + (get-shape-size shape objects :height))))) (defmethod get-value :flex-grow [_ shape _ options]