Compare commits

..

1 Commits

Author SHA1 Message Date
Jakob Guddas
a8f578fa8b fix: fixed async migration issue in generate changed icons comment markup 2025-02-20 21:55:53 +01:00
71 changed files with 2427 additions and 1447 deletions

44
.github/actions/build-and-test.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: 'Build and Test'
description: 'Builds and test a package'
inputs:
name:
description: “Name of the package”
required: true
runs:
using: 'composite'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 16
- uses: pnpm/action-setup@v2
name: Install pnpm
id: pnpm-install
with:
version: 8
run_install: false
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --filter lucide-preact
- name: Build
run: pnpm --filter lucide-preact build
- name: Test
run: pnpm --filter lucide-preact test

41
.github/actions/check-icons.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: 'Check icons'
description: 'Cross-checks icon and category references in JSON descriptors'
inputs:
name:
description: “Name of the package”
required: true
runs:
using: 'composite'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 16
- uses: pnpm/action-setup@v2
name: Install pnpm
id: pnpm-install
with:
version: 8
run_install: false
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --filter .
- name: Check icons and categories
run: pnpm checkIcons

View File

@@ -9,16 +9,17 @@ on:
jobs: jobs:
create-release: create-release:
if: github.repository == 'lucide-icons/lucide' && ${{ !startsWith(github.event.head_commit.message, 'fix(icons):') }} if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
VERSION: ${{ steps.new-version.outputs.NEW_VERSION }} VERSION: ${{ steps.new-version.outputs.NEW_VERSION }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -60,40 +61,8 @@ jobs:
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
with: with:
tag_name: ${{ steps.new-version.outputs.NEW_VERSION }} tag_name: ${{ steps.new-version.outputs.NEW_VERSION }}
name: Version ${{ steps.new-version.outputs.NEW_VERSION }} name: New icons ${{ steps.new-version.outputs.NEW_VERSION }}
generate_release_notes: true body: ${{ steps.change-log.outputs.CHANGE_LOG }}
test-semantic-release:
if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Semantic Release
id: semantic
uses: cycjimmy/semantic-release-action@v4
with:
tag_format: ${version}
branches: |
['new-release-workflow']
extends: |
semantic-release-monorepo
extra_plugins: |
@semantic-release/github
@semantic-release/git
@semantic-release/release-notes-generator
conventional-changelog-conventionalcommits
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Log output
if: steps.semantic.outputs.new_release_published == 'true'
run: |
echo ${{ steps.semantic.outputs.new_release_version }}
echo ${{ steps.semantic.outputs.new_release_major_version }}
echo ${{ steps.semantic.outputs.new_release_minor_version }}
echo ${{ steps.semantic.outputs.new_release_patch_version }}
start-release: start-release:
if: github.repository == 'lucide-icons/lucide' if: github.repository == 'lucide-icons/lucide'

View File

@@ -11,7 +11,7 @@ jobs:
issues: write issues: write
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
- name: Check for blocked phrases in issue title - name: Check for blocked phrases in issue title
run: | run: |

View File

@@ -1,58 +0,0 @@
name: Icon preview comment
on:
workflow_run:
workflows: ['Pull request icon preview']
types:
- completed
jobs:
upload:
runs-on: ubuntu-latest
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
steps:
- name: 'Download artifact'
uses: actions/github-script@v7
with:
script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
return artifact.name == "pr_number"
})[0];
let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: 'zip',
});
const fs = require('fs');
fs.writeFileSync('${{github.workspace}}/pr_number.zip', Buffer.from(download.data));
- name: 'Unzip artifact'
run: unzip pr_number.zip
- name: 'Get PR number'
run: echo "number=$(cat NR)" >> $GITHUB_OUTPUT
id: pr-number
- name: Find Comment
uses: peter-evans/find-comment@v2
id: pr-comment
with:
issue-number: ${{ steps.pr-number.outputs.number }}
comment-author: 'github-actions[bot]'
body-includes: Added or changed icons
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.pr-comment.outputs.comment-id }}
issue-number: ${{ steps.pr-number.outputs.number }}
body-path: comment-markup.md
edit-mode: replace

View File

@@ -1,32 +0,0 @@
name: Linting PR
on:
pull_request:
types:
- opened
- edited
- synchronize
- reopened
jobs:
lint-pr-title:
name: PR Title Lint
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
fix
feat
perf
refactor
test
style
docs
ci
build
requireScope: true
ignoreLabels: |
bot

View File

@@ -1,16 +1,19 @@
name: Linting PR name: Linting
on: on:
pull_request: pull_request:
branches:
- '**'
jobs: jobs:
lint-code: linting:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install Dependencies - name: Install Dependencies

View File

@@ -12,9 +12,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -26,10 +27,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -12,9 +12,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -27,7 +28,7 @@ jobs:
run: pnpm build:font run: pnpm build:font
- name: 'Upload to Artifacts' - name: 'Upload to Artifacts'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: lucide-font name: lucide-font
path: lucide-font path: lucide-font

