From 602bca62a225123947df7657ee752c3b081337d5 Mon Sep 17 00:00:00 2001 From: Alec Glassford Date: Tue, 9 Jun 2026 00:57:13 -0700 Subject: [PATCH 01/74] fix(docs): Remove `@next` from installation instructions for`@lucide/svelte` (#4432) Installing `@lucide/svelte@next` currently gets version 1.3.0, which is out of date compared to installing `@lucide/svelte` (aka `@lucide/svelte@latest`), which gets version 1.17.0. It seems to make more sense to instruct users to get the latest version. This change matches identical changes to the getting-started guides for other frameworks in 5f83bbf7e77ce5d91f2acbd146058e700d968930 - it seems like the omission of Svelte was likely an oversight (?) --- docs/guide/svelte/getting-started.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/guide/svelte/getting-started.md b/docs/guide/svelte/getting-started.md index ae81b037e..c32d41eeb 100644 --- a/docs/guide/svelte/getting-started.md +++ b/docs/guide/svelte/getting-started.md @@ -15,24 +15,22 @@ Make sure you have a Svelte environment set up. If you don't have one yet, you c ## Installation - - ::: code-group ```sh [pnpm] -pnpm install @lucide/svelte@next +pnpm install @lucide/svelte ``` ```sh [yarn] -yarn add @lucide/svelte@next +yarn add @lucide/svelte ``` ```sh [npm] -npm install @lucide/svelte@next +npm install @lucide/svelte ``` ```sh [bun] -bun add @lucide/svelte@next +bun add @lucide/svelte ``` ::: From a2ec77fc7fe8525c60eaa15a3c4a829ece9a6e8b Mon Sep 17 00:00:00 2001 From: Karsa Date: Thu, 11 Jun 2026 15:03:02 +0200 Subject: [PATCH 02/74] feat(packages/angular): remove upper limit for peer dependencies, as the risk of breakage is very little (#4450) --- packages/angular/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/angular/package.json b/packages/angular/package.json index 622181ed7..b353342fe 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -66,7 +66,7 @@ "typescript": "~5.9.2" }, "peerDependencies": { - "@angular/common": "17.x - 21.x", - "@angular/core": "17.x - 21.x" + "@angular/common": ">=17.0.0", + "@angular/core": ">=17.0.0" } } From 03ad294db0316b9c996501acc3b5923c429572e3 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 12 Jun 2026 14:27:59 +0200 Subject: [PATCH 03/74] fix(ci): add check to skip release if latest tag was created today (#4085) * fix(ci): add check to skip release if latest tag was created today * Apply dispatch gate to the ci workflow * Fix ci * Revert svg changes * Revert svg * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Format ci file --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .github/workflows/ci.yml | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e460ca55..0fe620531 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,8 +32,37 @@ concurrency: group: continuous-integration jobs: + check-dispatch-gate: + if: github.repository == 'lucide-icons/lucide' && + startsWith(github.event.head_commit.message, 'feat(icons)') && + github.event_name != 'workflow_dispatch' + runs-on: ubuntu-latest + outputs: + RELEASE_ENVIRONMENT: ${{ steps.environment.outputs.RELEASE_ENVIRONMENT }} + steps: + - uses: actions/checkout@v6 + + - name: Fetch tags + run: git fetch --all --tags + + - name: Check if latest tag was created today + id: environment + run: | + LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1) + TAG_DATE=$(git log -1 --format=%cs "$LATEST_TAG") + TODAY=$(date +%Y-%m-%d) + + if [ "$TAG_DATE" == "$TODAY" ]; then + echo "::warning::A release tag already exists for today ($TODAY): $LATEST_TAG. Manual approval will be required to proceed." + echo "RELEASE_ENVIRONMENT=Icon Release Gated" >> $GITHUB_OUTPUT + else + echo "RELEASE_ENVIRONMENT=Icon Release" >> $GITHUB_OUTPUT + fi + create-release: - if: github.repository == 'lucide-icons/lucide' && startsWith(github.event.head_commit.message, 'feat(icons)') && github.event_name != 'workflow_dispatch' + if: github.repository == 'lucide-icons/lucide' + needs: check-dispatch-gate + environment: ${{ needs.check-dispatch-gate.outputs.RELEASE_ENVIRONMENT }} runs-on: ubuntu-latest outputs: VERSION: ${{ steps.new-version.outputs.NEW_VERSION }} From f664af1933b575d7c77606d702dd26ffd2d33bdd Mon Sep 17 00:00:00 2001 From: Jordan Burnett <2143374+jordan-burnett@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:38:04 +0100 Subject: [PATCH 04/74] feat(icons): added `webcam-off` icon (#4242) * Added icons/webcam-off.svg * Added icons/webcam-off.json * Update webcam-off.svg Co-authored-by: Karsa * Update webcam-off.json * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Eric Fennis Co-authored-by: Karsa Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- icons/webcam-off.json | 22 ++++++++++++++++++++++ icons/webcam-off.svg | 19 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 icons/webcam-off.json create mode 100644 icons/webcam-off.svg diff --git a/icons/webcam-off.json b/icons/webcam-off.json new file mode 100644 index 000000000..05959fb69 --- /dev/null +++ b/icons/webcam-off.json @@ -0,0 +1,22 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "mittalyashu", + "ericfennis", + "karsa-mistmere", + "jordan-burnett" + ], + "use-cases": [ + "indicating that a webcam is disabled or turned off", + "showing a camera feed is unavailable or blocked for privacy" + ], + "tags": [ + "camera", + "security" + ], + "categories": [ + "connectivity", + "devices", + "communication" + ] +} diff --git a/icons/webcam-off.svg b/icons/webcam-off.svg new file mode 100644 index 000000000..a191d672d --- /dev/null +++ b/icons/webcam-off.svg @@ -0,0 +1,19 @@ + + + + + + + + + From 4b3521a3e34bd64ba3527447eb724112fc07090e Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 12 Jun 2026 16:09:47 +0200 Subject: [PATCH 05/74] chore(deps): upgrade pnpm to version 11.6.0 (#4458) * chore: upgrade pnpm to version 11.6.0 and restore package extensions and overrides in pnpm workspace * Remove packageExtensions * Update lockfile --- package.json | 20 +--- pnpm-lock.yaml | 221 +++++++++++++++++++++++++++++++++++--------- pnpm-workspace.yaml | 22 +++++ 3 files changed, 198 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 7bb11484b..7d6fe6450 100644 --- a/package.json +++ b/package.json @@ -81,23 +81,5 @@ "engines": { "node": ">=24.11.1" }, - "packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a", - "pnpm": { - "packageExtensions": { - "vue-template-compiler": { - "peerDependencies": { - "vue": "2.7.14" - } - } - }, - "overrides": { - "axios": "^1.12.0", - "cross-spawn": "7.0.5", - "fast-json-patch": "^3.1.1", - "form-data": "^4.0.4", - "semver": "^7.7.3", - "vite-prerender-plugin": "0.5.12", - "webpack-dev-middleware": "^5.3.4" - } - } + "packageManager": "pnpm@11.6.0+sha512.9a36518224080c6fe5165afdcfe79bfa118c29be703f3f462b1e32efe1e98e47e8750b148e08286250aad4113cc7993ca413c4e2cd447752708c2ee5751bc95f" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ae7209cf..e7a00b1a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,15 +5,13 @@ settings: excludeLinksFromLockfile: false overrides: - cross-spawn: 7.0.5 - form-data: ^4.0.4 - fast-json-patch: ^3.1.1 - webpack-dev-middleware: ^5.3.4 - semver: ^7.7.3 axios: ^1.12.0 + cross-spawn: 7.0.5 + fast-json-patch: ^3.1.1 + form-data: ^4.0.4 + semver: ^7.7.3 vite-prerender-plugin: 0.5.12 - -packageExtensionsChecksum: sha256-iadh7fHFnueQwqCQdCI9Kni0+s5mxkL9biStuN8E4yQ= + webpack-dev-middleware: ^5.3.4 importers: @@ -259,7 +257,7 @@ importers: version: 21.1.0(eslint@8.57.1)(typescript@5.9.3) '@angular/build': specifier: ^21.0.3 - version: 21.2.3(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(@angular/compiler@21.2.5)(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(@angular/platform-browser@21.2.5(@angular/common@21.2.5(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2)))(@types/node@24.10.1)(chokidar@5.0.0)(jiti@2.7.0)(less@4.2.0)(ng-packagr@21.2.1(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.8)(stylus@0.56.0)(terser@5.47.1)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.1.1)(yaml@2.8.0) + version: 21.2.3(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(@angular/compiler@21.2.5)(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(@angular/platform-browser@21.2.5(@angular/common@21.2.5(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2)))(@types/node@24.10.1)(chokidar@5.0.0)(jiti@2.7.0)(less@4.2.0)(ng-packagr@21.2.1(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.8)(stylus@0.56.0)(terser@5.47.1)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.0.12)(yaml@2.8.0) '@angular/cli': specifier: ^21.0.3 version: 21.2.3(@types/node@24.10.1)(chokidar@5.0.0) @@ -292,7 +290,7 @@ importers: version: link:../../tools/build-helpers '@vitest/browser-playwright': specifier: ^4.0.12 - version: 4.1.1(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.1.1) + version: 4.1.1(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.0.12) angular-eslint: specifier: 21.1.0 version: 21.1.0(@angular/cli@21.2.3(@types/node@24.10.1)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@8.57.1)(typescript-eslint@8.57.1(eslint@8.57.1)(typescript@5.9.3))(typescript@5.9.3) @@ -3274,89 +3272,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -3910,42 +3924,49 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-arm64-musl@1.1.1': resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@napi-rs/nice-linux-ppc64-gnu@1.1.1': resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-riscv64-gnu@1.1.1': resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-s390x-gnu@1.1.1': resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-x64-gnu@1.1.1': resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-x64-musl@1.1.1': resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@napi-rs/nice-openharmony-arm64@1.1.1': resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} @@ -4212,72 +4233,84 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-glibc@2.5.6': resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.6': resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} @@ -4468,24 +4501,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@resvg/resvg-js-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@resvg/resvg-js-linux-x64-gnu@2.4.1': resolution: {integrity: sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@resvg/resvg-js-linux-x64-musl@2.4.1': resolution: {integrity: sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@resvg/resvg-js-win32-arm64-msvc@2.4.1': resolution: {integrity: sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==} @@ -4544,24 +4581,28 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': resolution: {integrity: sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': resolution: {integrity: sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': resolution: {integrity: sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': resolution: {integrity: sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==} @@ -4793,196 +4834,235 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-gnueabihf@4.60.1': resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-gnueabihf@4.60.3': resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm-musleabihf@4.60.1': resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm-musleabihf@4.60.3': resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.60.1': resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.60.3': resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-musl@4.60.1': resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-musl@4.60.3': resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-gnu@4.60.1': resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-gnu@4.60.3': resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-musl@4.60.1': resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-musl@4.60.3': resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.60.1': resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.60.3': resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-musl@4.60.1': resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-musl@4.60.3': resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.60.1': resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.60.3': resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-musl@4.60.1': resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-musl@4.60.3': resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.60.1': resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.60.3': resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.1': resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.3': resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-linux-x64-musl@4.60.1': resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-linux-x64-musl@4.60.3': resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -5280,24 +5360,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.7.23': resolution: {integrity: sha512-JEdtwdthazKq4PBz53KSubwwK8MvqODAihGSAzc8u3Unq4ojcvaS8b0CwLBeD+kTQ78HpxOXTt3DsFIxpgaCAA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.7.23': resolution: {integrity: sha512-V51gFPWaVAHbI1yg9ahsoya3aB4uawye3SZ5uQWgcP7wdCdiv60dw4F5nuPJf5Z1oXD3U/BslXuamv8Oh9vXqQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.7.23': resolution: {integrity: sha512-BBqQi4+UdeRqag3yM4IJjaHG4yc1o3l9ksENHToE0o/u2DT0FY5+K/DiYGZLC1JHbSFzNqRCYsa7DIzRtZ0A1A==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.7.23': resolution: {integrity: sha512-JPk6pvCKncL6bXG7p+NLZf8PWx4FakVvKNdwGeMrYunb+yk1IZf7qf9LJk8+GDGF5QviDXPs8opZrTrfsW80fA==} @@ -5737,36 +5821,43 @@ packages: resolution: {integrity: sha512-cXiUMXZEgr0ZAa9af874VPME1q1Zalk9o5bsjMTZBfiV7Q/oQT7dX4VKCclEc95ympx8H3R8cYkbeySAIxvadQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.6.2': resolution: {integrity: sha512-9iwEHcepURA3c2GP74rEl7IdciGqzWzV5jSfjXtKyYfz7aAhTVZON3qdAt2r00uQYgLMf5ZDVsG/RvQbBOygbw==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.6.2': resolution: {integrity: sha512-/LptGF05l0Ihpc1Fx7kbs0d9NAWp05cKLqYefi8xYnxuaoO7lTbxWJ2B60HGiU7oqn0rLmJG0ZgbwyZlVsVuGw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.6.2': resolution: {integrity: sha512-9og1+kOtdDGTWFAiqXSGyRTjYlGnM2BhNuRXKLFnbDvWe57LzokI3USbX4c3condKaoag2m74DbJHtPg5ZBTYA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-s390x-gnu@1.6.2': resolution: {integrity: sha512-AZVlbIEg0+iNZ6ZJ0/OQtfCxZJZ3XUHdmOW5kWqTXeyONkO5Q9dYui37ui6a6cs/bsPsFDPiEkvmrVqNYhDX1w==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.6.2': resolution: {integrity: sha512-kaFVj+mt3t7Y1W1SUFq1A30UCPg24w5pbnPKQ6rvNCyiBB91SzC1jrC64zldagBHlIP+suURfEvNNpMDo2IaBg==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.6.2': resolution: {integrity: sha512-3rWsCizepV9mawiq5tjkA/5Z55m83L7KAK0QNIyiKd7hq71F7woCRkfr/LLsoRcM8E3ay1mWPYRCfFgMvC1i2A==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.6.2': resolution: {integrity: sha512-/KeqvjCDPqhgSovlrAvuiSiExUj93w1QwSCU3aKlJ+cl03lLa4Pn/HgiGlsx+2BwT2JXIDBY0gbKW2jIDdpczg==} @@ -12968,7 +13059,7 @@ snapshots: eslint: 8.57.1 typescript: 5.9.3 - '@angular/build@21.2.3(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(@angular/compiler@21.2.5)(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(@angular/platform-browser@21.2.5(@angular/common@21.2.5(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2)))(@types/node@24.10.1)(chokidar@5.0.0)(jiti@2.7.0)(less@4.2.0)(ng-packagr@21.2.1(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.8)(stylus@0.56.0)(terser@5.47.1)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.1.1)(yaml@2.8.0)': + '@angular/build@21.2.3(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(@angular/compiler@21.2.5)(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(@angular/platform-browser@21.2.5(@angular/common@21.2.5(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.5(@angular/compiler@21.2.5)(rxjs@7.8.2)))(@types/node@24.10.1)(chokidar@5.0.0)(jiti@2.7.0)(less@4.2.0)(ng-packagr@21.2.1(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.8)(stylus@0.56.0)(terser@5.47.1)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.0.12)(yaml@2.8.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.3(chokidar@5.0.0) @@ -13008,7 +13099,7 @@ snapshots: lmdb: 3.5.1 ng-packagr: 21.2.1(@angular/compiler-cli@21.2.5(@angular/compiler@21.2.5)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) postcss: 8.5.8 - vitest: 4.1.1(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12(vitest@4.0.12))(jsdom@27.4.0)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) + vitest: 4.0.12(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12)(jiti@2.7.0)(jsdom@27.4.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - chokidar @@ -18363,13 +18454,13 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.1.1(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.1.1)': + '@vitest/browser-playwright@4.1.1(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.0.12)': dependencies: - '@vitest/browser': 4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.1.1) + '@vitest/browser': 4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.0.12) '@vitest/mocker': 4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) playwright: 1.58.2 tinyrainbow: 3.0.3 - vitest: 4.1.1(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12(vitest@4.0.12))(jsdom@27.4.0)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) + vitest: 4.0.12(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12)(jiti@2.7.0)(jsdom@27.4.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0) transitivePeerDependencies: - bufferutil - msw @@ -18408,7 +18499,7 @@ snapshots: - vite optional: true - '@vitest/browser@4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.1.1)': + '@vitest/browser@4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.0.12)': dependencies: '@blazediff/core': 1.9.1 '@vitest/mocker': 4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) @@ -18417,7 +18508,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.1.1(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12(vitest@4.0.12))(jsdom@27.4.0)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) + vitest: 4.0.12(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12)(jiti@2.7.0)(jsdom@27.4.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0) ws: 8.20.1 transitivePeerDependencies: - bufferutil @@ -18478,6 +18569,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 + '@vitest/mocker@4.0.12(vite@7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 4.0.12 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0) + '@vitest/mocker@4.0.12(vite@7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.98.0)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 4.0.12 @@ -26334,6 +26433,24 @@ snapshots: terser: 5.47.1 yaml: 2.8.0 + vite@7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.9 + rollup: 4.60.1 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.10.1 + fsevents: 2.3.3 + jiti: 2.7.0 + less: 4.2.0 + sass: 1.97.3 + stylus: 0.56.0 + terser: 5.47.1 + yaml: 2.8.0 + vite@7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.98.0)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0): dependencies: esbuild: 0.27.3 @@ -26440,6 +26557,48 @@ snapshots: - typescript - universal-cookie + vitest@4.0.12(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12)(jiti@2.7.0)(jsdom@27.4.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0): + dependencies: + '@vitest/expect': 4.0.12 + '@vitest/mocker': 4.0.12(vite@7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.12 + '@vitest/runner': 4.0.12 + '@vitest/snapshot': 4.0.12 + '@vitest/spy': 4.0.12 + '@vitest/utils': 4.0.12 + debug: 4.4.3 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.10.1 + '@vitest/browser-playwright': 4.1.1(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.0.12) + '@vitest/ui': 4.0.12(vitest@4.0.12) + jsdom: 27.4.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@4.0.12(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/ui@4.0.12)(jiti@2.7.0)(jsdom@27.4.0)(less@4.2.0)(sass@1.98.0)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0): dependencies: '@vitest/expect': 4.0.12 @@ -26512,36 +26671,6 @@ snapshots: - msw optional: true - vitest@4.1.1(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12(vitest@4.0.12))(jsdom@27.4.0)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)): - dependencies: - '@vitest/expect': 4.1.1 - '@vitest/mocker': 4.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)) - '@vitest/pretty-format': 4.1.1 - '@vitest/runner': 4.1.1 - '@vitest/snapshot': 4.1.1 - '@vitest/spy': 4.1.1 - '@vitest/utils': 4.1.1 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.10.1 - '@vitest/browser-playwright': 4.1.1(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.97.3)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0))(vitest@4.1.1) - '@vitest/ui': 4.0.12(vitest@4.0.12) - jsdom: 27.4.0 - transitivePeerDependencies: - - msw - vitest@4.1.1(@types/node@24.10.1)(@vitest/browser-playwright@4.1.1)(@vitest/ui@4.0.12(vitest@4.0.12))(jsdom@27.4.0)(vite@7.3.2(@types/node@24.10.1)(jiti@2.7.0)(less@4.2.0)(sass@1.98.0)(stylus@0.56.0)(terser@5.47.1)(yaml@2.8.0)): dependencies: '@vitest/expect': 4.1.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 32430fce7..39fea4ddc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,25 @@ packages: - 'packages/*' - 'tools/*' - 'docs' + +overrides: + axios: ^1.12.0 + cross-spawn: 7.0.5 + fast-json-patch: ^3.1.1 + form-data: ^4.0.4 + semver: ^7.7.3 + vite-prerender-plugin: 0.5.12 + webpack-dev-middleware: ^5.3.4 + +allowBuilds: + '@parcel/watcher': false + '@swc/core': false + esbuild: false + lmdb: false + msgpackr-extract: false + nice-napi: false + sharp: false + svelte-preprocess: false + ttf2woff2: false + unrs-resolver: false + vue-demi: false From db63e663333056fca380fff4af353cc368b2e950 Mon Sep 17 00:00:00 2001 From: Rajnish Kumar Date: Sat, 13 Jun 2026 15:49:51 +0530 Subject: [PATCH 06/74] feat(icons): added `star-*` icons (#3918) * Added icons/star-check.svg * Added icons/star-check.json * Add star-x.svg icon * Add star-x icon JSON * Add star-minus.svg icon file * Add star-plus SVG icon * Add star-plus icon JSON configuration * Add 'remove' and 'deselect' to star-minus.json * Update star-check.svg with new path data * Modify star-x.svg paths for new design * Modify star-minus SVG paths for new design * Modify star-plus.svg paths for new design * Update star-x.svg * Username change * Username change * Update star-minus.json * Update and rename star-check.json to Username change * Username change * Modify star-plus.svg paths for new design * Refactor star-minus.svg paths for clarity * Update star-plus.svg paths for new design * Update SVG path for star-check icon * Adjust path element in star-minus.svg * Update star-minus.svg paths and adjust dimensions * Update icons/star-x.svg Co-authored-by: Karsa * Update icons/star-check.svg Co-authored-by: Karsa * Update star-check.svg * Merge pull request #1 Added use case * Fix JSON formatting in star-minus.json * Update star-plus.json * Fix JSON syntax in star-x.json --------- Co-authored-by: Rajnish Mehta <172272341+KnarliX@users.noreply.github.com> Co-authored-by: Karsa Co-authored-by: Eric Fennis --- icons/star-check.json | 38 +++++++++++++++++++++++++++++++++++ icons/star-check.svg | 14 +++++++++++++ icons/star-minus.json | 38 +++++++++++++++++++++++++++++++++++ icons/star-minus.svg | 14 +++++++++++++ icons/star-plus.json | 40 +++++++++++++++++++++++++++++++++++++ icons/star-plus.svg | 15 ++++++++++++++ icons/star-x.json | 46 +++++++++++++++++++++++++++++++++++++++++++ icons/star-x.svg | 15 ++++++++++++++ 8 files changed, 220 insertions(+) create mode 100644 icons/star-check.json create mode 100644 icons/star-check.svg create mode 100644 icons/star-minus.json create mode 100644 icons/star-minus.svg create mode 100644 icons/star-plus.json create mode 100644 icons/star-plus.svg create mode 100644 icons/star-x.json create mode 100644 icons/star-x.svg diff --git a/icons/star-check.json b/icons/star-check.json new file mode 100644 index 000000000..66b2053a1 --- /dev/null +++ b/icons/star-check.json @@ -0,0 +1,38 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "jguddas", + "RajnishKMehta" + ], + "use-cases": [ + "verified favorite", + "approved item", + "trusted content", + "featured content", + "recommended item", + "completed achievement", + "confirmed selection", + "verified bookmark", + "certified item", + "approved review" + ], + "tags": [ + "bookmark", + "favorite", + "like", + "review", + "rating", + "check", + "star" + ], + "categories": [ + "account", + "social", + "shapes", + "multimedia", + "weather", + "emoji", + "gaming" + ] +} diff --git a/icons/star-check.svg b/icons/star-check.svg new file mode 100644 index 000000000..990f4dc8f --- /dev/null +++ b/icons/star-check.svg @@ -0,0 +1,14 @@ + + + + diff --git a/icons/star-minus.json b/icons/star-minus.json new file mode 100644 index 000000000..f29b33243 --- /dev/null +++ b/icons/star-minus.json @@ -0,0 +1,38 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "jguddas", + "RajnishKMehta" + ], + "use-cases": [ + "remove from favorites", + "unstar item", + "remove bookmark", + "deselect favorite", + "remove featured item", + "lower priority item", + "remove recommendation", + "remove saved item" + ], + "tags": [ + "bookmark", + "favorite", + "like", + "review", + "rating", + "minus", + "remove", + "deselect", + "star" + ], + "categories": [ + "account", + "social", + "shapes", + "multimedia", + "weather", + "emoji", + "gaming" + ] +} diff --git a/icons/star-minus.svg b/icons/star-minus.svg new file mode 100644 index 000000000..667bf09d2 --- /dev/null +++ b/icons/star-minus.svg @@ -0,0 +1,14 @@ + + + + diff --git a/icons/star-plus.json b/icons/star-plus.json new file mode 100644 index 000000000..6eccc4566 --- /dev/null +++ b/icons/star-plus.json @@ -0,0 +1,40 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "jguddas", + "RajnishKMehta" + ], + "use-cases": [ + "add to favorites", + "star item", + "add bookmark", + "save item", + "mark as favorite", + "add featured item", + "add recommendation", + "follow preferred content", + "add to saved items", + "prioritize item" + ], + "tags": [ + "bookmark", + "favorite", + "like", + "review", + "rating", + "plus", + "add", + "join", + "star" + ], + "categories": [ + "account", + "social", + "shapes", + "multimedia", + "weather", + "emoji", + "gaming" + ] +} diff --git a/icons/star-plus.svg b/icons/star-plus.svg new file mode 100644 index 000000000..7d602a33f --- /dev/null +++ b/icons/star-plus.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/icons/star-x.json b/icons/star-x.json new file mode 100644 index 000000000..f578828b5 --- /dev/null +++ b/icons/star-x.json @@ -0,0 +1,46 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "jguddas", + "RajnishKMehta" + ], + "use-cases": [ + "remove from favorites", + "unstar item", + "reject favorite", + "exclude item", + "remove bookmark", + "disallow recommendation", + "remove featured status", + "dismiss saved item", + "block preferred content", + "clear favorite selection" + ], + "tags": [ + "mark", + "symbol", + "shape", + "vector", + "design", + "graphic", + "bookmark", + "favorite", + "like", + "review", + "rating", + "x", + "cancel", + "reject", + "star" + ], + "categories": [ + "account", + "social", + "shapes", + "multimedia", + "weather", + "emoji", + "gaming" + ] +} diff --git a/icons/star-x.svg b/icons/star-x.svg new file mode 100644 index 000000000..106562430 --- /dev/null +++ b/icons/star-x.svg @@ -0,0 +1,15 @@ + + + + + From 283e4b2805af617cc391e503ba2bba204002b271 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sat, 13 Jun 2026 12:28:04 +0200 Subject: [PATCH 07/74] chore(suggest-tags): Update metadata suggestion script (#4462) * feat(metadata): implement pull request metadata suggestions workflow and replace suggestTags script * Switch to GPT 5 * Update comment description * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- ... => pull-request-metadata-suggestions.yml} | 8 +- package.json | 4 +- scripts/suggestMetaData.mts | 309 ++++++++++++++++++ scripts/suggestTags.mts | 153 --------- 4 files changed, 315 insertions(+), 159 deletions(-) rename .github/workflows/{pull-request-tags-suggestions.yml => pull-request-metadata-suggestions.yml} (84%) create mode 100644 scripts/suggestMetaData.mts delete mode 100644 scripts/suggestTags.mts diff --git a/.github/workflows/pull-request-tags-suggestions.yml b/.github/workflows/pull-request-metadata-suggestions.yml similarity index 84% rename from .github/workflows/pull-request-tags-suggestions.yml rename to .github/workflows/pull-request-metadata-suggestions.yml index 141998cac..a6b2acfd2 100644 --- a/.github/workflows/pull-request-tags-suggestions.yml +++ b/.github/workflows/pull-request-metadata-suggestions.yml @@ -1,4 +1,4 @@ -name: Pull request tags suggestions +name: Pull request metadata suggestions on: pull_request_target: @@ -6,8 +6,8 @@ on: - 'icons/*.json' jobs: - pull-request-tags-suggestions: - name: Pull Request Tags Suggestions + pull-request-metadata-suggestions: + name: Pull Request Metadata Suggestions runs-on: ubuntu-latest permissions: contents: read @@ -29,7 +29,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Generate comment markup - run: node ./scripts/suggestTags.mts + run: node ./scripts/suggestMetaData.mts env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} PULL_REQUEST_NUMBER: ${{ github.event.number }} diff --git a/package.json b/package.json index 7d6fe6450..f7a2ba76a 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "generate:sponsors": "node scripts/updateSponsors.mts", "generate:contributors": "node ./scripts/updateContributors.mts icons/*.svg", "generate:nextJSAliases": "node ./scripts/generateNextJSAliases.mts", - "suggest:tags": "node ./scripts/suggestTags.mts", - "suggest:tags:watch": "node --env-file .env --watch ./scripts/suggestTags.mts ", + "suggest:metadata": "node ./scripts/suggestMetaData.mts", + "suggest:metadata:watch": "node --env-file .env --watch ./scripts/suggestMetaData.mts", "postinstall": "husky install", "lint:es": "eslint .", "lint:format": "prettier \"**/*.{js,mjs,ts,jsx,tsx,html,css,scss,json,yml,yaml}\" --check", diff --git a/scripts/suggestMetaData.mts b/scripts/suggestMetaData.mts new file mode 100644 index 000000000..fd1c4c9f4 --- /dev/null +++ b/scripts/suggestMetaData.mts @@ -0,0 +1,309 @@ +import 'dotenv/config' +import OpenAI from "openai"; +import { Octokit } from "@octokit/rest"; +import { zodTextFormat } from "openai/helpers/zod"; + +import path from "node:path"; +import fs from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import z from "zod"; + +// Resolve repo paths relative to this script so they work no matter which +// directory the script is invoked from (the workflow runs it from the repo root). +const scriptDir = path.dirname(fileURLToPath(import.meta.url)); +const repoRoot = path.join(scriptDir, ".."); +const iconsDir = path.join(repoRoot, "icons"); +const categoriesDir = path.join(repoRoot, "categories"); + +const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }); +const pullRequestNumber = Number(process.env.PULL_REQUEST_NUMBER); +const username = process.env.REVIEWER ?? 'github-actions[bot]'; +const commitSha = process.env.COMMIT_SHA ?? "HEAD"; +const useFileSystem = process.env.USE_FILE_SYSYEM === 'true' || false; + +const owner = 'lucide-icons'; +const repo = 'lucide'; + +const METADATA_FIELDS = ['tags', 'categories', 'use-cases'] as const; +type MetadataField = (typeof METADATA_FIELDS)[number]; + +// Load the allowed categories (name + human-readable title) straight from the +// `categories/` directory so we can both validate suggestions and give the +// model a description of every category. +async function loadCategories() { + const files = (await fs.readdir(categoriesDir)).filter((file) => file.endsWith('.json')); + + const categories = await Promise.all( + files.map(async (file) => { + const { title } = JSON.parse(await fs.readFile(path.join(categoriesDir, file), 'utf-8')); + return { name: path.basename(file, '.json'), title }; + }), + ); + + return categories.sort((a, b) => a.name.localeCompare(b.name)); +} + +// Sample a handful of well-populated icons to feed the model as few-shot +// examples so its suggestions match the repository's house style. Candidates +// are spread evenly across the (alphabetically sorted) icon set and read +// sequentially to keep the number of open file handles bounded. +async function loadReferenceExamples(count = 8) { + const fileNames = (await fs.readdir(iconsDir)).filter((file) => file.endsWith('.json')).sort(); + const candidateCount = Math.min(fileNames.length, count * 8); + const step = Math.max(1, Math.floor(fileNames.length / candidateCount)); + + const examples: Record[] = []; + for (let i = 0; i < fileNames.length && examples.length < count; i += step) { + try { + const metadata = JSON.parse(await fs.readFile(path.join(iconsDir, fileNames[i]), 'utf-8')); + const isWellPopulated = METADATA_FIELDS.every( + (field) => Array.isArray(metadata[field]) && metadata[field].length > 0, + ); + + if (isWellPopulated) { + examples.push({ + name: path.basename(fileNames[i], '.json'), + tags: metadata.tags, + categories: metadata.categories, + 'use-cases': metadata['use-cases'], + }); + } + } catch { + // Ignore files that fail to parse. + } + } + + return examples; +} + +const categories = await loadCategories(); +const categoryNames = categories.map((category) => category.name); +const referenceExamples = await loadReferenceExamples(); + +const metadataSchema = z.object({ + tags: z.array(z.string()), + categories: z.array(z.enum(categoryNames as [string, ...string[]])), + "use-cases": z.array(z.string()), +}) + +type MetadataSuggestion = z.infer; + +const { data: files } = await octokit.pulls.listFiles({ + owner, + repo, + pull_number: pullRequestNumber, +}); + +const { data: reviews } = await octokit.pulls.listReviews({ + owner, + repo, + pull_number: pullRequestNumber, + query: `in:body author:github-actions[bot]`, +}); + +// Get the PR description so the model can ground its suggestions in the +// author's stated intent for the icon. Truncated to keep the prompt small. +const { data: pullRequest } = await octokit.pulls.get({ + owner, + repo, + pull_number: pullRequestNumber, +}); + +const prDescription = (pullRequest.body || '').slice(0, 4000); + +const hasUserReviews = reviews.some(review => review.user?.login === username); + +// TODO: Find a better way to check if the PR has been updated since the last review +if(hasUserReviews) { + console.log(`Pull request #${pullRequestNumber} already has reviews from ${username}. Skipping...`); + process.exit(0); +} + +const changedFiles = files.filter( + ({filename}) => filename.startsWith('icons/') && filename.includes('.json') +) + +if (changedFiles.length === 0) { + console.log('No changed icons found'); + process.exit(0); +} + +const client = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, +}); + +const categoriesContext = categories.map(({ name, title }) => `- ${name}: ${title}`).join('\n'); + +// Render an array property exactly as it should appear in the metadata JSON, +// preserving the repo's 2-space indentation and the original trailing comma. +function buildArrayBlock(field: MetadataField, values: string[], trailingComma: string) { + const indent = ' '; + const itemIndent = ' '; + + if (values.length === 0) { + return `${indent}"${field}": []${trailingComma}`; + } + + const items = values.map((value) => `${itemIndent}${JSON.stringify(value)}`).join(',\n'); + return `${indent}"${field}": [\n${items}\n${indent}]${trailingComma}`; +} + +// Locate the line range of an array property in the raw file so we can anchor a +// GitHub suggestion to it. Handles both inline (`"use-cases": []`) and +// multi-line arrays, and reports whether the closing line has a trailing comma. +function findFieldBlock(lines: string[], field: MetadataField) { + const startIdx = lines.findIndex((line) => line.trimStart().startsWith(`"${field}":`)); + if (startIdx === -1) return null; + + let endIdx = startIdx; + if (!lines[startIdx].includes(']')) { + for (let i = startIdx + 1; i < lines.length; i++) { + endIdx = i; + if (lines[i].trimStart().startsWith(']')) break; + } + } + + const trailingComma = lines[endIdx].trim().endsWith(',') ? ',' : ''; + return { startLine: startIdx + 1, endLine: endIdx + 1, trailingComma }; +} + +const suggestionsByFile = changedFiles.map(async ({ filename, raw_url }) => { + const iconName = path.basename(filename, '.json'); + + // Read the icon's current metadata (the PR head version) first, so we can + // both give it to the model as context and dedupe suggestions against it. + let fileContent: string + if (useFileSystem) { + fileContent = await fs.readFile(path.join(repoRoot, filename), 'utf-8'); + } else { + const fileGithubRequest = await octokit.request(`GET ${raw_url}`, { + headers: { + 'Accept': 'application/vnd.github.v3.raw', + }, + }); + fileContent = fileGithubRequest.data + } + + const metadata = JSON.parse(fileContent) + + const currentMetadata = { + tags: metadata.tags ?? [], + categories: metadata.categories ?? [], + "use-cases": metadata["use-cases"] ?? [], + }; + + const input = `You are maintaining the metadata for the Lucide icon library. Suggest additional metadata for the \`${iconName}\` icon. + +Guidelines: +- tags: lowercase, single words, no spaces. Used for search. Never include the word "icon" or the icon's own name ("${iconName}"). +- categories: only use values from the allowed categories listed below. Lowercase. Keep them relevant to the icon. +- use-cases: short lowercase phrases describing concrete situations the icon represents (e.g. "indicating a disabled webcam"). No trailing punctuation. +Only suggest NEW values that build on the current metadata, and prefer quality over quantity. + +Allowed categories: +${categoriesContext} + +Current metadata for "${iconName}": +${JSON.stringify(currentMetadata, null, 2)} + +Pull request description: +${prDescription || '(no description provided)'} + +Reference examples from existing icons: +${JSON.stringify(referenceExamples, null, 2)}`; + + const response = await client.responses.create({ + model: "gpt-5-mini", + input, + text: { + format: zodTextFormat(metadataSchema, "metadata"), + }, + }); + + const suggested: MetadataSuggestion = JSON.parse(response.output_text); + + console.log(`Suggestions for ${iconName}:`, suggested); + console.log(`Current metadata for ${iconName}:`, currentMetadata); + + const lines = fileContent.split('\n'); + const chatGptQuery = `Suggest tags, categories and use-cases for a "${iconName}" icon in the Lucide icon library.`; + + // Build one inline GitHub suggestion per field, deduped against the values + // already present in the file. + const comments = METADATA_FIELDS.flatMap((field) => { + const current: string[] = currentMetadata[field]; + const newValues = suggested[field].filter((value) => !current.includes(value) && value !== iconName); + + if (newValues.length === 0) { + console.log(`No new ${field} to suggest for ${iconName}. Skipping...`); + return []; + } + + const block = findFieldBlock(lines, field); + if (!block) { + console.log(`Could not locate "${field}" in ${filename}. Skipping...`); + return []; + } + + const suggestion = buildArrayBlock(field, [...current, ...newValues], block.trailingComma); + + const body = `Suggested \`${field}\` for the \`${iconName}\` icon. +\`\`\`suggestion +${suggestion} +\`\`\` +Want more ideas? [Ask ChatGPT](https://chatgpt.com/?q=${encodeURIComponent(chatGptQuery)})`; + + const comment: Record = { + path: filename, + line: block.endLine, + side: "RIGHT", + body, + }; + + // Multi-line arrays need a start anchor; inline arrays are single-line. + if (block.endLine !== block.startLine) { + comment.start_line = block.startLine; + comment.start_side = "RIGHT"; + } + + return [comment]; + }); + + return comments; +}) + +const comments = (await Promise.all(suggestionsByFile)).flat() + +if (comments.length === 0) { + console.log('No new metadata to suggest for any icons.'); + process.exit(0); +} + +const reviewBody = `### 🤖 Metadata suggestions ✨ +I've asked ChatGPT for some suggestions for \`tags\`, \`categories\` and \`use-cases\`. +Please review them and apply any that you find useful. +`; + +try { + console.log({ + owner, + repo, + pull_number: pullRequestNumber, + body: reviewBody, + event: "COMMENT", + comments, + commit_id: commitSha, + }) + await octokit.pulls.createReview({ + owner, + repo, + pull_number: pullRequestNumber, + body: reviewBody, + event: "COMMENT", + comments, + commit_id: commitSha, + }); +} catch (error) { + console.error('Error creating review:', error); + process.exit(0); +} diff --git a/scripts/suggestTags.mts b/scripts/suggestTags.mts deleted file mode 100644 index c810ec93e..000000000 --- a/scripts/suggestTags.mts +++ /dev/null @@ -1,153 +0,0 @@ -import 'dotenv/config' -import OpenAI from "openai"; -import { Octokit } from "@octokit/rest"; -import { zodTextFormat } from "openai/helpers/zod"; - -import path from "node:path"; -import fs from "node:fs/promises"; -import z from "zod"; -import { type IconMetadata } from '../tools/build-icons/types.ts'; - -const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }); -const pullRequestNumber = Number(process.env.PULL_REQUEST_NUMBER); -const username = process.env.REVIEWER ?? 'github-actions[bot]'; -const commitSha = process.env.COMMIT_SHA ?? "HEAD"; -const useFileSystem = process.env.USE_FILE_SYSYEM === 'true' || false; - -const owner = 'lucide-icons'; -const repo = 'lucide'; - -const tagsSchema = z.object({ - tags: z.array(z.string()), -}) - -const { data: files } = await octokit.pulls.listFiles({ - owner, - repo, - pull_number: pullRequestNumber, -}); - -const { data: reviews } = await octokit.pulls.listReviews({ - owner, - repo, - pull_number: pullRequestNumber, - query: `in:body author:github-actions[bot]`, -}); - -const hasUserReviews = reviews.some(review => review.user?.login === username); - -// TODO: Find a better way to check if the PR has been updated since the last review -if(hasUserReviews) { - console.log(`Pull request #${pullRequestNumber} already has reviews from ${username}. Skipping...`); - process.exit(0); -} - -const changedFiles = files.filter( - ({filename}) => filename.startsWith('icons/') && filename.includes('.json') -) - -if (changedFiles.length === 0) { - console.log('No changed icons found'); - process.exit(0); -} - -const client = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY, -}); - -const suggestionsByFile = changedFiles.map(async ({ filename, raw_url }) => { - const filePath = filename.replace('.json', ''); - const iconName = filePath.split('/').pop(); - - const input = `Create a list of tags for a \`${iconName}\` icon. Don't include words like: 'icon' and preferably use single words.`; - - const response = await client.responses.create({ - model: "gpt-4.1-nano", - input, - text: { - format: zodTextFormat(tagsSchema, "tags"), - }, - }); - - const { tags: suggestedTags }: IconMetadata = JSON.parse(response.output_text); - - console.log(`Suggesting tags for ${iconName}:`, suggestedTags); - - let fileContent: string - - if( useFileSystem ) { - const jsonFile = path.join(process.cwd(), filename); - fileContent = await fs.readFile(jsonFile, 'utf-8') as unknown as string; - } else { - const fileGithubRequest = await octokit.request(`GET ${raw_url}`, { - headers: { - 'Accept': 'application/vnd.github.v3.raw', - }, - }); - fileContent = fileGithubRequest.data - } - - const metadata = JSON.parse(fileContent) - - console.log(`Current tags for ${iconName}:`, metadata.tags || []); - - const tagSuggestionsWithoutDuplicates = suggestedTags.filter((tag) => { - return !metadata.tags?.includes(tag) && tag !== iconName; - }); - - console.log(`Tag suggestions for ${iconName} without duplicates:`, tagSuggestionsWithoutDuplicates); - - if (tagSuggestionsWithoutDuplicates.length === 0) { - console.log(`No new tags to suggest for ${iconName}. Skipping...`); - return Promise.resolve(null); - } - // Find the startLine in the json file - const startLine = fileContent.split('\n').findIndex((line) => line.includes('"tags":')) + 1; - - const codeSuggestion = tagSuggestionsWithoutDuplicates.map((tag) => ` "${tag}"`).join(',\n'); - - const message = `Suggestions for the \`${iconName}\` icon. - Try asking it your self if you want more suggestions. [Open ChatGPT](https://chatgpt.com/?q=${encodeURIComponent(input)}) -Here are the suggestions: -\`\`\`suggestion\n "tags": [\n${codeSuggestion},`; - - return { - path: filename, - line: startLine, - body: message, - side: "RIGHT" - } -}) - -const comments = (await Promise.all(suggestionsByFile)).filter(comment => comment !== null) - -if (comments.length === 0) { - console.log('No new tags to suggest for any icons.'); - process.exit(0); -} - -try { - console.log({ - owner, - repo, - pull_number: pullRequestNumber, - body: `### 🤖 ChatGPT Tags suggestions ✨ - I've asked ChatGPT for some suggestions for tags.`, - event: "COMMENT", - comments, - commit_id: commitSha, - }) - await octokit.pulls.createReview({ - owner, - repo, - pull_number: pullRequestNumber, - body: `### 🤖 ChatGPT Tags suggestions ✨ - I've asked ChatGPT for some suggestions for tags.`, - event: "COMMENT", - comments, - commit_id: commitSha, - }); -} catch (error) { - console.error('Error creating review:', error); - process.exit(0); -} From 2e58e319e73c3fcaff1c0488d538ca0d939cf104 Mon Sep 17 00:00:00 2001 From: Yannik <80621863+vaporvee@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:33:48 +0200 Subject: [PATCH 08/74] feat(icons): added `save-pen` icon (#4179) * Added icons/save-pen.svg * Added icons/save-pen.json * Updated icons/save-pen.svg * Apply design from karsa * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Eric Fennis Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- icons/save-pen.json | 23 +++++++++++++++++++++++ icons/save-pen.svg | 16 ++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 icons/save-pen.json create mode 100644 icons/save-pen.svg diff --git a/icons/save-pen.json b/icons/save-pen.json new file mode 100644 index 000000000..4780f6664 --- /dev/null +++ b/icons/save-pen.json @@ -0,0 +1,23 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "csandman", + "ericfennis", + "karsa-mistmere", + "vaporvee" + ], + "use-cases": [ + "saving a file with a specific name and/or to a specific location", + "exporting or saving a copy of the current document with a different name or format" + ], + "tags": [ + "floppy disk", + "directory", + "rename" + ], + "categories": [ + "text", + "files" + ] +} diff --git a/icons/save-pen.svg b/icons/save-pen.svg new file mode 100644 index 000000000..08d1b114c --- /dev/null +++ b/icons/save-pen.svg @@ -0,0 +1,16 @@ + + + + + + From 76175250cd09860da27d9761d7673c6015e47b25 Mon Sep 17 00:00:00 2001 From: nilsjonsson <43206311+nilsjonsson@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:38:38 +0200 Subject: [PATCH 09/74] feat(icons): added `wrench-off` icon (#4434) * Added icons/wrench-off.svg * Added icons/wrench-off.json * Update icons/wrench-off.svg Co-authored-by: Karsa * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Add new tags to wrench-off.json --------- Co-authored-by: Karsa Co-authored-by: Eric Fennis Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- icons/wrench-off.json | 32 ++++++++++++++++++++++++++++++++ icons/wrench-off.svg | 15 +++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 icons/wrench-off.json create mode 100644 icons/wrench-off.svg diff --git a/icons/wrench-off.json b/icons/wrench-off.json new file mode 100644 index 000000000..97a12b703 --- /dev/null +++ b/icons/wrench-off.json @@ -0,0 +1,32 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "Andreto", + "ericfennis", + "csandman", + "karsa-mistmere", + "nilsjonsson" + ], + "use-cases": [ + "Indicates that a service or maintenance mode is disabled", + "Used on a button or toggle to turn service/maintenance mode off" + ], + "tags": [ + "account", + "settings", + "spanner", + "diy", + "toolbox", + "build", + "construction", + "off", + "service", + "maintenance", + "disabled" + ], + "categories": [ + "account", + "development", + "tools" + ] +} diff --git a/icons/wrench-off.svg b/icons/wrench-off.svg new file mode 100644 index 000000000..d6898d279 --- /dev/null +++ b/icons/wrench-off.svg @@ -0,0 +1,15 @@ + + + + + From 4e161a15ef79765fd6a4b404bbfce52e4fc3214a Mon Sep 17 00:00:00 2001 From: Jamie Law Date: Sat, 13 Jun 2026 11:41:38 +0100 Subject: [PATCH 10/74] feat(icons): added `ad` icon (#4323) * Added icons/ad.svg * Added icons/ad.json * Add use-cases to meta json file Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Eric Fennis Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- icons/ad.json | 30 ++++++++++++++++++++++++++++++ icons/ad.svg | 16 ++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 icons/ad.json create mode 100644 icons/ad.svg diff --git a/icons/ad.json b/icons/ad.json new file mode 100644 index 000000000..33001d878 --- /dev/null +++ b/icons/ad.json @@ -0,0 +1,30 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "ahtohbi4", + "jamiemlaw", + "karsa-mistmere", + "jguddas" + ], + "use-cases": [ + "marking content as sponsored", + "linking to an advertise with us page" + ], + "tags": [ + "advert", + "affiliate", + "brand", + "campaign", + "commercial", + "marketing", + "monetize", + "paid", + "partner", + "promo", + "sponsor" + ], + "categories": [ + "multimedia", + "notifications" + ] +} diff --git a/icons/ad.svg b/icons/ad.svg new file mode 100644 index 000000000..6b56aa9c0 --- /dev/null +++ b/icons/ad.svg @@ -0,0 +1,16 @@ + + + + + + From 4afccc1842004a32baa71731979d629b70f5be43 Mon Sep 17 00:00:00 2001 From: Karsa Date: Sat, 13 Jun 2026 14:04:20 +0200 Subject: [PATCH 11/74] feat(icons): added `eye-dashed` icon (#4415) * Added icons/eye-dashed.svg * Added icons/eye-dashed.json * Update icons/eye-dashed.json Co-authored-by: Eric Fennis * Improve writing of use-cases --------- Co-authored-by: Eric Fennis --- icons/eye-dashed.json | 34 ++++++++++++++++++++++++++++++++++ icons/eye-dashed.svg | 21 +++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 icons/eye-dashed.json create mode 100644 icons/eye-dashed.svg diff --git a/icons/eye-dashed.json b/icons/eye-dashed.json new file mode 100644 index 000000000..ed0d12e37 --- /dev/null +++ b/icons/eye-dashed.json @@ -0,0 +1,34 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "karsa-mistmere", + "ericfennis" + ], + "use-cases": [ + "Indicating that privacy mode is activated", + "Showing that notifications are muted or do-not-disturb is on", + "Marking hidden content that can be revealed on interaction", + "Denoting an inactive or away user status", + "Representing a stealth mode running discreetly in the background", + "Offering an accessibility option for visual impairments" + ], + "tags": [ + "view", + "watch", + "see", + "hide", + "conceal", + "mask", + "hidden", + "invisible", + "visibility", + "vision" + ], + "categories": [ + "accessibility", + "photography", + "design", + "security" + ] +} diff --git a/icons/eye-dashed.svg b/icons/eye-dashed.svg new file mode 100644 index 000000000..154ca8fd7 --- /dev/null +++ b/icons/eye-dashed.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + From d1150cea7a61278378ec370a758dcb92f4af2956 Mon Sep 17 00:00:00 2001 From: jwlinqx Date: Sat, 13 Jun 2026 07:04:52 -0500 Subject: [PATCH 12/74] feat(icons): added `save-plus` icon (#4448) * add json for icons * Added icons/save-plus.svg * Added icons/save-plus.json * Add additional tags to save-plus.json * Removed out of scope changes * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Eric Fennis Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- icons/save-plus.json | 25 +++++++++++++++++++++++++ icons/save-plus.svg | 17 +++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 icons/save-plus.json create mode 100644 icons/save-plus.svg diff --git a/icons/save-plus.json b/icons/save-plus.json new file mode 100644 index 000000000..72ee898a3 --- /dev/null +++ b/icons/save-plus.json @@ -0,0 +1,25 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "colebemis", + "csandman", + "ericfennis", + "jwlinqx" + ], + "use-cases": [ + "saving a new copy of a file or document", + "creating a new item by saving the current work" + ], + "tags": [ + "floppy disk", + "save", + "plus", + "add", + "update", + "create" + ], + "categories": [ + "text", + "files" + ] +} diff --git a/icons/save-plus.svg b/icons/save-plus.svg new file mode 100644 index 000000000..b1d118dea --- /dev/null +++ b/icons/save-plus.svg @@ -0,0 +1,17 @@ + + + + + + + From f4fa0512d39a50686a91fc8417a59b6a8af7c88b Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sat, 13 Jun 2026 14:05:31 +0200 Subject: [PATCH 13/74] feat(icons): added `list-sort-descending` icon (#4457) * Added icons/list-sort.svg * Added icons/list-sort.json * Update list-sort.json * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Update naming * Also add the ascending version * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- icons/list-sort-ascending.json | 32 ++++++++++++++++++++++++++++++++ icons/list-sort-ascending.svg | 15 +++++++++++++++ icons/list-sort-descending.json | 32 ++++++++++++++++++++++++++++++++ icons/list-sort-descending.svg | 15 +++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 icons/list-sort-ascending.json create mode 100644 icons/list-sort-ascending.svg create mode 100644 icons/list-sort-descending.json create mode 100644 icons/list-sort-descending.svg diff --git a/icons/list-sort-ascending.json b/icons/list-sort-ascending.json new file mode 100644 index 000000000..7f3215653 --- /dev/null +++ b/icons/list-sort-ascending.json @@ -0,0 +1,32 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "ericfennis" + ], + "use-cases": [ + "sorting items in a table by column (name, date, price, status)", + "reordering a list in ascending order" + ], + "tags": [ + "list", + "order", + "arrangement", + "organization", + "sequence", + "ranking", + "categories", + "presentation", + "filter", + "sort", + "ascending", + "descending", + "increasing", + "decreasing", + "rising", + "falling" + ], + "categories": [ + "text", + "layout" + ] +} diff --git a/icons/list-sort-ascending.svg b/icons/list-sort-ascending.svg new file mode 100644 index 000000000..f724750a7 --- /dev/null +++ b/icons/list-sort-ascending.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/icons/list-sort-descending.json b/icons/list-sort-descending.json new file mode 100644 index 000000000..30bf5bc6e --- /dev/null +++ b/icons/list-sort-descending.json @@ -0,0 +1,32 @@ +{ + "$schema": "../icon.schema.json", + "contributors": [ + "ericfennis" + ], + "use-cases": [ + "sorting items in a table by column (name, date, price, status)", + "reordering a list in descending order" + ], + "tags": [ + "list", + "order", + "arrangement", + "organization", + "sequence", + "ranking", + "categories", + "presentation", + "filter", + "sort", + "ascending", + "descending", + "increasing", + "decreasing", + "rising", + "falling" + ], + "categories": [ + "text", + "layout" + ] +} diff --git a/icons/list-sort-descending.svg b/icons/list-sort-descending.svg new file mode 100644 index 000000000..f0431db07 --- /dev/null +++ b/icons/list-sort-descending.svg @@ -0,0 +1,15 @@ + + + + + From 2dd4be802ad9ca7027a4853b5c958065cafaa52e Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sat, 13 Jun 2026 14:51:48 +0200 Subject: [PATCH 14/74] Fix provider exports (#4463) --- packages/lucide-react-native/rollup.config.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/lucide-react-native/rollup.config.mjs b/packages/lucide-react-native/rollup.config.mjs index cc692ecab..60d319cd0 100644 --- a/packages/lucide-react-native/rollup.config.mjs +++ b/packages/lucide-react-native/rollup.config.mjs @@ -33,7 +33,6 @@ const configs = bundles ...(preserveModules ? { dir: `${outputDir}/${format}`, - exports: 'auto', entryFileNames: `[name].${extension}`, } : { From ae94b5118b678704b796a75f184056da79b9bb6e Mon Sep 17 00:00:00 2001 From: "Vyctor H. Brzezowski" Date: Sat, 13 Jun 2026 10:04:57 -0300 Subject: [PATCH 15/74] fix(site): reserve space for icon detail drawer (#4344) --- .../theme/components/icons/IconsCategoryOverview.vue | 5 +++-- docs/.vitepress/theme/components/icons/IconsOverview.vue | 3 ++- docs/.vitepress/theme/style.css | 4 ++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue b/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue index 8a7d682ce..a2798e497 100644 --- a/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue +++ b/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue @@ -156,11 +156,11 @@ function handleCloseDrawer() { if (searchQueryDebounced.value) { url.searchParams.set('search', searchQueryDebounced.value); } - + if (selectedCategory.value) { url.hash = selectedCategory.value; } - + window.history.pushState({}, '', url); } @@ -169,6 +169,7 @@ function handleCloseDrawer() {
@@ -133,6 +133,7 @@ function handleCloseDrawer() {
Date: Sat, 13 Jun 2026 15:23:19 +0200 Subject: [PATCH 16/74] fix(icons): changed `wallet-cards` icon (#3888) * Updated icons/wallet-cards.svg * Updated icons/wallet-cards.json * Update icons/wallet-cards.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Updated icons/wallet-cards.svg * Updated icons/wallet-cards.json --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Eric Fennis --- icons/wallet-cards.json | 11 ++++++++++- icons/wallet-cards.svg | 6 +++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/icons/wallet-cards.json b/icons/wallet-cards.json index 8b3f2acb6..96d008250 100644 --- a/icons/wallet-cards.json +++ b/icons/wallet-cards.json @@ -1,10 +1,19 @@ { "$schema": "../icon.schema.json", "contributors": [ - "danielbayley" + "danielbayley", + "jguddas", + "tallneil", + "karsa-mistmere" ], "use-cases": [], "tags": [ + "wallet", + "cards", + "banking", + "cash", + "debit", + "transport", "money", "finance", "pocket", diff --git a/icons/wallet-cards.svg b/icons/wallet-cards.svg index 435cfa7c8..5cc2f0005 100644 --- a/icons/wallet-cards.svg +++ b/icons/wallet-cards.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - - - + + + From 24dd855b871c9e21e631d5cf76c4206ac454d0d8 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sat, 13 Jun 2026 15:25:41 +0200 Subject: [PATCH 17/74] feat(site): Improve search and add sorting options (#4453) * setup icon popularity call * Adjust sort button * Adjust sorting * Adds aliases * Format code * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Add check for env variable * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Improve styling on mobile * Remove hardcoded sort icon * Fix build * Format code --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .gitignore | 1 + docs/.vitepress/config.ts | 2 +- .../theme/components/base/Select.vue | 23 +++-- .../theme/components/base/SelectIcon.vue | 29 +++--- .../components/guide/FrameworkSelect.vue | 44 ++++----- .../theme/components/icons/IconInfo.vue | 2 +- .../theme/components/icons/IconsOverview.vue | 57 ++++++++++- .../theme/components/icons/StickyBar.vue | 44 +++++++++ .../.vitepress/theme/composables/useSearch.ts | 10 -- docs/.vitepress/theme/style.css | 21 ++++ docs/.vitepress/theme/types.ts | 1 + docs/icons/icons.data.ts | 14 ++- docs/package.json | 17 ++-- ...dStopwords.mjs => writeBrandStopwords.mts} | 0 ...tadata.mjs => writeCategoriesMetadata.mts} | 0 ...teIconDetails.mjs => writeIconDetails.mts} | 2 + ...onMetaIndex.mjs => writeIconMetaIndex.mts} | 0 ...{writeIconNodes.mjs => writeIconNodes.mts} | 0 ...tedIcons.mjs => writeIconRelatedIcons.mts} | 2 +- ...eMetadata.mjs => writeReleaseMetadata.mts} | 4 +- ...VercelOutput.mjs => writeVercelOutput.mts} | 2 +- docs/scripts/writeiconPopularity.mts | 99 +++++++++++++++++++ 22 files changed, 301 insertions(+), 73 deletions(-) rename docs/scripts/{writeBrandStopwords.mjs => writeBrandStopwords.mts} (100%) rename docs/scripts/{writeCategoriesMetadata.mjs => writeCategoriesMetadata.mts} (100%) rename docs/scripts/{writeIconDetails.mjs => writeIconDetails.mts} (96%) rename docs/scripts/{writeIconMetaIndex.mjs => writeIconMetaIndex.mts} (100%) rename docs/scripts/{writeIconNodes.mjs => writeIconNodes.mts} (100%) rename docs/scripts/{writeIconRelatedIcons.mjs => writeIconRelatedIcons.mts} (98%) rename docs/scripts/{writeReleaseMetadata.mjs => writeReleaseMetadata.mts} (96%) rename docs/scripts/{writeVercelOutput.mjs => writeVercelOutput.mts} (93%) create mode 100644 docs/scripts/writeiconPopularity.mts diff --git a/.gitignore b/.gitignore index 691b0bc39..2e7bd7183 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ docs/.vitepress/data/categoriesData.json docs/.vitepress/data/iconDetails docs/.vitepress/data/relatedIcons.json docs/.vitepress/data/brandStopwords.json +docs/.vitepress/data/iconPopularity docs/.vercel docs/.nitro docs/public/og/** diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index acb6738d9..4a4204050 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -109,7 +109,7 @@ export default defineConfig({ ], footer: { message: 'Released under the ISC License.', - copyright: `Copyright © ${new Date().getFullYear()} Lucide Contributors`, + copyright: `Copyright © ${new Date().getFullYear()} Lucide Icons`, }, editLink: { pattern: 'https://github.com/lucide-icons/lucide/edit/main/docs/:path', diff --git a/docs/.vitepress/theme/components/base/Select.vue b/docs/.vitepress/theme/components/base/Select.vue index cb97280fb..688cfc847 100644 --- a/docs/.vitepress/theme/components/base/Select.vue +++ b/docs/.vitepress/theme/components/base/Select.vue @@ -6,10 +6,10 @@ import SelectIcon from './SelectIcon.vue'; defineProps<{ id?: string; - items?: { name: string; route: string; icon: string; iconDark?: string }[]; + items?: { name: string; value: string; icon?: string; iconDark?: string }[]; }>(); -const selected = defineModel<{ name: string; icon: string; iconDark?: string }>(); +const selected = defineModel<{ name: string; value: string; icon?: string; iconDark?: string }>();