From a1460115e843325673e60b593430485af800cc9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 21 Jan 2026 18:31:54 +0100 Subject: [PATCH 01/19] :wrench: Deploy penpot api documentation --- .github/workflows/plugins-deploy-api-doc.yml | 73 ++++++++++++++++++++ plugins/wrangle-penpot-plugins-api-doc.toml | 4 ++ 2 files changed, 77 insertions(+) create mode 100644 .github/workflows/plugins-deploy-api-doc.yml create mode 100644 plugins/wrangle-penpot-plugins-api-doc.toml diff --git a/.github/workflows/plugins-deploy-api-doc.yml b/.github/workflows/plugins-deploy-api-doc.yml new file mode 100644 index 0000000000..1c67d4f47b --- /dev/null +++ b/.github/workflows/plugins-deploy-api-doc.yml @@ -0,0 +1,73 @@ +name: Plugins/api-doc deployer + +on: + push: + branches: + - develop + - staging + - main + paths: + - "plugins/**" + - ".github/workflows/deploy-plugin-docs.yml" + - "wrangle-penpot-plugins-api-doc.toml" + workflow_dispatch: + inputs: + gh_ref: + description: 'Name of the branch or ref' + type: string + required: true + default: 'develop' + +permissions: + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + defaults: + run: + working-directory: plugins + steps: + - name: Extract some useful variables + id: vars + run: | + echo "gh_ref=${{ inputs.gh_ref || github.ref_name }}" >> $GITHUB_OUTPUT + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ steps.vars.outputs.gh_ref }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: "pnpm" + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build docs + run: pnpm run build:doc + + - name: Select Worker name + run: | + REF="${{ steps.vars.outputs.gh_ref }}" + case "$REF" in + main) echo "WORKER_NAME=penpot-plugins-api-doc-pro" >> $GITHUB_ENV ;; + staging) echo "WORKER_NAME=penpot-plugins-api-doc-pre" >> $GITHUB_ENV ;; + develop) echo "WORKER_NAME=penpot-plugins-api-doc-hourly" >> $GITHUB_ENV ;; + *) echo "Unsupported branch ${REF}" && exit 1 ;; + esac + + - name: Deploy to Cloudflare Workers + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: deploy --config wrangle-penpot-plugins-api-doc.toml --name ${{ env.WORKER_NAME }} diff --git a/plugins/wrangle-penpot-plugins-api-doc.toml b/plugins/wrangle-penpot-plugins-api-doc.toml new file mode 100644 index 0000000000..e9535be2d8 --- /dev/null +++ b/plugins/wrangle-penpot-plugins-api-doc.toml @@ -0,0 +1,4 @@ +name = "penpot-plugins-api-doc" +compatibility_date = "2025-01-01" + +assets = { directory = "dist/doc" } From 16f22a7b5c5fbd817db40fd67368cb629a3da56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Thu, 22 Jan 2026 11:38:22 +0100 Subject: [PATCH 02/19] :wrench: Fixes to the API documentation deployer --- .github/workflows/plugins-deploy-api-doc.yml | 58 +++++++++++++++----- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/.github/workflows/plugins-deploy-api-doc.yml b/.github/workflows/plugins-deploy-api-doc.yml index 1c67d4f47b..62a87745bb 100644 --- a/.github/workflows/plugins-deploy-api-doc.yml +++ b/.github/workflows/plugins-deploy-api-doc.yml @@ -7,16 +7,22 @@ on: - staging - main paths: - - "plugins/**" - - ".github/workflows/deploy-plugin-docs.yml" - - "wrangle-penpot-plugins-api-doc.toml" + - "plugins/libs/plugin-types/index.d.ts" + - "plugins/libs/plugin-types/REAME.md" + - "plugins/tools/typedoc.css" + - "plugins/CHANGELOG.md" + - "plugins/wrangle-penpot-plugins-api-doc.toml" workflow_dispatch: inputs: gh_ref: - description: 'Name of the branch or ref' - type: string + description: 'Name of the branch' + type: choice required: true default: 'develop' + options: + - develop + - staging + - main permissions: contents: read @@ -24,9 +30,6 @@ permissions: jobs: deploy: runs-on: ubuntu-latest - defaults: - run: - working-directory: plugins steps: - name: Extract some useful variables id: vars @@ -39,20 +42,44 @@ jobs: fetch-depth: 0 ref: ${{ steps.vars.outputs.gh_ref }} + # START: Setup Node and PNPM enabling cache - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: - cache: "pnpm" + node-version-file: .nvmrc - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Enable PNPM + working-directory: ./plugins + shell: bash + run: | + corepack enable; + corepack install; + + - name: Get pnpm store path + id: pnpm-store + working-directory: ./plugins + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT + + - name: Cache pnpm store + uses: actions/cache@v4 with: - run_install: false + path: ${{ steps.pnpm-store.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-${{ hashFiles('plugins/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + # END: Setup Node and PNPM enabling cache - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Install deps + working-directory: ./plugins + shell: bash + run: | + pnpm install --no-frozen-lockfile; + pnpm add -D -w wrangler@latest; - name: Build docs + working-directory: plugins + shell: bash run: pnpm run build:doc - name: Select Worker name @@ -68,6 +95,7 @@ jobs: - name: Deploy to Cloudflare Workers uses: cloudflare/wrangler-action@v3 with: + workingDirectory: plugins apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: deploy --config wrangle-penpot-plugins-api-doc.toml --name ${{ env.WORKER_NAME }} From 599656c31e7f6e1d5049c8597f8f7442525258de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 5 Jan 2026 09:13:14 +0100 Subject: [PATCH 03/19] :wrench: Fix a typo in an interpolation --- .github/workflows/build-tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-tag.yml b/.github/workflows/build-tag.yml index 80ef7bcaeb..c32e363888 100644 --- a/.github/workflows/build-tag.yml +++ b/.github/workflows/build-tag.yml @@ -33,7 +33,7 @@ jobs: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} MATTERMOST_CHANNEL: bot-alerts-cicd TEXT: | - 🐳 *[PENPOT] Docker image available: {{ github.ref_name }}* + 🐳 *[PENPOT] Docker image available: ${{ github.ref_name }}* πŸ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} @infra From a9741073e59efa1f6969047b569dce8c5ca9312e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 23 Jan 2026 20:13:04 +0100 Subject: [PATCH 04/19] :wrench: Add deploy plugin packages workflow placeholder and wrangle config files --- .github/workflows/plugins-deploy-package.yml | 11 +++++++++++ .github/workflows/plugins-deploy-packages.yml | 11 +++++++++++ plugins/apps/colors-to-tokens-plugin/wrangle.toml | 4 ++++ plugins/apps/contrast-plugin/wrangle.toml | 4 ++++ plugins/apps/create-palette-plugin/wrangle.toml | 4 ++++ plugins/apps/icons-plugin/wrangle.toml | 4 ++++ plugins/apps/lorem-ipsum-plugin/wrangle.toml | 4 ++++ plugins/apps/rename-layers-plugin/wrangle.toml | 5 +++++ plugins/apps/table-plugin/wrangle.toml | 5 +++++ 9 files changed, 52 insertions(+) create mode 100644 .github/workflows/plugins-deploy-package.yml create mode 100644 .github/workflows/plugins-deploy-packages.yml create mode 100644 plugins/apps/colors-to-tokens-plugin/wrangle.toml create mode 100644 plugins/apps/contrast-plugin/wrangle.toml create mode 100644 plugins/apps/create-palette-plugin/wrangle.toml create mode 100644 plugins/apps/icons-plugin/wrangle.toml create mode 100644 plugins/apps/lorem-ipsum-plugin/wrangle.toml create mode 100644 plugins/apps/rename-layers-plugin/wrangle.toml create mode 100644 plugins/apps/table-plugin/wrangle.toml diff --git a/.github/workflows/plugins-deploy-package.yml b/.github/workflows/plugins-deploy-package.yml new file mode 100644 index 0000000000..ca5fe817de --- /dev/null +++ b/.github/workflows/plugins-deploy-package.yml @@ -0,0 +1,11 @@ +name: Plugins/package deployer + +on: + workflow_dispatch: + +jobs: + print_text_job: + runs-on: ubuntu-latest + steps: + - name: Print Hello World + run: echo "Hello, World!" diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml new file mode 100644 index 0000000000..cabc045f00 --- /dev/null +++ b/.github/workflows/plugins-deploy-packages.yml @@ -0,0 +1,11 @@ +name: Plugins/packages deployer + +on: + workflow_dispatch: + +jobs: + print_text_job: + runs-on: ubuntu-latest + steps: + - name: Print Hello World + run: echo "Hello, World!" diff --git a/plugins/apps/colors-to-tokens-plugin/wrangle.toml b/plugins/apps/colors-to-tokens-plugin/wrangle.toml new file mode 100644 index 0000000000..7722755890 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "color-to-tokens-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/color-to-tokens-plugin/browser" } diff --git a/plugins/apps/contrast-plugin/wrangle.toml b/plugins/apps/contrast-plugin/wrangle.toml new file mode 100644 index 0000000000..726ae60d6e --- /dev/null +++ b/plugins/apps/contrast-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "contrast-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/contrast-plugin/browser" } diff --git a/plugins/apps/create-palette-plugin/wrangle.toml b/plugins/apps/create-palette-plugin/wrangle.toml new file mode 100644 index 0000000000..74c4b73cb6 --- /dev/null +++ b/plugins/apps/create-palette-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "create-palette-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/create-palette-plugin" } diff --git a/plugins/apps/icons-plugin/wrangle.toml b/plugins/apps/icons-plugin/wrangle.toml new file mode 100644 index 0000000000..26e7514ec8 --- /dev/null +++ b/plugins/apps/icons-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "icons-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/icons-plugin/browser" } diff --git a/plugins/apps/lorem-ipsum-plugin/wrangle.toml b/plugins/apps/lorem-ipsum-plugin/wrangle.toml new file mode 100644 index 0000000000..9e4d9366f0 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "lorem-ipsum-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/lorem-ipsum-plugin/browser" } diff --git a/plugins/apps/rename-layers-plugin/wrangle.toml b/plugins/apps/rename-layers-plugin/wrangle.toml new file mode 100644 index 0000000000..1dc6c2fe0a --- /dev/null +++ b/plugins/apps/rename-layers-plugin/wrangle.toml @@ -0,0 +1,5 @@ +name = "rename-layers-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/rename-layers-plugin/browser" } + diff --git a/plugins/apps/table-plugin/wrangle.toml b/plugins/apps/table-plugin/wrangle.toml new file mode 100644 index 0000000000..516dd54b1e --- /dev/null +++ b/plugins/apps/table-plugin/wrangle.toml @@ -0,0 +1,5 @@ +name = "table-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/table-plugin/browser" } + From e590cd852d27ef01fea3ac3d952dc0cb9b5b81cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 09:33:37 +0100 Subject: [PATCH 05/19] :wrench: Rename wrangle to wrangler --- .github/workflows/plugins-deploy-api-doc.yml | 16 ++++++++++++++-- .../{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 4 ++++ .../icons-plugin/{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 3 +++ .../table-plugin/{wrangle.toml => wrangler.toml} | 3 +++ ...toml => wrangler-penpot-plugins-api-doc.toml} | 0 9 files changed, 40 insertions(+), 2 deletions(-) rename plugins/apps/colors-to-tokens-plugin/{wrangle.toml => wrangler.toml} (71%) rename plugins/apps/contrast-plugin/{wrangle.toml => wrangler.toml} (69%) rename plugins/apps/create-palette-plugin/{wrangle.toml => wrangler.toml} (70%) rename plugins/apps/icons-plugin/{wrangle.toml => wrangler.toml} (68%) rename plugins/apps/lorem-ipsum-plugin/{wrangle.toml => wrangler.toml} (70%) rename plugins/apps/rename-layers-plugin/{wrangle.toml => wrangler.toml} (71%) rename plugins/apps/table-plugin/{wrangle.toml => wrangler.toml} (68%) rename plugins/{wrangle-penpot-plugins-api-doc.toml => wrangler-penpot-plugins-api-doc.toml} (100%) diff --git a/.github/workflows/plugins-deploy-api-doc.yml b/.github/workflows/plugins-deploy-api-doc.yml index 62a87745bb..f8451e9816 100644 --- a/.github/workflows/plugins-deploy-api-doc.yml +++ b/.github/workflows/plugins-deploy-api-doc.yml @@ -11,7 +11,7 @@ on: - "plugins/libs/plugin-types/REAME.md" - "plugins/tools/typedoc.css" - "plugins/CHANGELOG.md" - - "plugins/wrangle-penpot-plugins-api-doc.toml" + - "plugins/wrangler-penpot-plugins-api-doc.toml" workflow_dispatch: inputs: gh_ref: @@ -98,4 +98,16 @@ jobs: workingDirectory: plugins apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: deploy --config wrangle-penpot-plugins-api-doc.toml --name ${{ env.WORKER_NAME }} + command: deploy --config wrangler-penpot-plugins-api-doc.toml --name ${{ env.WORKER_NAME }} + + - name: Notify Mattermost + if: failure() + uses: mattermost/action-mattermost-notify@master + with: + MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} + MATTERMOST_CHANNEL: bot-alerts-cicd + TEXT: | + ❌ πŸ§©πŸ“š *[PENPOT PLUGINS] Error deploying API documentation.* + πŸ“„ Triggered from ref: `${{ inputs.gh_ref }}` + πŸ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + @infra diff --git a/plugins/apps/colors-to-tokens-plugin/wrangle.toml b/plugins/apps/colors-to-tokens-plugin/wrangler.toml similarity index 71% rename from plugins/apps/colors-to-tokens-plugin/wrangle.toml rename to plugins/apps/colors-to-tokens-plugin/wrangler.toml index 7722755890..c1d45f3e87 100644 --- a/plugins/apps/colors-to-tokens-plugin/wrangle.toml +++ b/plugins/apps/colors-to-tokens-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "color-to-tokens-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/color-to-tokens-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/contrast-plugin/wrangle.toml b/plugins/apps/contrast-plugin/wrangler.toml similarity index 69% rename from plugins/apps/contrast-plugin/wrangle.toml rename to plugins/apps/contrast-plugin/wrangler.toml index 726ae60d6e..86f456ec95 100644 --- a/plugins/apps/contrast-plugin/wrangle.toml +++ b/plugins/apps/contrast-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "contrast-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/contrast-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/create-palette-plugin/wrangle.toml b/plugins/apps/create-palette-plugin/wrangler.toml similarity index 70% rename from plugins/apps/create-palette-plugin/wrangle.toml rename to plugins/apps/create-palette-plugin/wrangler.toml index 74c4b73cb6..40f4f67a38 100644 --- a/plugins/apps/create-palette-plugin/wrangle.toml +++ b/plugins/apps/create-palette-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "create-palette-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/create-palette-plugin" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/icons-plugin/wrangle.toml b/plugins/apps/icons-plugin/wrangler.toml similarity index 68% rename from plugins/apps/icons-plugin/wrangle.toml rename to plugins/apps/icons-plugin/wrangler.toml index 26e7514ec8..0a690dac57 100644 --- a/plugins/apps/icons-plugin/wrangle.toml +++ b/plugins/apps/icons-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "icons-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/icons-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/lorem-ipsum-plugin/wrangle.toml b/plugins/apps/lorem-ipsum-plugin/wrangler.toml similarity index 70% rename from plugins/apps/lorem-ipsum-plugin/wrangle.toml rename to plugins/apps/lorem-ipsum-plugin/wrangler.toml index 9e4d9366f0..398691c3ba 100644 --- a/plugins/apps/lorem-ipsum-plugin/wrangle.toml +++ b/plugins/apps/lorem-ipsum-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "lorem-ipsum-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/lorem-ipsum-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/rename-layers-plugin/wrangle.toml b/plugins/apps/rename-layers-plugin/wrangler.toml similarity index 71% rename from plugins/apps/rename-layers-plugin/wrangle.toml rename to plugins/apps/rename-layers-plugin/wrangler.toml index 1dc6c2fe0a..4fdc18597d 100644 --- a/plugins/apps/rename-layers-plugin/wrangle.toml +++ b/plugins/apps/rename-layers-plugin/wrangler.toml @@ -3,3 +3,6 @@ compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/rename-layers-plugin/browser" } +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/table-plugin/wrangle.toml b/plugins/apps/table-plugin/wrangler.toml similarity index 68% rename from plugins/apps/table-plugin/wrangle.toml rename to plugins/apps/table-plugin/wrangler.toml index 516dd54b1e..9c95160a01 100644 --- a/plugins/apps/table-plugin/wrangle.toml +++ b/plugins/apps/table-plugin/wrangler.toml @@ -3,3 +3,6 @@ compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/table-plugin/browser" } +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/wrangle-penpot-plugins-api-doc.toml b/plugins/wrangler-penpot-plugins-api-doc.toml similarity index 100% rename from plugins/wrangle-penpot-plugins-api-doc.toml rename to plugins/wrangler-penpot-plugins-api-doc.toml From 719a95246ac9c3753f2a53fc56936050ce68c89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 09:34:01 +0100 Subject: [PATCH 06/19] :wrench: Define deploy plugin packages workflows --- .github/workflows/plugins-deploy-package.yml | 124 ++++++++++++++++- .github/workflows/plugins-deploy-packages.yml | 130 +++++++++++++++++- 2 files changed, 247 insertions(+), 7 deletions(-) diff --git a/.github/workflows/plugins-deploy-package.yml b/.github/workflows/plugins-deploy-package.yml index ca5fe817de..cad4b1524f 100644 --- a/.github/workflows/plugins-deploy-package.yml +++ b/.github/workflows/plugins-deploy-package.yml @@ -1,11 +1,127 @@ name: Plugins/package deployer on: + # Deploy package from manual action workflow_dispatch: + inputs: + gh_ref: + description: 'Name of the branch' + type: choice + required: true + default: 'develop' + options: + - develop + - staging + - main + plugin_name: + description: 'Pluging name (like plugins/apps/-plugin)' + type: string + required: true + workflow_call: + inputs: + gh_ref: + description: 'Name of the branch' + type: string + required: true + default: 'develop' + plugin_name: + description: 'Publig name (from plugins/apps/-plugin)' + type: string + required: true + +permissions: + contents: read jobs: - print_text_job: - runs-on: ubuntu-latest + deploy: + runs-on: penpot-runner-01 steps: - - name: Print Hello World - run: echo "Hello, World!" + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ inputs.gh_ref }} + + # START: Setup Node and PNPM enabling cache + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Enable PNPM + working-directory: ./plugins + shell: bash + run: | + corepack enable; + corepack install; + + - name: Get pnpm store path + id: pnpm-store + working-directory: ./plugins + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT + + - name: Cache pnpm store + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-store.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-${{ hashFiles('plugins/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + # END: Setup Node and PNPM enabling cache + + - name: Install deps + working-directory: ./plugins + shell: bash + run: | + pnpm install --no-frozen-lockfile; + pnpm add -D -w wrangler@latest; + + - name: "Build package for ${{ inputs.plugin_name }}-plugin" + working-directory: plugins + shell: bash + run: npx nx build ${{ inputs.plugin_name }}-plugin + + - name: Select Worker name + run: | + REF="${{ inputs.gh_ref }}" + case "$REF" in + main) + echo "WORKER_NAME=${{ inputs.plugin_name }}-plugin-pro" >> $GITHUB_ENV + echo "WORKER_URI=${{ inputs.plugin_name }}.plugins.penpot.app" >> $GITHUB_ENV ;; + staging) + echo "WORKER_NAME=${{ inputs.plugin_name }}-plugin-pre" >> $GITHUB_ENV + echo "WORKER_URI=${{ inputs.plugin_name }}.plugins.penpot.dev" >> $GITHUB_ENV ;; + develop) + echo "WORKER_NAME=${{ inputs.plugin_name }}-plugin-hourly" >> $GITHUB_ENV + echo "WORKER_URI=${{ inputs.plugin_name }}.plugins.hourly.penpot.dev" >> $GITHUB_ENV ;; + *) echo "Unsupported branch ${REF}" && exit 1 ;; + esac + + - name: Set the custom url + working-directory: plugins + shell: bash + run: | + sed -i "s/WORKER_URI/${{ env.WORKER_URI }}/g" apps/${{ inputs.plugin_name }}-plugin/wrangler.toml + + - name: Deploy to Cloudflare Workers + uses: cloudflare/wrangler-action@v3 + with: + workingDirectory: plugins + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: deploy --config apps/${{ inputs.plugin_name }}-plugin/wrangler.toml --name ${{ env.WORKER_NAME }} + + - name: Notify Mattermost + if: failure() + uses: mattermost/action-mattermost-notify@master + with: + MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} + MATTERMOST_CHANNEL: bot-alerts-cicd + TEXT: | + ❌ πŸ§©πŸ“¦ *[PENPOT PLUGINS] Error deploying ${{ env.WORKER_NAME }}.* + πŸ“„ Triggered from ref: `${{ inputs.gh_ref }}` + Plugin name: `${{ inputs.plugin_name }}-plugin` + Cloudflare worker name: `${{ env.WORKER_NAME }}` + πŸ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + @infra diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml index cabc045f00..d1060389d5 100644 --- a/.github/workflows/plugins-deploy-packages.yml +++ b/.github/workflows/plugins-deploy-packages.yml @@ -1,11 +1,135 @@ name: Plugins/packages deployer on: + push: + branches: + - develop + - staging + - main + paths: + - 'plugins/apps/*-plugin/**' + - 'libs/plugins-styles/**' workflow_dispatch: + inputs: + gh_ref: + description: 'Name of the branch' + type: choice + required: true + default: 'develop' + options: + - develop + - staging + - main jobs: - print_text_job: + detect-changes: runs-on: ubuntu-latest + outputs: + colors_to_tokens: ${{ steps.filter.outputs.colors_to_tokens }} + create_palette: ${{ steps.filter.outputs.create_palette }} + lorem_ipsum: ${{ steps.filter.outputs.lorem_ipsum }} + rename_layers: ${{ steps.filter.outputs.rename_layers }} + contrast: ${{ steps.filter.outputs.contrast }} + icons: ${{ steps.filter.outputs.icons }} + poc_state: ${{ steps.filter.outputs.poc_state }} + table: ${{ steps.filter.outputs.table }} + # [For new plugins] + # Add more outputs here steps: - - name: Print Hello World - run: echo "Hello, World!" + - uses: actions/checkout@v4 + - id: filter + uses: dorny/paths-filter@v3 + with: + filters: | + colors_to_tokens: + - 'plugins/apps/colors-to-tokens-plugin/**' + - 'libs/plugins-styles/**' + contrast: + - 'plugins/apps/contrast-plugin/**' + - 'libs/plugins-styles/**' + create_palette: + - 'plugins/apps/create-palette-plugin/**' + - 'libs/plugins-styles/**' + icons: + - 'plugins/apps/icons-plugin/**' + - 'libs/plugins-styles/**' + lorem_ipsum: + - 'plugins/apps/lorem-ipsum-plugin/**' + - 'libs/plugins-styles/**' + rename_layers: + - 'plugins/apps/rename-layers-plugin/**' + - 'libs/plugins-styles/**' + table: + - 'plugins/apps/table-plugin/**' + - 'libs/plugins-styles/**' + # [For new plugins] + # Add more plugin filters here + # another_plugin: + # - 'plugins/apps/another-plugin/**' + # - 'libs/plugins-styles/**' + + colors-to-tokens-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.colors_to_tokens == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: colors-to-tokens + + contrast-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.contrast == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: contrast + + create-palette-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.create_palette == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: create-palette + + icons-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.icons == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: icons + + lorem-ipsum-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.lorem_ipsum == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: lorem-ipsum + + rename-layers-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.rename_layers == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: rename-layers + + table-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.table == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: table + + # [For new plugins] + # Add more jobs for other plugins below, following the same pattern + # another-plugin: + # needs: detect-changes + # if: needs.detect-changes.outputs.another_plugin == 'true' + # uses: ./.github/workflows/plugins-deploy-package.yml + # with: + # gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + # plugin_name: another From 38179ba11e5ee4ab3546d7c6efe82cbc253c9b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 14:00:09 +0100 Subject: [PATCH 07/19] :wrench: Enable secret inheritance --- .github/workflows/plugins-deploy-packages.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml index d1060389d5..b7c9c3af47 100644 --- a/.github/workflows/plugins-deploy-packages.yml +++ b/.github/workflows/plugins-deploy-packages.yml @@ -72,6 +72,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.colors_to_tokens == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: colors-to-tokens @@ -80,6 +81,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.contrast == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: contrast @@ -88,6 +90,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.create_palette == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: create-palette @@ -96,6 +99,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.icons == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: icons @@ -104,6 +108,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.lorem_ipsum == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: lorem-ipsum @@ -112,6 +117,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.rename_layers == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: rename-layers @@ -120,6 +126,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.table == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: table @@ -130,6 +137,7 @@ jobs: # needs: detect-changes # if: needs.detect-changes.outputs.another_plugin == 'true' # uses: ./.github/workflows/plugins-deploy-package.yml + # secrets: inherit # with: # gh_ref: "${{ inputs.gh_ref || github.ref_name }}" # plugin_name: another From 93f5e74bb0cff9dd9b049b5ea1395fe4ecc6b20b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 16:46:03 +0100 Subject: [PATCH 08/19] :wrench: Run all the jobs if the workflow is launched manually --- .github/workflows/plugins-deploy-packages.yml | 16 ++++++++-------- .../apps/colors-to-tokens-plugin/wrangler.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml index b7c9c3af47..3223bc52a6 100644 --- a/.github/workflows/plugins-deploy-packages.yml +++ b/.github/workflows/plugins-deploy-packages.yml @@ -70,7 +70,7 @@ jobs: colors-to-tokens-plugin: needs: detect-changes - if: needs.detect-changes.outputs.colors_to_tokens == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.colors_to_tokens == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -79,7 +79,7 @@ jobs: contrast-plugin: needs: detect-changes - if: needs.detect-changes.outputs.contrast == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.contrast == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -88,7 +88,7 @@ jobs: create-palette-plugin: needs: detect-changes - if: needs.detect-changes.outputs.create_palette == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.create_palette == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -97,7 +97,7 @@ jobs: icons-plugin: needs: detect-changes - if: needs.detect-changes.outputs.icons == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.icons == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -106,7 +106,7 @@ jobs: lorem-ipsum-plugin: needs: detect-changes - if: needs.detect-changes.outputs.lorem_ipsum == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.lorem_ipsum == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -115,7 +115,7 @@ jobs: rename-layers-plugin: needs: detect-changes - if: needs.detect-changes.outputs.rename_layers == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.rename_layers == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -124,7 +124,7 @@ jobs: table-plugin: needs: detect-changes - if: needs.detect-changes.outputs.table == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.table == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -135,7 +135,7 @@ jobs: # Add more jobs for other plugins below, following the same pattern # another-plugin: # needs: detect-changes - # if: needs.detect-changes.outputs.another_plugin == 'true' + # if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.another_plugin == 'true' # uses: ./.github/workflows/plugins-deploy-package.yml # secrets: inherit # with: diff --git a/plugins/apps/colors-to-tokens-plugin/wrangler.toml b/plugins/apps/colors-to-tokens-plugin/wrangler.toml index c1d45f3e87..7f48730a36 100644 --- a/plugins/apps/colors-to-tokens-plugin/wrangler.toml +++ b/plugins/apps/colors-to-tokens-plugin/wrangler.toml @@ -1,7 +1,7 @@ name = "color-to-tokens-plugin" compatibility_date = "2025-01-01" -assets = { directory = "../../dist/apps/color-to-tokens-plugin/browser" } +assets = { directory = "../../dist/apps/colors-to-tokens-plugin/browser" } [[routes]] pattern = "WORKER_URI" From ec61aa6b6d1d3560694753b43d9efc36a3f2ad90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 27 Jan 2026 20:27:30 +0100 Subject: [PATCH 09/19] :wrench: Add custom domain --- .github/workflows/plugins-deploy-api-doc.yml | 28 ++++++++++++++------ plugins/wrangler-penpot-plugins-api-doc.toml | 4 +++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.github/workflows/plugins-deploy-api-doc.yml b/.github/workflows/plugins-deploy-api-doc.yml index 62a87745bb..67f0542b48 100644 --- a/.github/workflows/plugins-deploy-api-doc.yml +++ b/.github/workflows/plugins-deploy-api-doc.yml @@ -7,11 +7,11 @@ on: - staging - main paths: - - "plugins/libs/plugin-types/index.d.ts" - - "plugins/libs/plugin-types/REAME.md" - - "plugins/tools/typedoc.css" - - "plugins/CHANGELOG.md" - - "plugins/wrangle-penpot-plugins-api-doc.toml" + - 'plugins/libs/plugin-types/index.d.ts' + - 'plugins/libs/plugin-types/REAME.md' + - 'plugins/tools/typedoc.css' + - 'plugins/CHANGELOG.md' + - 'plugins/wrangler-penpot-plugins-api-doc.toml' workflow_dispatch: inputs: gh_ref: @@ -86,12 +86,24 @@ jobs: run: | REF="${{ steps.vars.outputs.gh_ref }}" case "$REF" in - main) echo "WORKER_NAME=penpot-plugins-api-doc-pro" >> $GITHUB_ENV ;; - staging) echo "WORKER_NAME=penpot-plugins-api-doc-pre" >> $GITHUB_ENV ;; - develop) echo "WORKER_NAME=penpot-plugins-api-doc-hourly" >> $GITHUB_ENV ;; + main) + echo "WORKER_NAME=penpot-plugins-api-doc-pro" >> $GITHUB_ENV + echo "WORKER_URI=doc.plugins.penpot.app" >> $GITHUB_ENV ;; + staging) + echo "WORKER_NAME=penpot-plugins-api-doc-pre" >> $GITHUB_ENV + echo "WORKER_URI=doc.plugins.penpot.dev" >> $GITHUB_ENV ;; + develop) + echo "WORKER_NAME=penpot-plugins-api-doc-hourly" >> $GITHUB_ENV + echo "WORKER_URI=doc.plugins.hourly.penpot.dev" >> $GITHUB_ENV ;; *) echo "Unsupported branch ${REF}" && exit 1 ;; esac + - name: Set the custom url + working-directory: plugins + shell: bash + run: | + sed -i "s/WORKER_URI/${{ env.WORKER_URI }}/g" wrangler-penpot-plugins-api-doc.toml + - name: Deploy to Cloudflare Workers uses: cloudflare/wrangler-action@v3 with: diff --git a/plugins/wrangler-penpot-plugins-api-doc.toml b/plugins/wrangler-penpot-plugins-api-doc.toml index e9535be2d8..b09adf8b1a 100644 --- a/plugins/wrangler-penpot-plugins-api-doc.toml +++ b/plugins/wrangler-penpot-plugins-api-doc.toml @@ -2,3 +2,7 @@ name = "penpot-plugins-api-doc" compatibility_date = "2025-01-01" assets = { directory = "dist/doc" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true From 0f51b23ce73299d43cca3a9d94d8939a56e0060a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 27 Jan 2026 20:28:30 +0100 Subject: [PATCH 10/19] :wrench: Deploy plugin styles documentation --- .../workflows/plugins-deploy-styles-doc.yml | 123 ++++++++++++++++++ .../wrangler-penpot-plugins-styles-doc.toml | 8 ++ 2 files changed, 131 insertions(+) create mode 100644 .github/workflows/plugins-deploy-styles-doc.yml create mode 100644 plugins/wrangler-penpot-plugins-styles-doc.toml diff --git a/.github/workflows/plugins-deploy-styles-doc.yml b/.github/workflows/plugins-deploy-styles-doc.yml new file mode 100644 index 0000000000..7c759a62e6 --- /dev/null +++ b/.github/workflows/plugins-deploy-styles-doc.yml @@ -0,0 +1,123 @@ +name: Plugins/styles-doc deployer + +on: + push: + branches: + - develop + - staging + - main + paths: + - 'plugins/apps/example-styles/**' + - 'plugins/libs/plugins-styles/**' + - 'plugins/wrangler-penpot-plugins-styles-doc.toml' + workflow_dispatch: + inputs: + gh_ref: + description: 'Name of the branch' + type: choice + required: true + default: 'develop' + options: + - develop + - staging + - main + +permissions: + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Extract some useful variables + id: vars + run: | + echo "gh_ref=${{ inputs.gh_ref || github.ref_name }}" >> $GITHUB_OUTPUT + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ steps.vars.outputs.gh_ref }} + + # START: Setup Node and PNPM enabling cache + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Enable PNPM + working-directory: ./plugins + shell: bash + run: | + corepack enable; + corepack install; + + - name: Get pnpm store path + id: pnpm-store + working-directory: ./plugins + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT + + - name: Cache pnpm store + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-store.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-${{ hashFiles('plugins/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + # END: Setup Node and PNPM enabling cache + + - name: Install deps + working-directory: ./plugins + shell: bash + run: | + pnpm install --no-frozen-lockfile; + pnpm add -D -w wrangler@latest; + + - name: Build styles + working-directory: plugins + shell: bash + run: npx nx run example-styles:build + + - name: Select Worker name + run: | + REF="${{ steps.vars.outputs.gh_ref }}" + case "$REF" in + main) + echo "WORKER_NAME=penpot-plugins-styles-doc-pro" >> $GITHUB_ENV + echo "WORKER_URI=styles-doc.plugins.penpot.app" >> $GITHUB_ENV ;; + staging) + echo "WORKER_NAME=penpot-plugins-styles-doc-pre" >> $GITHUB_ENV + echo "WORKER_URI=styles-doc.plugins.penpot.dev" >> $GITHUB_ENV ;; + develop) + echo "WORKER_NAME=penpot-plugins-styles-doc-hourly" >> $GITHUB_ENV + echo "WORKER_URI=styles-doc.plugins.hourly.penpot.dev" >> $GITHUB_ENV ;; + *) echo "Unsupported branch ${REF}" && exit 1 ;; + esac + + - name: Set the custom url + working-directory: plugins + shell: bash + run: | + sed -i "s/WORKER_URI/${{ env.WORKER_URI }}/g" wrangler-penpot-plugins-api-doc.toml + + - name: Deploy to Cloudflare Workers + uses: cloudflare/wrangler-action@v3 + with: + workingDirectory: plugins + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: deploy --config wrangler-penpot-plugins-styles-doc.toml --name ${{ env.WORKER_NAME }} + + - name: Notify Mattermost + if: failure() + uses: mattermost/action-mattermost-notify@master + with: + MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} + MATTERMOST_CHANNEL: bot-alerts-cicd + TEXT: | + ❌ πŸ§©πŸ’… *[PENPOT PLUGINS] Error deploying Styles documentation.* + πŸ“„ Triggered from ref: `${{ inputs.gh_ref }}` + πŸ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + @infra diff --git a/plugins/wrangler-penpot-plugins-styles-doc.toml b/plugins/wrangler-penpot-plugins-styles-doc.toml new file mode 100644 index 0000000000..7aa86eb469 --- /dev/null +++ b/plugins/wrangler-penpot-plugins-styles-doc.toml @@ -0,0 +1,8 @@ +name = "penpot-plugins-style-doc" +compatibility_date = "2025-01-01" + +assets = { directory = "dist/apps/example-styles" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true From 693b52bf45b7000a1bb711d7620d8e034c5ffc3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 27 Jan 2026 14:13:42 +0100 Subject: [PATCH 11/19] :books: Fix links related to penpot plugins --- docs/plugins/api.md | 2 +- docs/plugins/beta-changelog.md | 4 ++-- docs/plugins/create-a-plugin.md | 4 ++-- docs/plugins/examples-templates.md | 2 +- docs/plugins/faq.md | 7 ++++--- docs/plugins/getting-started.md | 13 +++++++------ plugins/CONTRIBUTING.md | 2 +- plugins/docs/api-docs.md | 2 +- plugins/libs/plugins-styles/README.md | 2 +- 9 files changed, 20 insertions(+), 18 deletions(-) diff --git a/docs/plugins/api.md b/docs/plugins/api.md index 9abf6a9fa7..d1cd0bf4c3 100644 --- a/docs/plugins/api.md +++ b/docs/plugins/api.md @@ -6,4 +6,4 @@ desc: Create, deploy, and use the Penpot plugin API with our comprehensive docum # Penpot plugins API -We've got all the documentation you need for the API right here. +We've got all the documentation you need for the API right here. diff --git a/docs/plugins/beta-changelog.md b/docs/plugins/beta-changelog.md index 1f58235752..fb8a656f97 100644 --- a/docs/plugins/beta-changelog.md +++ b/docs/plugins/beta-changelog.md @@ -9,13 +9,13 @@ desc: See the Penpot plugin API changelog for version 1.0! Find breaking changes ### boom Epics and highlights - This marks the release of version 1.0, and from this point forward, we’ll do our best to avoid making any more breaking changes (or make deprecations backward compatible). - We’ve redone the documentation. You can check the API here: -[https://penpot-plugins-api-doc.pages.dev/](https://penpot-plugins-api-doc.pages.dev/) +[https://doc.plugins.penpot.app/](https://doc.plugins.penpot.app/) - New samples repository with lots of samples to use the API: [https://github.com/penpot/penpot-plugins-samples](https://github.com/penpot/penpot-plugins-samples) ### boom Breaking changes & Deprecations -- Changed types names to remove the Penpot prefix. So for example: PenpotShape becomes Shape; PenpotFile becomes File, and so on. Check the [API documentation](https://penpot-plugins-api-doc.pages.dev/) for more details. +- Changed types names to remove the Penpot prefix. So for example: PenpotShape becomes Shape; PenpotFile becomes File, and so on. Check the [API documentation](https://doc.plugins.penpot.app/) for more details. - Changes on the penpot.on and penpot.off methods. Previously you had to send the original callback to the off method in order to remove an event listener. Now, penpot.on will return an *id* that you can pass to the penpot.off method in order to remove the listener. diff --git a/docs/plugins/create-a-plugin.md b/docs/plugins/create-a-plugin.md index 80c4a08df6..42fc096dbe 100644 --- a/docs/plugins/create-a-plugin.md +++ b/docs/plugins/create-a-plugin.md @@ -49,7 +49,7 @@ There are two libraries that can help you with your plugin's development. They a ### Plugin styles -@penpot/plugin-styles contains styles to help build the UI for Penpot plugins. To check the styles go to Plugin styles. +@penpot/plugin-styles contains styles to help build the UI for Penpot plugins. To check the styles go to Plugin styles. ```bash npm install @penpot/plugin-styles @@ -139,7 +139,7 @@ parent.postMessage(responseMessage, targetOrigin); By using these message-based events, any data retrieved through the Penpot API can be communicated to and from your plugin interface seamlessly. -For more detailed information, refer to the [Penpot Plugins API Documentation](https://penpot-plugins-api-doc.pages.dev/). +For more detailed information, refer to the [Penpot Plugins API Documentation](https://doc.plugins.penpot.app/). ## 2.5. Step 5. Build the plugin file diff --git a/docs/plugins/examples-templates.md b/docs/plugins/examples-templates.md index 1836b132c2..d50e49e460 100644 --- a/docs/plugins/examples-templates.md +++ b/docs/plugins/examples-templates.md @@ -86,7 +86,7 @@ penpot.library.local.createTypography(); Penpot has dark and light modes, and you can easily add this to your plugin so your interface adapts to both themes. When you add theme support, your plugin will automatically sync with Penpot's interface settings, so the user experience is consistent no matter which mode is selected. This makes your plugin look better and also ensures it stays in line with Penpot's overall design. -Just a heads-up: if you use the plugin-styles library, many elements will automatically adapt to dark or light mode without any extra effort from you. However, if you need to customize specific elements, be sure to use the selectors provided in the styles.css of the example. +Just a heads-up: if you use the plugin-styles library, many elements will automatically adapt to dark or light mode without any extra effort from you. However, if you need to customize specific elements, be sure to use the selectors provided in the styles.css of the example. Theme example diff --git a/docs/plugins/faq.md b/docs/plugins/faq.md index 4050358597..0d761bde10 100644 --- a/docs/plugins/faq.md +++ b/docs/plugins/faq.md @@ -40,7 +40,7 @@ The plugin PenpotFlow or PenpotInteraction interfaces. +Absolutely! You can definitely create flows and interactions in the same elements as in the interface, like frames, shapes, and groups. Just check out the API documentation for the methods: createFlow, addInteraction, or removeInteraction. And if you need more help, you can always check out the Flow or Interaction interfaces. ### Are there any security or quality criteria I should be aware of? @@ -48,7 +48,8 @@ There are no set requirements. However, we can recommend the use of https:\/\/create-palette-penpot-plugin.pages.dev/assets/manifest.json or check the code here +No, it’s completely optional, in fact, we have an example of a plugin without UI. Try the plugin using this url to install it: https:\/\/create-palette.plugins.penpot.app/assets/manifest.json or check the code here + ### Can I create components? @@ -58,7 +59,7 @@ Yes, it is possible to create components using: createComponent(shapes: Shape[]): LibraryComponent; ``` -Take a look at the Penpot Library methods in the API documentation or this simple example. +Take a look at the Penpot Library methods in the API documentation or this simple example. ### Is there a place where I can share my plugin? diff --git a/docs/plugins/getting-started.md b/docs/plugins/getting-started.md index 9765e737b0..abfbc508b1 100644 --- a/docs/plugins/getting-started.md +++ b/docs/plugins/getting-started.md @@ -69,12 +69,13 @@ You need to provide the plugin's manifest URL for the installation. If there are | Name | URL | | ------------- | ------------------------------------------------------------------- | -| Lorem Ipsum | https://lorem-ipsum-penpot-plugin.pages.dev/assets/manifest.json | -| Contrast | https://contrast-penpot-plugin.pages.dev/assets/manifest.json | -| Feather icons | https://icons-penpot-plugin.pages.dev/assets/manifest.json | -| Tables | https://table-penpot-plugin.pages.dev/assets/manifest.json | -| Color palette | https://create-palette-penpot-plugin.pages.dev/assets/manifest.json | -| Rename layers | https://rename-layers-penpot-plugin.pages.dev/assets/manifest.json | +| Color palette | https://create-palette.plugins.penpot.app/assets/manifest.json | +| Contrast | https://contrast.plugins.penpot.app/assets/manifest.json | +| Feather icons | https://icons.plugins.penpot.app/assets/manifest.json | +| Lorem ipsum | https://lorem-ipsum.plugins.penpot.app/assets/manifest.json | +| Rename layers | https://rename-layers.plugins.penpot.app/assets/manifest.json | +| Tables | https://table.plugins.penpot.app/assets/manifest.json | + ## 1.4. Plugin's basics diff --git a/plugins/CONTRIBUTING.md b/plugins/CONTRIBUTING.md index e4440cf083..10b243cd19 100644 --- a/plugins/CONTRIBUTING.md +++ b/plugins/CONTRIBUTING.md @@ -7,7 +7,7 @@ different parts of the platform, please refer to `docs/` directory. ## Reporting Bugs -We are using [GitHub Issues](https://github.com/penpot/penpot-plugins/issues) +We are using [GitHub Issues](https://github.com/penpot/penpot/issues) for our public bugs. We keep a close eye on this and try to make it clear when we have an internal fix in progress. Before filing a new task, try to make sure your problem doesn't already exist. diff --git a/plugins/docs/api-docs.md b/plugins/docs/api-docs.md index a8cf00b157..dd38659fc9 100644 --- a/plugins/docs/api-docs.md +++ b/plugins/docs/api-docs.md @@ -19,7 +19,7 @@ the latest changes from the `main` branch. This will trigger the deployment at Cloudfare if the `libs/plugin-types/index.d.ts` or the `tools/typedoc.css` files have been updated. -Take a look at the [Penpot plugins API](https://penpot-plugins-api-doc.pages.dev/) to see what's new. +Take a look at the [Penpot plugins API](https://doc.plugins.penpot.app/) to see what's new. #### Styles diff --git a/plugins/libs/plugins-styles/README.md b/plugins/libs/plugins-styles/README.md index 6739a9c393..9291f21cfe 100644 --- a/plugins/libs/plugins-styles/README.md +++ b/plugins/libs/plugins-styles/README.md @@ -20,7 +20,7 @@ Import the CSS file into your project: For detailed examples and to see how to use the styles and components, visit the documentation at: -[Penpot Plugin Styles Documentation](https://penpot-plugins-styles.pages.dev) +[Penpot Plugin Styles Documentation](https://styles-doc.plugins.penpot.app) #### Icons From 77bbf30ae45a2edc7a931a1c437757d006b9d3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 27 Jan 2026 21:04:25 +0100 Subject: [PATCH 12/19] :wrench: Fix file name --- .github/workflows/plugins-deploy-styles-doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/plugins-deploy-styles-doc.yml b/.github/workflows/plugins-deploy-styles-doc.yml index 7c759a62e6..0ab376cb6e 100644 --- a/.github/workflows/plugins-deploy-styles-doc.yml +++ b/.github/workflows/plugins-deploy-styles-doc.yml @@ -100,7 +100,7 @@ jobs: working-directory: plugins shell: bash run: | - sed -i "s/WORKER_URI/${{ env.WORKER_URI }}/g" wrangler-penpot-plugins-api-doc.toml + sed -i "s/WORKER_URI/${{ env.WORKER_URI }}/g" wrangler-penpot-plugins-styles-doc.toml - name: Deploy to Cloudflare Workers uses: cloudflare/wrangler-action@v3 From 76bd31fe7d25a378ac3981ed6ff3c914b5791d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 28 Jan 2026 11:58:19 +0100 Subject: [PATCH 13/19] :wrench: Fix CORS error --- plugins/apps/colors-to-tokens-plugin/project.json | 1 + plugins/apps/colors-to-tokens-plugin/src/_headers | 4 ++++ plugins/apps/contrast-plugin/project.json | 1 + plugins/apps/contrast-plugin/src/_headers | 4 ++++ plugins/apps/create-palette-plugin/public/_headers | 4 ++++ plugins/apps/icons-plugin/project.json | 1 + plugins/apps/icons-plugin/src/_headers | 4 ++++ plugins/apps/lorem-ipsum-plugin/project.json | 1 + plugins/apps/lorem-ipsum-plugin/src/_headers | 4 ++++ plugins/apps/rename-layers-plugin/project.json | 1 + plugins/apps/rename-layers-plugin/src/_headers | 4 ++++ plugins/apps/table-plugin/project.json | 1 + plugins/apps/table-plugin/src/_headers | 4 ++++ 13 files changed, 34 insertions(+) create mode 100644 plugins/apps/colors-to-tokens-plugin/src/_headers create mode 100644 plugins/apps/contrast-plugin/src/_headers create mode 100644 plugins/apps/create-palette-plugin/public/_headers create mode 100644 plugins/apps/icons-plugin/src/_headers create mode 100644 plugins/apps/lorem-ipsum-plugin/src/_headers create mode 100644 plugins/apps/rename-layers-plugin/src/_headers create mode 100644 plugins/apps/table-plugin/src/_headers diff --git a/plugins/apps/colors-to-tokens-plugin/project.json b/plugins/apps/colors-to-tokens-plugin/project.json index 01ad02bbe6..87e3fb83d4 100644 --- a/plugins/apps/colors-to-tokens-plugin/project.json +++ b/plugins/apps/colors-to-tokens-plugin/project.json @@ -16,6 +16,7 @@ "polyfills": ["zone.js"], "tsConfig": "apps/colors-to-tokens-plugin/tsconfig.app.json", "assets": [ + "apps/colors-to-tokens-plugin/src/_headers", "apps/colors-to-tokens-plugin/src/favicon.ico", "apps/colors-to-tokens-plugin/src/assets" ], diff --git a/plugins/apps/colors-to-tokens-plugin/src/_headers b/plugins/apps/colors-to-tokens-plugin/src/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type diff --git a/plugins/apps/contrast-plugin/project.json b/plugins/apps/contrast-plugin/project.json index 6de0d44104..69f9c92766 100644 --- a/plugins/apps/contrast-plugin/project.json +++ b/plugins/apps/contrast-plugin/project.json @@ -16,6 +16,7 @@ "polyfills": ["zone.js"], "tsConfig": "apps/contrast-plugin/tsconfig.app.json", "assets": [ + "apps/contrast-plugin/src/_headers", "apps/contrast-plugin/src/favicon.ico", "apps/contrast-plugin/src/assets" ], diff --git a/plugins/apps/contrast-plugin/src/_headers b/plugins/apps/contrast-plugin/src/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/contrast-plugin/src/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type diff --git a/plugins/apps/create-palette-plugin/public/_headers b/plugins/apps/create-palette-plugin/public/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/create-palette-plugin/public/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type diff --git a/plugins/apps/icons-plugin/project.json b/plugins/apps/icons-plugin/project.json index 6540a148e1..90f01a50c2 100644 --- a/plugins/apps/icons-plugin/project.json +++ b/plugins/apps/icons-plugin/project.json @@ -16,6 +16,7 @@ "polyfills": ["zone.js"], "tsConfig": "apps/icons-plugin/tsconfig.app.json", "assets": [ + "apps/icons-plugin/src/_headers", "apps/icons-plugin/src/favicon.ico", "apps/icons-plugin/src/assets" ], diff --git a/plugins/apps/icons-plugin/src/_headers b/plugins/apps/icons-plugin/src/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/icons-plugin/src/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type diff --git a/plugins/apps/lorem-ipsum-plugin/project.json b/plugins/apps/lorem-ipsum-plugin/project.json index db66c3677b..1747fcf6e8 100644 --- a/plugins/apps/lorem-ipsum-plugin/project.json +++ b/plugins/apps/lorem-ipsum-plugin/project.json @@ -16,6 +16,7 @@ "polyfills": ["zone.js"], "tsConfig": "apps/lorem-ipsum-plugin/tsconfig.app.json", "assets": [ + "apps/lorem-ipsum-plugin/src/_headers", "apps/lorem-ipsum-plugin/src/favicon.ico", "apps/lorem-ipsum-plugin/src/assets" ], diff --git a/plugins/apps/lorem-ipsum-plugin/src/_headers b/plugins/apps/lorem-ipsum-plugin/src/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type diff --git a/plugins/apps/rename-layers-plugin/project.json b/plugins/apps/rename-layers-plugin/project.json index 9a4e67c5be..71c314986a 100644 --- a/plugins/apps/rename-layers-plugin/project.json +++ b/plugins/apps/rename-layers-plugin/project.json @@ -16,6 +16,7 @@ "polyfills": ["zone.js"], "tsConfig": "apps/rename-layers-plugin/tsconfig.app.json", "assets": [ + "apps/rename-layers-plugin/src/_headers", "apps/rename-layers-plugin/src/favicon.ico", "apps/rename-layers-plugin/src/assets" ], diff --git a/plugins/apps/rename-layers-plugin/src/_headers b/plugins/apps/rename-layers-plugin/src/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type diff --git a/plugins/apps/table-plugin/project.json b/plugins/apps/table-plugin/project.json index 9ac5758270..e3cc6fc45e 100644 --- a/plugins/apps/table-plugin/project.json +++ b/plugins/apps/table-plugin/project.json @@ -16,6 +16,7 @@ "polyfills": ["zone.js"], "tsConfig": "apps/table-plugin/tsconfig.app.json", "assets": [ + "apps/table-plugin/src/_headers", "apps/table-plugin/src/favicon.ico", "apps/table-plugin/src/assets" ], diff --git a/plugins/apps/table-plugin/src/_headers b/plugins/apps/table-plugin/src/_headers new file mode 100644 index 0000000000..cdb4e7ed20 --- /dev/null +++ b/plugins/apps/table-plugin/src/_headers @@ -0,0 +1,4 @@ +/* +Access-Control-Allow-Origin: * +Access-Control-Allow-Methods: GET, POST, OPTIONS +Access-Control-Allow-Headers: Content-Type From 84b3f5d7c6e89a3d8004ff2b5531723de4d5804b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 28 Jan 2026 14:13:20 +0100 Subject: [PATCH 14/19] :bug: Fix import of shadow tokens --- CHANGES.md | 1 + common/src/app/common/types/tokens_lib.cljc | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 23f906325c..8f4c0be159 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -38,6 +38,7 @@ - Fix incorrect handling of input values on layout gap and padding inputs [Github #8113](https://github.com/penpot/penpot/issues/8113) - Fix several race conditions on path editor [Github #8187](https://github.com/penpot/penpot/pull/8187) - Fix app freeze when introducing an error on a very long token name [Taiga #13214](https://tree.taiga.io/project/penpot/issue/13214) +- Fix import a file with shadow tokens [Taiga #13229](https://tree.taiga.io/project/penpot/issue/13229) ## 2.12.1 diff --git a/common/src/app/common/types/tokens_lib.cljc b/common/src/app/common/types/tokens_lib.cljc index 5e278588a7..248997a259 100644 --- a/common/src/app/common/types/tokens_lib.cljc +++ b/common/src/app/common/types/tokens_lib.cljc @@ -1462,11 +1462,12 @@ Will return a value that matches this schema: (def ^:private schema:dtcg-node [:schema {:registry {::simple-value - [:or :string :int :double] + [:or :string :int :double ::sm/boolean] ::value [:or [:ref ::simple-value] [:vector ::simple-value] + [:vector [:map-of :string ::simple-value]] [:map-of :string [:or [:ref ::simple-value] [:vector ::simple-value]]]]}} From 852b31c3a04ae5fd97efc3dfc32069ee62e73939 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 29 Jan 2026 10:40:32 +0100 Subject: [PATCH 15/19] :bug: Fix allow spaces on token description (#8234) --- CHANGES.md | 1 + frontend/src/app/main/ui/forms.cljs | 4 ++-- .../ui/workspace/tokens/management/forms/generic_form.cljs | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 8f4c0be159..b9bdeb4779 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,6 +39,7 @@ - Fix several race conditions on path editor [Github #8187](https://github.com/penpot/penpot/pull/8187) - Fix app freeze when introducing an error on a very long token name [Taiga #13214](https://tree.taiga.io/project/penpot/issue/13214) - Fix import a file with shadow tokens [Taiga #13229](https://tree.taiga.io/project/penpot/issue/13229) +- Fix allow spaces on token description [Taiga #13184](https://tree.taiga.io/project/penpot/issue/13184) ## 2.12.1 diff --git a/frontend/src/app/main/ui/forms.cljs b/frontend/src/app/main/ui/forms.cljs index 6e49615470..0fe34d1f25 100644 --- a/frontend/src/app/main/ui/forms.cljs +++ b/frontend/src/app/main/ui/forms.cljs @@ -16,7 +16,7 @@ (def context (mf/create-context nil)) (mf/defc form-input* - [{:keys [name] :rest props}] + [{:keys [name trim] :rest props}] (let [form (mf/use-ctx context) input-name name @@ -33,7 +33,7 @@ (mf/deps input-name) (fn [event] (let [value (-> event dom/get-target dom/get-input-value)] - (fm/on-input-change form input-name value true)))) + (fm/on-input-change form input-name value trim)))) props (mf/spread-props props {:on-change on-change diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/generic_form.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/generic_form.cljs index a260540a92..f0bc879442 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/generic_form.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/generic_form.cljs @@ -230,6 +230,7 @@ :placeholder (tr "workspace.tokens.enter-token-name" token-title) :max-length max-input-length :variant "comfortable" + :trim true :auto-focus true}] (when (and warning-name-change? (= action "edit")) From 9569fa2bcb49d67f5ef1bb6aae86f74427b16323 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 29 Jan 2026 10:41:52 +0100 Subject: [PATCH 16/19] :bug: Fix error when creating a token with an invalid name (#8216) --- CHANGES.md | 1 + common/src/app/common/types/token.cljc | 5 ++++- .../tokens/management/forms/controls/color_input.cljs | 10 +++++++--- .../management/forms/controls/fonts_combobox.cljs | 8 ++++++-- .../tokens/management/forms/controls/input.cljs | 9 +++++++-- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b9bdeb4779..ba5edaf58b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -40,6 +40,7 @@ - Fix app freeze when introducing an error on a very long token name [Taiga #13214](https://tree.taiga.io/project/penpot/issue/13214) - Fix import a file with shadow tokens [Taiga #13229](https://tree.taiga.io/project/penpot/issue/13229) - Fix allow spaces on token description [Taiga #13184](https://tree.taiga.io/project/penpot/issue/13184) +- Fix error when creating a token with an invalid name [Taiga #13219](https://tree.taiga.io/project/penpot/issue/13219) ## 2.12.1 diff --git a/common/src/app/common/types/token.cljc b/common/src/app/common/types/token.cljc index 6a9d830a3a..c8441dc352 100644 --- a/common/src/app/common/types/token.cljc +++ b/common/src/app/common/types/token.cljc @@ -97,9 +97,12 @@ (def token-types (into #{} (keys token-type->dtcg-token-type))) +(def token-name-validation-regex + #"^[a-zA-Z0-9_-][a-zA-Z0-9$_-]*(\.[a-zA-Z0-9$_-]+)*$") + (def token-name-ref [:re {:title "TokenNameRef" :gen/gen sg/text} - #"^[a-zA-Z0-9_-][a-zA-Z0-9$_-]*(\.[a-zA-Z0-9$_-]+)*$"]) + token-name-validation-regex]) (def ^:private schema:color [:map diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs index 9f9d395013..a1fecb0327 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/color_input.cljs @@ -11,6 +11,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.types.color :as cl] + [app.common.types.token :as cto] [app.common.types.tokens-lib :as ctob] [app.main.data.style-dictionary :as sd] [app.main.data.tinycolor :as tinycolor] @@ -51,12 +52,15 @@ ;; Both variants provide identical color-picker and text-input behavior, but ;; differ in how they persist the value within the form’s nested structure. - (defn- resolve-value [tokens prev-token token-name value] - (let [token + (let [valid-token-name? + (and (string? token-name) + (re-matches cto/token-name-validation-regex token-name)) + + token {:value value - :name (if (str/blank? token-name) + :name (if (or (not valid-token-name?) (str/blank? token-name)) "__PENPOT__TOKEN__NAME__PLACEHOLDER__" token-name)} diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs index 80f2d91133..df76d47113 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/fonts_combobox.cljs @@ -50,9 +50,13 @@ (defn- resolve-value [tokens prev-token token-name value] - (let [token + (let [valid-token-name? + (and (string? token-name) + (re-matches cto/token-name-validation-regex token-name)) + + token {:value (cto/split-font-family value) - :name (if (str/blank? token-name) + :name (if (or (not valid-token-name?) (str/blank? token-name)) "__PENPOT__TOKEN__NAME__PLACEHOLDER__" token-name)} diff --git a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs index 0f1b2a79b1..a5c4ddd0dc 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/forms/controls/input.cljs @@ -8,6 +8,7 @@ (:require [app.common.data :as d] [app.common.files.tokens :as cft] + [app.common.types.token :as cto] [app.common.types.tokens-lib :as ctob] [app.main.data.style-dictionary :as sd] [app.main.data.workspace.tokens.format :as dwtf] @@ -140,9 +141,13 @@ (defn- resolve-value [tokens prev-token token-name value] - (let [token + (let [valid-token-name? + (and (string? token-name) + (re-matches cto/token-name-validation-regex token-name)) + + token {:value value - :name (if (str/blank? token-name) + :name (if (or (not valid-token-name?) (str/blank? token-name)) "__PENPOT__TOKEN__NAME__PLACEHOLDER__" token-name)} tokens From 28509e04187bffad728a100f4d46d442f6684372 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 27 Jan 2026 17:44:17 +0100 Subject: [PATCH 17/19] :sparkles: Ensure .stopPropagation fn exists before calling Also for .stopImmediatePropagation and .preventDefault on the event instances. --- frontend/src/app/util/dom.cljs | 9 ++++++--- frontend/src/app/util/keyboard.cljs | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index e22de0dbba..ffa2b8f361 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -106,17 +106,20 @@ (defn stop-propagation [^js event] - (when event + (when (and (some? event) + (fn? (.-stopPropagation event))) (.stopPropagation event))) (defn stop-immediate-propagation [^js event] - (when event + (when (and (some? event) + (fn? (.-stopImmediatePropagation event))) (.stopImmediatePropagation event))) (defn prevent-default [^js event] - (when event + (when (and (some? event) + (fn? (.-preventDefault event))) (.preventDefault event))) (defn get-target diff --git a/frontend/src/app/util/keyboard.cljs b/frontend/src/app/util/keyboard.cljs index 5ed595a97c..8c43ecdef0 100644 --- a/frontend/src/app/util/keyboard.cljs +++ b/frontend/src/app/util/keyboard.cljs @@ -7,15 +7,16 @@ (ns app.util.keyboard (:require [app.config :as cfg] + [app.util.dom :as dom] [cuerdas.core :as str])) (defrecord KeyboardEvent [type key shift ctrl alt meta mod editing native-event] Object (preventDefault [_] - (.preventDefault native-event)) + (dom/prevent-default native-event)) (stopPropagation [_] - (.stopPropagation native-event))) + (dom/stop-propagation native-event))) (defn keyboard-event? [o] From 94722fdec2e981a1ff2ef57bc0e479e487746e6d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 27 Jan 2026 17:50:29 +0100 Subject: [PATCH 18/19] :sparkles: Ensure .hidePopover fn exist before call --- frontend/src/app/main/ui/ds/tooltip/tooltip.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/ds/tooltip/tooltip.cljs b/frontend/src/app/main/ui/ds/tooltip/tooltip.cljs index 5435ae0c77..159063210b 100644 --- a/frontend/src/app/main/ui/ds/tooltip/tooltip.cljs +++ b/frontend/src/app/main/ui/ds/tooltip/tooltip.cljs @@ -36,10 +36,12 @@ (defn- hide-popover [node] - (dom/unset-css-property! node "block-size") - (dom/unset-css-property! node "inset-block-start") - (dom/unset-css-property! node "inset-inline-start") - (.hidePopover ^js node)) + (when (and (some? node) + (fn? (.-hidePopover node))) + (dom/unset-css-property! node "block-size") + (dom/unset-css-property! node "inset-block-start") + (dom/unset-css-property! node "inset-inline-start") + (.hidePopover ^js node))) (defn- calculate-placement-bounding-rect "Given a placement, calcultates the bounding rect for it taking in From f65292a13ca18ca48416bc69f429883457ce00be Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 28 Jan 2026 12:44:49 +0100 Subject: [PATCH 19/19] :paperclip: Mark as skip two text editor v2 tests (flaky) --- frontend/playwright/ui/specs/text-editor-v2.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/playwright/ui/specs/text-editor-v2.spec.js b/frontend/playwright/ui/specs/text-editor-v2.spec.js index cc6061f192..9651c8e4b4 100644 --- a/frontend/playwright/ui/specs/text-editor-v2.spec.js +++ b/frontend/playwright/ui/specs/text-editor-v2.spec.js @@ -110,7 +110,7 @@ test("Update an already created text shape by prepending text", async ({ await workspace.textEditor.stopEditing(); }); -test("Update an already created text shape by inserting text in between", async ({ +test.skip("Update an already created text shape by inserting text in between", async ({ page, }) => { const workspace = new WorkspacePage(page, { @@ -151,7 +151,7 @@ test("Update a new text shape appending text by pasting text", async ({ await workspace.textEditor.stopEditing(); }); -test("Update a new text shape prepending text by pasting text", async ({ +test.skip("Update a new text shape prepending text by pasting text", async ({ page, context, }) => {