View File

@@ -14,9 +14,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -10,28 +10,14 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
build: lucide-react-native:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4
with:
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build
run: pnpm --filter lucide-react-native build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -15,9 +15,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -29,10 +30,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -10,10 +10,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -14,9 +14,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -28,10 +29,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -12,9 +12,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -14,9 +14,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -28,10 +29,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -14,9 +14,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -28,10 +29,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

43
.github/workflows/lucide-vue.yml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Lucide Vue checks
on:
pull_request:
paths:
- packages/lucide-vue/**
- packages/shared/**
- tools/build-icons/**
- tools/rollup-plugins/**
- pnpm-lock.yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build
run: pnpm --filter lucide-vue build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test
run: pnpm --filter lucide-vue test

View File

@@ -13,9 +13,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -27,10 +28,11 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v3.8.1
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@@ -1,43 +0,0 @@
name: Pull request icon preview
on:
pull_request:
paths:
- 'icons/*.svg'
jobs:
generate-changed-icons-comment:
name: Generate Changed Icons Comment
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v41
with:
files: icons/*.svg
- uses: actions/setup-node@v4
- name: Install svgson for code preview (safer and faster than installing all deps)
run: npm install svgson
- name: Save PR number
run: |
mkdir -p ./pr
echo ${{ github.event.number }} > ./pr/NR
- name: Generate comment markup
run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> ./pr/comment-markup.md
id: comment-markup
env:
CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
- uses: actions/upload-artifact@v4
with:
name: pr_number
path: pr/

View File

@@ -1,55 +1,58 @@
name: Linting Icons name: Add Changed Icons comment
on: on:
pull_request: pull_request_target:
paths: paths:
- 'icons/*' - 'icons/*'
branches:
- main
- fix-icon-preview
jobs: jobs:
lint-filenames: lint-filenames:
name: Lint Filenames
if: github.repository == 'lucide-icons/lucide' if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: read contents: read
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
fetch-depth: 0
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Get changed files - name: Get changed files
id: changed-files id: changed-files
uses: tj-actions/changed-files@v41 uses: tj-actions/changed-files@v41
with: with:
files: icons/* files: icons/*
- name: Generate annotations - name: Generate annotations
run: node ./scripts/lintFilenames.mjs run: node ./scripts/lintFilenames.mjs
env: env:
CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
lint-contributors: lint-contributors:
name: Lint Contributors
if: github.repository == 'lucide-icons/lucide' if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: read contents: read
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
fetch-depth: 0
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Get changed files - name: Get changed files
id: changed-files id: changed-files
uses: tj-actions/changed-files@v41 uses: tj-actions/changed-files@v41
with: with:
files: icons/* files: icons/*
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
- name: Install simple-git (safer and faster than installing all deps) - name: Install simple-git (safer and faster than installing all deps)
run: npm install simple-git run: npm install simple-git
- name: Generate annotations - name: Generate annotations
run: node ./scripts/updateContributors.mjs run: node ./scripts/updateContributors.mjs
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FETCH_DEPTH: ${{ github.event.pull_request.commits }} FETCH_DEPTH: ${{ github.event.pull_request.commits }}
CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
- name: Generate annotations - name: Generate annotations
env: env:
ANNOTATION_SEVERITY: notice ANNOTATION_SEVERITY: notice
@@ -74,3 +77,47 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Check Uniqueness of Aliases - name: Check Uniqueness of Aliases
run: "! cat <(printf \"%s\\n\" icons/*.json | while read -r name; do basename \"$name\" .json; done) <(jq -cr 'select(.aliases) | .aliases[] | if type==\"string\" then . else .name end' icons/*.json) | sort | uniq -c | grep -ve '^\\s*1 '" run: "! cat <(printf \"%s\\n\" icons/*.json | while read -r name; do basename \"$name\" .json; done) <(jq -cr 'select(.aliases) | .aliases[] | if type==\"string\" then . else .name end' icons/*.json) | sort | uniq -c | grep -ve '^\\s*1 '"
generate-changed-icons-comment:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v41
with:
files: icons/*.svg
- name: Find Comment
uses: peter-evans/find-comment@v2
id: pr-comment
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Added or changed icons
- uses: actions/setup-node@v4
- name: Install svgson for code preview (safer and faster than installing all deps)
run: npm install svgson
- name: Generate comment markup
run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> comment-markup.md
id: comment-markup
env:
CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.pr-comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body-path: ./comment-markup.md
edit-mode: replace

View File

@@ -55,9 +55,10 @@ jobs:
] ]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -84,10 +85,11 @@ jobs:
needs: [pre-release, lucide-font] needs: [pre-release, lucide-font]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/download-artifact@v4 - uses: actions/download-artifact@v3
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -114,9 +116,10 @@ jobs:
needs: pre-release needs: pre-release
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies
@@ -129,7 +132,7 @@ jobs:
run: pnpm build:font run: pnpm build:font
- name: 'Upload to Artifacts' - name: 'Upload to Artifacts'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: lucide-font name: lucide-font
path: lucide-font path: lucide-font
@@ -141,14 +144,14 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/download-artifact@v4 - uses: actions/download-artifact@v3
- name: Zip font and icons - name: Zip font and icons
run: | run: |
zip -r lucide-font-${{ needs.pre-release.outputs.VERSION }}.zip lucide-font zip -r lucide-font-${{ needs.pre-release.outputs.VERSION }}.zip lucide-font
zip -r lucide-icons-${{ needs.pre-release.outputs.VERSION }}.zip icons zip -r lucide-icons-${{ needs.pre-release.outputs.VERSION }}.zip icons
- name: Release zip and fonts - name: Release zip and fonts
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v1
with: with:
tag_name: ${{ needs.pre-release.outputs.VERSION }} tag_name: ${{ needs.pre-release.outputs.VERSION }}
files: | files: |

View File

@@ -38,7 +38,6 @@ const value = computed({
<Input <Input
ref="input" ref="input"
type="search" type="search"
autofocus
v-bind="$attrs" v-bind="$attrs"
v-model="value" v-model="value"
class="input-wrapper" class="input-wrapper"

View File

@@ -9,8 +9,6 @@ import {useData, useRouter} from 'vitepress';
import { computed } from 'vue'; import { computed } from 'vue';
import createLucideIcon from 'lucide-vue-next/src/createLucideIcon'; import createLucideIcon from 'lucide-vue-next/src/createLucideIcon';
import { diamond } from '../../../data/iconNodes' import { diamond } from '../../../data/iconNodes'
import deprecationReasonTemplate from '../../../../../tools/build-icons/utils/deprecationReasonTemplate.mjs';
const props = defineProps<{ const props = defineProps<{
icon: IconEntity icon: IconEntity
@@ -26,15 +24,6 @@ const tags = computed(() => {
}) })
const DiamondIcon = createLucideIcon('Diamond', diamond) const DiamondIcon = createLucideIcon('Diamond', diamond)
const deprecatedTitle = computed(() => {
if (!props.icon.deprecationReason) return '';
return deprecationReasonTemplate(props.icon.deprecationReason, {
componentName: props.icon.name,
iconName: props.icon.name,
toBeRemovedInVersion: props.icon.toBeRemovedInVersion,
});
});
</script> </script>
<template> <template>
@@ -47,13 +36,6 @@ const deprecatedTitle = computed(() => {
<DiamondIcon fill="currentColor" :size="12"/> <DiamondIcon fill="currentColor" :size="12"/>
{{ icon.externalLibrary }} {{ icon.externalLibrary }}
</div> </div>
<Badge
v-if="icon.deprecated"
class="deprecated-badge"
:title="deprecatedTitle"
>
Deprecated
</Badge>
</div> </div>
<div class="tags-scroller" v-if="tags.length"> <div class="tags-scroller" v-if="tags.length">
<p class="icon-tags horizontal-scroller"> <p class="icon-tags horizontal-scroller">
@@ -116,16 +98,6 @@ const deprecatedTitle = computed(() => {
align-items: center; align-items: center;
} }
.deprecated-badge {
background-color: var(--vp-c-brand-5);
margin-left: 40px;
opacity: .8;
}
.deprecated-badge:hover {
background-color: var(--vp-c-brand-2);
}
.icon-tags { .icon-tags {
font-size: 16px; font-size: 16px;
color: var(--vp-c-text-2); color: var(--vp-c-text-2);

View File

@@ -6,9 +6,6 @@ export interface IconMetaData {
categories: string[]; categories: string[];
contributors: string[]; contributors: string[];
aliases?: string[]; aliases?: string[];
deprecated?: boolean;
deprecationReason?: string;
toBeRemovedInVersion?: string;
} }
export type ExternalLibs = 'lab'; export type ExternalLibs = 'lab';

View File

@@ -126,23 +126,11 @@ import { createElement, Menu } from 'lucide';
const menuIcon = createElement(Menu); // Returns HTMLElement (svg) const menuIcon = createElement(Menu); // Returns HTMLElement (svg)
// Append HTMLElement in the DOM // set custom attributes with browser native functions
const myApp = document.getElementById('app'); menuIcon.setAttribute('stroke', '#333');
myApp.appendChild(menuIcon); menuIcon.classList.add('my-icon-class');
```
#### Custom Element binding with custom attributes // Append HTMLElement in webpage
```js
import { createElement, Menu } from 'lucide';
const menuIcon = createElement(Menu, {
class: ['my-custom-class', 'icon'],
'stroke-width': 1,
stroke: '#333'
}); // Returns HTMLElement (svg)
// Append HTMLElement in the DOM
const myApp = document.getElementById('app'); const myApp = document.getElementById('app');
myApp.appendChild(menuIcon); myApp.appendChild(menuIcon);
``` ```

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -48,12 +48,10 @@
<path d="M340 120v240" stroke="#D8D8D9" stroke-width=".5"/> <path d="M340 120v240" stroke="#D8D8D9" stroke-width=".5"/>
<path d="M120 350h240" stroke="#D8D8D9" stroke-width=".5"/> <path d="M120 350h240" stroke="#D8D8D9" stroke-width=".5"/>
<path d="M350 120v240" stroke="#D8D8D9" stroke-width=".5"/> <path d="M350 120v240" stroke="#D8D8D9" stroke-width=".5"/>
</g> </g>
<g id="embed-lucide-layers" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(120 120), scale(10)"> <path d="m240 140-100 50 100 50 100-50-100-50Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" /> <path d="m140 290 100 50 100-50" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" /> <path d="m140 240 100 50 100-50" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
</g>
<g opacity=".5" stroke="#fff" stroke-width="3"> <g opacity=".5" stroke="#fff" stroke-width="3">
<path d="M120 92v16"/> <path d="M120 92v16"/>
<path d="M360 92v16"/> <path d="M360 92v16"/>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -53,13 +53,9 @@
<path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/>
</g> </g>
<g clip-path="url(#clip1_1612_15659)"> <g clip-path="url(#clip1_1612_15659)">
<g id="embed-lucide-heart" stroke="#F56565" stroke-width="7" stroke-dasharray="0.04 0.08" stroke-linejoin="round" transform="translate(120 120), scale(10)"> <path d="M310 260C324.9 245.4 340 227.9 340 205C340 190.413 334.205 176.424 323.891 166.109C313.576 155.795 299.587 150 285 150C267.4 150 255 155 240 170C225 155 212.6 150 195 150C180.413 150 166.424 155.795 156.109 166.109C145.795 176.424 140 190.413 140 205C140 228 155 245.5 170 260L240 330L310 260Z" stroke="#F56565" stroke-width="60" stroke-linejoin="round" stroke-dasharray="0.2 0.4"/>
<path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z" />
</g>
</g>
<g id="embed-lucide-heart" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(120 120), scale(10)">
<path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z" />
</g> </g>
<path d="M310 260C324.9 245.4 340 227.9 340 205C340 190.413 334.205 176.424 323.891 166.109C313.576 155.795 299.587 150 285 150C267.4 150 255 155 240 170C225 155 212.6 150 195 150C180.413 150 166.424 155.795 156.109 166.109C145.795 176.424 140 190.413 140 205C140 228 155 245.5 170 260L240 330L310 260Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<defs> <defs>
<clipPath id="clip0_1612_15659"> <clipPath id="clip0_1612_15659">
<rect x="120" y="120" width="240" height="240" rx="8" fill="white"/> <rect x="120" y="120" width="240" height="240" rx="8" fill="white"/>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -52,18 +52,16 @@
<path d="M120 350H360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M120 350H360" stroke="#D8D8D9" stroke-width="0.5"/>
<path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/>
</g> </g>
<g id="embed-lucide-calendar-days" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(120 120), scale(10)"> <path d="M310 160H170C158.954 160 150 168.954 150 180V320C150 331.046 158.954 340 170 340H310C321.046 340 330 331.046 330 320V180C330 168.954 321.046 160 310 160Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8 2v4" /> <path d="M280 140V180" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16 2v4" /> <path d="M200 140V180" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<rect width="18" height="18" x="3" y="4" rx="2" /> <path d="M150 220H330" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 10h18" /> <path d="M200 260H200.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8 14h.01" /> <path d="M240 260H240.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 14h.01" /> <path d="M280 260H280.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16 14h.01" /> <path d="M200 300H200.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8 18h.01" /> <path d="M240 300H240.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 18h.01" /> <path d="M280 300H280.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16 18h.01" />
</g>
<defs> <defs>
<clipPath id="clip0_1612_15298"> <clipPath id="clip0_1612_15298">
<rect x="120" y="120" width="240" height="240" rx="8" fill="white"/> <rect x="120" y="120" width="240" height="240" rx="8" fill="white"/>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -54,12 +54,10 @@
</g> </g>
<circle opacity="0.17" cx="240" cy="240" r="100" stroke="#F56565" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <circle opacity="0.17" cx="240" cy="240" r="100" stroke="#F56565" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<rect opacity="0.17" x="150" y="150" width="180" height="180" rx="20" stroke="#F56565" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <rect opacity="0.17" x="150" y="150" width="180" height="180" rx="20" stroke="#F56565" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<g id="embed-lucide-expand" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(120 120), scale(10)"> <path d="M330 330L270 270M330 330V282M330 330H282" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m21 21-6-6m6 6v-4.8m0 4.8h-4.8" /> <path d="M150 282V330M150 330H198M150 330L210 270" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 16.2V21m0 0h4.8M3 21l6-6" /> <path d="M330 198V150M330 150H282M330 150L270 210" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21 7.8V3m0 0h-4.8M21 3l-6 6" /> <path d="M150 198V150M150 150H198M150 150L210 210" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 7.8V3m0 0h4.8M3 3l6 6" />
</g>
<circle opacity="0.5" cx="240" cy="240" r="100" stroke="#F56565" stroke-dasharray="1 1"/> <circle opacity="0.5" cx="240" cy="240" r="100" stroke="#F56565" stroke-dasharray="1 1"/>
<rect opacity="0.5" x="150" y="150" width="180" height="180" rx="20" stroke="#F56565" stroke-dasharray="1 1"/> <rect opacity="0.5" x="150" y="150" width="180" height="180" rx="20" stroke="#F56565" stroke-dasharray="1 1"/>
<defs> <defs>

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -54,9 +54,7 @@
<path d="M120 350H360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M120 350H360" stroke="#D8D8D9" stroke-width="0.5"/>
<path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/>
</g> </g>
<g id="embed-lucide-mouse-pointer-2" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(110 110), scale(10)"> <path d="M150 150L220.7 320L245.8 246.1L320 220.7L150 150Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z" />
</g>
<path opacity="0.5" d="M240 120V360M360 240H120" stroke="#F56565" stroke-dasharray="1 1"/> <path opacity="0.5" d="M240 120V360M360 240H120" stroke="#F56565" stroke-dasharray="1 1"/>
</g> </g>
<defs> <defs>

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -53,9 +53,7 @@
<path d="M120 350H360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M120 350H360" stroke="#D8D8D9" stroke-width="0.5"/>
<path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/> <path d="M350 120V360" stroke="#D8D8D9" stroke-width="0.5"/>
</g> </g>
<g id="embed-lucide-mouse-pointer-2" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(120 120), scale(10)"> <path d="M160 160L230.7 330L255.8 256.1L330 230.7L160 160Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z" />
</g>
<path opacity="0.5" d="M240 120V360M360 240H120" stroke="#F56565" stroke-dasharray="1 1"/> <path opacity="0.5" d="M240 120V360M360 240H120" stroke="#F56565" stroke-dasharray="1 1"/>
</g> </g>
<defs> <defs>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -27,7 +27,7 @@ import iconNode from '../iconNodes/${iconName}.node.json'
import metaData from '../../../../icons/${iconName}.json' import metaData from '../../../../icons/${iconName}.json'
import releaseData from '../releaseMetadata/${iconName}.json' import releaseData from '../releaseMetadata/${iconName}.json'
const { tags, categories, contributors, aliases, deprecated, deprecationReason, toBeRemovedInVersion } = metaData const { tags, categories, contributors, aliases } = metaData
const iconDetails = { const iconDetails = {
name: '${iconName}', name: '${iconName}',
@@ -36,9 +36,6 @@ const iconDetails = {
tags, tags,
categories, categories,
aliases, aliases,
deprecated,
deprecationReason,
toBeRemovedInVersion,
...releaseData, ...releaseData,
} }

View File

@@ -9,7 +9,7 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
> >
<path d="M16.4 13.7A6.5 6.5 0 1 0 6.28 6.6c-1.1 3.13-.78 3.9-3.18 6.08A3 3 0 0 0 5 18c4 0 8.4-1.8 11.4-4.3" />
<path d="m18.5 6 2.19 4.5a6.48 6.48 0 0 1-2.29 7.2C15.4 20.2 11 22 7 22a3 3 0 0 1-2.68-1.66L2.4 16.5" />
<circle cx="12.5" cy="8.5" r="2.5" /> <circle cx="12.5" cy="8.5" r="2.5" />
<path d="M12.5 2a6.5 6.5 0 0 0-6.22 4.6c-1.1 3.13-.78 3.9-3.18 6.08A3 3 0 0 0 5 18c4 0 8.4-1.8 11.4-4.3A6.5 6.5 0 0 0 12.5 2Z" />
<path d="m18.5 6 2.19 4.5a6.48 6.48 0 0 1 .31 2 6.49 6.49 0 0 1-2.6 5.2C15.4 20.2 11 22 7 22a3 3 0 0 1-2.68-1.66L2.4 16.5" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 468 B

After

Width:  |  Height:  |  Size: 508 B

View File

@@ -9,6 +9,6 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
> >
<path d="M16 3h2a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1h-2" /> <path d="M16 3h3v18h-3" />
<path d="M8 21H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h2" /> <path d="M8 21H5V3h3" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 320 B

After

Width:  |  Height:  |  Size: 264 B

View File

@@ -6,7 +6,7 @@
"tags": [ "tags": [
"diameter", "diameter",
"zero", "zero",
"ø", "Ø",
"nothing", "nothing",
"null", "null",
"void", "void",
@@ -16,12 +16,7 @@
"division", "division",
"half", "half",
"split", "split",
"/", "/"
"average",
"avg",
"mean",
"median",
"normal"
], ],
"categories": [ "categories": [
"shapes", "shapes",

View File

@@ -9,6 +9,6 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
> >
<path d="M22 2 2 22" />
<circle cx="12" cy="12" r="10" /> <circle cx="12" cy="12" r="10" />
<path d="M22 2 2 22" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 270 B

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../icon.schema.json", "$schema": "../icon.schema.json",
"contributors": [ "contributors": [
"AnnaSasDev" "AndreasSas"
], ],
"tags": [ "tags": [
"electricity", "electricity",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../icon.schema.json", "$schema": "../icon.schema.json",
"contributors": [ "contributors": [
"AnnaSasDev" "AndreasSas"
], ],
"tags": [ "tags": [
"options", "options",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../icon.schema.json", "$schema": "../icon.schema.json",
"contributors": [ "contributors": [
"AnnaSasDev" "AndreasSas"
], ],
"tags": [ "tags": [
"floppy disk", "floppy disk",

View File

@@ -1,23 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"sebinemeth",
"ksk3110",
"karsa-mistmere",
"colebemis"
],
"tags": [
"shield",
"user",
"admin",
"protection",
"protected",
"safety",
"guard"
],
"categories": [
"account",
"security",
"development"
]
}

View File

@@ -1,15 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
<path d="M6.376 18.91a6 6 0 0 1 11.249.003" />
<circle cx="12" cy="11" r="4" />
</svg>

Before

Width:  |  Height:  |  Size: 469 B

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../icon.schema.json", "$schema": "../icon.schema.json",
"contributors": [ "contributors": [
"AnnaSasDev", "AndreasSas",
"jguddas" "jguddas"
], ],
"tags": [ "tags": [

View File

@@ -1,22 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"liamb13",
"jguddas"
],
"tags": [
"border",
"radius",
"style",
"design",
"corner",
"layout",
"round",
"rounded"
],
"categories": [
"design",
"development",
"layout"
]
}

View File

@@ -1,14 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 11a8 8 0 0 0-8-8" />
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />
</svg>

Before

Width:  |  Height:  |  Size: 316 B

View File

@@ -67,9 +67,6 @@
"svgson": "^5.3.1", "svgson": "^5.3.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"engines": {
"node": ">=23.0.0"
},
"packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247", "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247",
"pnpm": { "pnpm": {
"packageExtensions": { "packageExtensions": {

View File

@@ -53,7 +53,7 @@
"rollup": "^4.22.4", "rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0", "rollup-plugin-dts": "^6.1.0",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -59,7 +59,7 @@
"rollup": "^4.22.4", "rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0", "rollup-plugin-dts": "^6.1.0",
"typescript": "^4.8.4", "typescript": "^4.8.4",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -57,7 +57,7 @@
"@testing-library/jest-dom": "^6.1.6", "@testing-library/jest-dom": "^6.1.6",
"@testing-library/react": "^14.1.2", "@testing-library/react": "^14.1.2",
"@types/react": "^18.2.37", "@types/react": "^18.2.37",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^4.2.1",
"jest-serializer-html": "^7.1.0", "jest-serializer-html": "^7.1.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
@@ -65,7 +65,7 @@
"rollup-plugin-dts": "^6.1.0", "rollup-plugin-dts": "^6.1.0",
"rollup-plugin-preserve-directives": "^0.4.0", "rollup-plugin-preserve-directives": "^0.4.0",
"typescript": "^4.9.5", "typescript": "^4.9.5",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -76,15 +76,15 @@
"@lucide/rollup-plugins": "workspace:*", "@lucide/rollup-plugins": "workspace:*",
"@lucide/shared": "workspace:*", "@lucide/shared": "workspace:*",
"@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-babel": "^6.0.4",
"@solidjs/testing-library": "^0.8.10", "@solidjs/testing-library": "^0.8.6",
"@testing-library/jest-dom": "^6.4.2", "@testing-library/jest-dom": "^6.4.2",
"babel-preset-solid": "^1.8.12", "babel-preset-solid": "^1.8.12",
"jest-serializer-html": "^7.1.0", "jest-serializer-html": "^7.1.0",
"rollup": "^4.22.4", "rollup": "^4.22.4",
"solid-js": "^1.9.4", "solid-js": "^1.8.7",
"typescript": "^4.9.4", "typescript": "^4.9.4",
"vite": "5.4.14", "vite": "5.4.13",
"vite-plugin-solid": "^2.11.6", "vite-plugin-solid": "^2.10.1",
"vitest": "^1.1.1", "vitest": "^1.1.1",
"esbuild": "^0.25.0" "esbuild": "^0.25.0"
}, },

View File

@@ -70,7 +70,7 @@
"svelte-check": "^3.4.4", "svelte-check": "^3.4.4",
"svelte-preprocess": "^5.0.4", "svelte-preprocess": "^5.0.4",
"typescript": "^5.1.6", "typescript": "^5.1.6",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -54,8 +54,8 @@
"@vue/test-utils": "2.4.5", "@vue/test-utils": "2.4.5",
"rollup": "^4.22.4", "rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0", "rollup-plugin-dts": "^6.1.0",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1", "vitest": "^1.4.0",
"vue": "^3.4.21" "vue": "^3.4.21"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -52,8 +52,8 @@
"@vue/test-utils": "1.3.0", "@vue/test-utils": "1.3.0",
"rollup": "^3.29.5", "rollup": "^3.29.5",
"typescript": "^4.9.5", "typescript": "^4.9.5",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1", "vitest": "^0.32.2",
"vue": "2.7.14", "vue": "2.7.14",
"vue-template-compiler": "2.7.14" "vue-template-compiler": "2.7.14"
}, },

View File

@@ -51,7 +51,7 @@
"rollup": "^4.22.4", "rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0", "rollup-plugin-dts": "^6.1.0",
"typescript": "^4.9.3", "typescript": "^4.9.3",
"vite": "5.4.14", "vite": "5.4.13",
"vitest": "^1.1.1" "vitest": "^1.1.1"
} }
} }

View File

@@ -1,16 +1,15 @@
import defaultAttributes from './defaultAttributes';
import { IconNode, SVGProps } from './types'; import { IconNode, SVGProps } from './types';
type CreateSVGElementParams = [tag: string, attrs: SVGProps, children?: IconNode]; type CreateElementParams = [tag: string, attrs: SVGProps, children?: IconNode];
/** /**
* Creates a new SVGElement * Creates a new HTMLElement from icon node
* @param {string} tag - Tag name of the element * @param {string} tag
* @param {object} attrs - Attributes of the element * @param {object} attrs
* @param {array} children - Children of the element * @param {array} children
* @returns {SVGElement} * @returns {HTMLElement}
*/ */
const createSVGElement = ([tag, attrs, children]: CreateSVGElementParams) => { const createElement = ([tag, attrs, children]: CreateElementParams) => {
const element = document.createElementNS('http://www.w3.org/2000/svg', tag); const element = document.createElementNS('http://www.w3.org/2000/svg', tag);
Object.keys(attrs).forEach((name) => { Object.keys(attrs).forEach((name) => {
@@ -19,7 +18,7 @@ const createSVGElement = ([tag, attrs, children]: CreateSVGElementParams) => {
if (children?.length) { if (children?.length) {
children.forEach((child) => { children.forEach((child) => {
const childElement = createSVGElement(child); const childElement = createElement(child);
element.appendChild(childElement); element.appendChild(childElement);
}); });
@@ -28,20 +27,4 @@ const createSVGElement = ([tag, attrs, children]: CreateSVGElementParams) => {
return element; return element;
}; };
/**
* Creates a new HTMLElement from icon node
* @param {array} iconNode - Icon node to be converted to an element
* @param {object} customAttrs - Custom attributes to be added to the element
* @returns {HTMLElement}
*/
const createElement = (iconNode: IconNode, customAttrs: SVGProps = {}) => {
const tag = 'svg';
const attrs = {
...defaultAttributes,
...customAttrs,
};
return createSVGElement([tag, attrs, iconNode]);
};
export default createElement; export default createElement;

View File

@@ -98,7 +98,7 @@ const replaceElement = (element: Element, { nameAttr, icons, attrs }: ReplaceEle
}); });
} }
const svgElement = createElement(iconNode, iconAttrs); const svgElement = createElement(['svg', iconAttrs, iconNode]);
return element.parentNode?.replaceChild(svgElement, element); return element.parentNode?.replaceChild(svgElement, element);
}; };

View File

@@ -1,19 +0,0 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`createElement > should match the snapshot 1`] = `
<svg xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8">
</path>
<path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z">
</path>
</svg>
`;

View File

@@ -1,37 +0,0 @@
import { describe, it, expect } from 'vitest';
import { House, createElement } from '../src/lucide';
import { getOriginalSvg } from './helpers';
describe('createElement', () => {
it('should create SVG Element', () => {
const HomeSVG = createElement(House);
expect(HomeSVG.tagName).toBe('svg');
});
it('should match the snapshot', () => {
const HomeSVG = createElement(House);
expect(HomeSVG.outerHTML).toMatchSnapshot();
});
it('should create SVG Element with attributes', () => {
const HomeSVG = createElement(House, { fill: 'red' });
expect(HomeSVG.getAttribute('fill')).toBe('red');
});
it('should create SVG Element with class name', () => {
const HomeSVG = createElement(House, { class: 'icon' });
expect(HomeSVG.getAttribute('class')).toBe('icon');
});
it('should create the correct svg element', () => {
const HomeSVG = createElement(House);
const svg = getOriginalSvg('house', undefined, false);
expect(HomeSVG.outerHTML).toBe(svg);
});
});

View File

@@ -1,17 +0,0 @@
import fs from 'fs';
import path from 'path';
import { parseSync, stringify } from 'svgson';
const ICONS_DIR = path.resolve(__dirname, '../../../icons');
export const getOriginalSvg = (iconName: string, aliasName?: string, setAttrs = true) => {
const svgContent = fs.readFileSync(path.join(ICONS_DIR, `${iconName}.svg`), 'utf8');
const svgParsed = parseSync(svgContent);
if (setAttrs) {
svgParsed.attributes['data-lucide'] = aliasName ?? iconName;
svgParsed.attributes['class'] = `lucide lucide-${aliasName ?? iconName}`;
}
return stringify(svgParsed, { selfClose: false });
};

View File

@@ -1,6 +1,20 @@
import { describe, it, expect } from 'vitest'; import { describe, it, expect } from 'vitest';
import { createIcons, icons } from '../src/lucide'; import { createIcons, icons } from '../src/lucide';
import { getOriginalSvg } from './helpers'; import fs from 'fs';
import path from 'path';
import { parseSync, stringify } from 'svgson';
const ICONS_DIR = path.resolve(__dirname, '../../../icons');
const getOriginalSvg = (iconName: string, aliasName?: string) => {
const svgContent = fs.readFileSync(path.join(ICONS_DIR, `${iconName}.svg`), 'utf8');
const svgParsed = parseSync(svgContent);
svgParsed.attributes['data-lucide'] = aliasName ?? iconName;
svgParsed.attributes['class'] = `lucide lucide-${aliasName ?? iconName}`;
return stringify(svgParsed, { selfClose: false });
};
describe('createIcons', () => { describe('createIcons', () => {
it('should read elements from DOM and replace it with icons', () => { it('should read elements from DOM and replace it with icons', () => {

View File

@@ -13,6 +13,6 @@
"test:watch": "vitest watch" "test:watch": "vitest watch"
}, },
"devDependencies": { "devDependencies": {
"vitest": "^1.1.1" "vitest": "^2.1.1"
} }
} }

2904
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,6 @@ import path from 'path';
import { parseSync } from 'svgson'; import { parseSync } from 'svgson';
import { import {
shuffleArray, shuffleArray,
readSvgDirectory,
getCurrentDirPath, getCurrentDirPath,
minifySvg, minifySvg,
toPascalCase, toPascalCase,
@@ -43,13 +42,12 @@ const getImageTagsByFiles = (files, getBaseUrl, width) =>
return `<img title="${file}" alt="${file}" ${widthAttr} src="${url}/${base64}.svg"/>`; return `<img title="${file}" alt="${file}" ${widthAttr} src="${url}/${base64}.svg"/>`;
}); });
const svgFiles = await readSvgDirectory(ICONS_DIR); const svgFiles = fs.readdirSync(ICONS_DIR).map((file) => `icons/${file}`);
const svgFilePaths = svgFiles.map((file) => `icons/${file}`);
const iconsFilteredByName = (search) => svgFilePaths.filter((file) => file.includes(search)); const iconsFilteredByName = (search) => svgFiles.filter((file) => file.includes(search));
const cohesionRandomImageTags = getImageTagsByFiles( const cohesionRandomImageTags = getImageTagsByFiles(
shuffleArray(svgFilePaths).slice(0, changedFiles.length), shuffleArray(svgFiles).slice(0, changedFiles.length),
() => `${BASE_URL}/stroke-width/2`, () => `${BASE_URL}/stroke-width/2`,
).join(''); ).join('');

View File

@@ -1,30 +0,0 @@
import path from 'path';
import { readdirSync, readFileSync, writeFileSync } from 'fs';
for (const file of readdirSync(path.join(import.meta.dirname, '../docs/images'))) {
if (!file.endsWith('.svg')) continue;
const fileName = path.join(import.meta.dirname, '../docs/images', file);
const oldFileContent = readFileSync(fileName, 'utf8');
const newFileContent = oldFileContent
.split('</g>')
.map((val) =>
val.replace(
/(<g id="embed-lucide-([^"]*).*>)(.|\n)*/gm,
(_, groupOpeningTag, iconName) =>
[
groupOpeningTag,
...readFileSync(path.join(import.meta.dirname, `../icons/${iconName}.svg`), 'utf8')
.replace(/(<svg)([^>]|\n)*>|<\/svg>/g, '')
.split('\n'),
]
.map((val) => val.trimEnd())
.filter(Boolean)
.join('\n') + '\n',
),
)
.join('</g>');
if (oldFileContent !== newFileContent) {
console.log(`Updating ${fileName}`);
writeFileSync(fileName, newFileContent);
}
}