Compare commits

..

41 Commits

Author SHA1 Message Date
Albaraa Hasan
fccfaa3dd0 feat(icons): add saudi-riyal Symbol (#2827)
* add saudi riyal sign

* update name from sign to symbol

* fix stroke and fill issue

Co-authored-by: Jakob Guddas <github@jguddas.de>

* removed symbol from the name

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-03-14 18:49:52 +01:00
Anupam Mediratta
14fec0e184 fix(deps): CVE-2024-21538 (#2871)
* fix: CVE-2024-21538 - Update package dependencies

* Update lockfile

* Format

---------

Co-authored-by: Security Bot <security-bot@github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-03-14 16:34:42 +01:00
Jakob Guddas
fcebb5c4db feat(icons): added clock-fading icon (#2405)
* Added icons/clock-fading.svg

* Added icons/clock-fading.json
2025-03-14 16:03:53 +01:00
Jakob Guddas
1058ea5ae3 feat(icons): added shrimp icon (#2319)
* Added icons/shrimp.svg

* Added icons/shrimp.json

* Updated icons/shrimp.json
2025-03-14 15:44:33 +01:00
Jamie Law
e08a1f7973 fix(icons): changed infinity icon (#2868)
* Updated icons/infinity.svg

* Updated icons/infinity.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-03-14 15:37:15 +01:00
Eric Fennis
07f9d3ea79 ci(node): Use correct node version (#2877)
* ci(node): Use correct node version

* Remove overrides

* update lock file

* Change assert to with

* Remove duplicated version
2025-03-14 11:29:59 +01:00
Karsa
73a2c9da6c fix(icons): arcified newspaper (#2885) 2025-03-14 11:25:29 +01:00
Brizen Britt
afa4176737 fix(docs): Resolves #2887 (#2889)
* play with image

* changes to width

* changes to contributing image to show on github
2025-03-14 11:25:08 +01:00
FOSS-VFX
cb86576661 Fix grammatical inconsistencies (#2899) 2025-03-14 09:09:25 +01:00
Jakob Guddas
9b738c1cb6 ci: added bluesky and spotify to brand list filter (#2857)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-03-07 16:40:12 +01:00
Eric Fennis
aefb710e5c feat(@lucide/svelte): Lucide svelte 5 package (#2753)
* Lucide svelte (#1)

* Update peerDependencies to support Svelte 5

* Bump svelte version

* Bump @testing-library/svelte version

* Remove alias in vitest.config.ts that causes tests to fail due to deprecated svelte/internal API

* Convert to svelte 5 syntax

* Bump vite & @sveltejs/vite-plugin-svelte version

* Fix error during render when children prop is missing & fix components being mounted on the server during tests

* Update test snapshots to reflect the differences in the html generated by svelte 5

* Convert class attribute to new array syntax with built-in clsx

* Convert export template to svelte 5 syntax

* Move svelte 5 to separate directory

* Update snapshots

* Update docs

* fix(icon): change variable declaration from let to const in Icon.svelte

* Lucide svelte (#1) (#2727)

* Update peerDependencies to support Svelte 5

* Bump svelte version

* Bump @testing-library/svelte version

* Remove alias in vitest.config.ts that causes tests to fail due to deprecated svelte/internal API

* Convert to svelte 5 syntax

* Bump vite & @sveltejs/vite-plugin-svelte version

* Fix error during render when children prop is missing & fix components being mounted on the server during tests

* Update test snapshots to reflect the differences in the html generated by svelte 5

* Convert class attribute to new array syntax with built-in clsx

* Convert export template to svelte 5 syntax

* Revert changes in lucide-svelte library

* Update package lock

* Update test files

* Formatting

* Update clean command

* Fix build

* Update packages

* update deps

* Fix export script

* Format code

* Revert version number change in package json

* Update workflows

---------

Co-authored-by: Aurélien Richard <56389380+aurelienrichard@users.noreply.github.com>
2025-03-07 13:44:09 +01:00
Jakob Guddas
df063fa378 Updated icons/brackets.svg (#2863)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-03-07 13:03:57 +01:00
Eric Fennis
2c3b6754d5 ci: Update the release workflow 2025-03-07 12:59:41 +01:00
Eric Fennis
47303ac790 ci: Fix icon preview comment 2025-03-07 12:36:32 +01:00
Eric Fennis
3aab3b9b08 fix: Icon preview comment workflow 2025-03-07 12:25:36 +01:00
Eric Fennis
3d29ab9279 ci: Fix icon preview comment - remove bracket 2025-03-07 11:58:36 +01:00
Eric Fennis
e0fbbb6f2d ci: Fix icon preview comment attempt 3 2025-03-07 11:56:43 +01:00
Eric Fennis
c1331798f5 Merge branch 'main' of https://github.com/lucide-icons/lucide 2025-03-07 11:14:21 +01:00
Eric Fennis
ddad14a96d ci: Fix attempt 2 issue with icon preview comments 2025-03-07 11:14:17 +01:00
Anna Sas
a17609b5e4 fix: name change reflected in contributions (#2866) 2025-03-07 11:02:10 +01:00
Eric Fennis
e619963183 ci: fix PR comment workflow 2025-03-07 11:00:07 +01:00
Jakob Guddas
56948fe7c2 fix(ci): run lint pr title on title change (#2872) 2025-03-07 10:48:56 +01:00
Eric Fennis
68116414d0 ci(pr-comment): Fix icon preview comment on PRs (#2854)
* fix: PR icon Comment

* formatting
2025-03-07 10:48:06 +01:00
liamb13
16a18f7908 feat(icons): added square-round-corner icon (#2323)
* adds border-radius

* Update and rename border-radius.svg to square-round-corner.svg

* Update and rename border-radius.json to square-round-corner.json

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2025-02-28 18:00:52 +01:00
dependabot[bot]
ae8af191f7 build(deps-dev): bump vitest from 0.32.4 to 0.33.0 (#2799)
* build(deps-dev): bump vitest from 0.32.4 to 0.33.0

Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.32.4 to 0.33.0.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.33.0/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* build(deps-dev): bump vitest from 0.32.4 to 0.33.0

Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.32.4 to 0.33.0.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.33.0/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update vitest

* Update vitest

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-28 17:59:23 +01:00
dependabot[bot]
1787b82cfe build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide (#2804)
* build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.13 to 5.4.14.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update lockfile

* Update all vite versions

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-28 17:36:25 +01:00
dependabot[bot]
0e49b2b88c build(deps-dev): bump solid-js from 1.8.14 to 1.9.4 (#2844)
Bumps [solid-js](https://github.com/solidjs/solid) from 1.8.14 to 1.9.4.
- [Release notes](https://github.com/solidjs/solid/releases)
- [Changelog](https://github.com/solidjs/solid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/solidjs/solid/compare/v1.8.14...v1.9.4)

---
updated-dependencies:
- dependency-name: solid-js
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-28 17:23:50 +01:00
dependabot[bot]
bab52d7333 build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide-vue-next (#2805)
* build(deps-dev): bump vite in /packages/lucide-vue-next

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.13 to 5.4.14.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* update lockfile

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-28 17:23:17 +01:00
Eric Fennis
c96260d82a style(scripts): Fix formatting 2025-02-28 15:06:39 +01:00
Eric Fennis
3c23331e9e ci(actions): Update & cleanup actions (#2764)
* Update actions

* Update workflows

* Remove double jobs
2025-02-28 14:59:41 +01:00
Danilo Leal
5a7c49dc55 Make input autofocus as page reloads (#2581)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-28 11:12:16 +01:00
Jakob Guddas
6ae047557e docs: updated guideline icons (#2676)
* docs: updated guideline icons

* Update docs/images/1px-border-radius.svg

* Update docs/images/1px-border-radius.svg

* Update docs/images/1px-padding.svg

* Update docs/images/24px-24px.svg

* Update docs/images/2px-element-spacing.svg

* Update docs/images/2px-stroke.svg
2025-02-28 11:11:48 +01:00
Epifânio Francisco
fa064306fa feat(docs): Add deprecated badge for icons with deprecation status (#2618)
* feat(docs): Add deprecated badge for icons with deprecation status

* fix: resolve formatting issues in types.ts to pass Prettier checks

* Small adjustments

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-28 11:10:50 +01:00
Jakob Guddas
4f46f43379 fix(icons): added tags to circle-slash-2 icon (#2837)
* Updated icons/circle-slash-2.svg

* Updated icons/circle-slash-2.json
2025-02-25 09:22:49 +01:00
Eric Fennis
fc87643aae Merge branch 'main' of https://github.com/lucide-icons/lucide 2025-02-25 09:21:44 +01:00
Eric Fennis
6f4f47684f fix(scripts): Remove console.log 2025-02-25 09:21:40 +01:00
Sebestyén Németh
c6632ce8d7 feat(icons): added shield-user icon (#2608)
* Added icons/shield-user.svg

* Added icons/shield-user.json

* Update shield-user.svg

Apply suggestion by @karsa-mistmere at https://github.com/lucide-icons/lucide/pull/2608#issuecomment-2541214222

* Inherit coontributors

* Close gaps in svg

* Simplify arc

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-02-25 09:13:45 +01:00
Eric Fennis
a59c5de61a fix(scripts): Add extra const for path mapping 2025-02-24 10:28:54 +01:00
Eric Fennis
2bd0ae55fd fix(scripts): Add await to readSvgDirectory 2025-02-24 10:18:58 +01:00
Eric Fennis
3f2ad5b2a6 fix(lucide): Lucide create element function returning SVG Element (#2816)
* Fix create element function

* Formatting

* Adjust documentation
2025-02-24 10:10:28 +01:00
Jakob Guddas
1250fc276d fix(icons): optimized beef icon (#2832)
* ci: Improve build speeds (#2778)

* Revert sync to async functions

* Replace more sync fs functions

* Format files

* Fix build svelte package

* build(deps): bump esbuild from 0.19.12 to 0.25.0 (#2791)

Bumps [esbuild](https://github.com/evanw/esbuild) from 0.19.12 to 0.25.0.
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.19.12...v0.25.0)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vite from 5.1.8 to 5.4.12 (#2786)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.8 to 5.4.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.12/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vite from 5.4.12 to 5.4.13 (#2798)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.12 to 5.4.13.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.13/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.13/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: Add await to checkIconsAndCategories script

* fix(lucide-react): Revert exports property package.json, fixing edge worker environments. (#2814)

* Revert exports prop

* Adjust export

* Adjust export path

* Add to gitignore

* Adjust build process

* Update .gitignore and add dynamicIconImports module

* Formatting

* refactor: Optimize readAllMetadata function to use Promise.all for concurrent metadata reading

* refactor(scripts): Formatting in readAllMetadata

* Updated icons/beef.svg

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-24 10:09:14 +01:00
116 changed files with 4684 additions and 3967 deletions

View File

@@ -1,44 +0,0 @@
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

View File

@@ -1,41 +0,0 @@
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,18 +9,18 @@ on:
jobs: jobs:
create-release: create-release:
if: github.repository == 'lucide-icons/lucide' if: github.repository == 'lucide-icons/lucide' && ${{ !startsWith(github.event.head_commit.message, 'fix(icons):') }}
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@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -61,8 +61,40 @@ 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: New icons ${{ steps.new-version.outputs.NEW_VERSION }} name: Version ${{ steps.new-version.outputs.NEW_VERSION }}
body: ${{ steps.change-log.outputs.CHANGE_LOG }} generate_release_notes: true
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,12 +11,12 @@ jobs:
issues: write issues: write
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Check for blocked phrases in issue title - name: Check for blocked phrases in issue title
run: | run: |
ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH") ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH")
BLOCKED_PHRASES=("twitter" "whatsapp" "logo" "google" "tiktok" "facebook" "slack" "discord" "bluesky") BLOCKED_PHRASES=("twitter" "whatsapp" "logo" "google" "tiktok" "facebook" "slack" "discord" "bluesky" "spotify" "behance")
# Check title and body for blocked phrases # Check title and body for blocked phrases
for PHRASE in "${BLOCKED_PHRASES[@]}" for PHRASE in "${BLOCKED_PHRASES[@]}"

View File

@@ -0,0 +1,58 @@
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,20 +1,18 @@
name: Linting name: Linting PR
on: on:
pull_request: pull_request:
branches:
- '**'
jobs: jobs:
linting: lint-code:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install Dependencies - name: Install Dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

32
.github/workflows/lint-pr-title.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
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,58 +1,57 @@
name: Add Changed Icons comment name: Linting Icons
on: on:
pull_request_target: pull_request:
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
with:
node-version-file: 'package.json'
- 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
@@ -77,47 +76,3 @@ 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

@@ -12,11 +12,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -27,12 +27,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -12,11 +12,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -28,7 +28,7 @@ jobs:
run: pnpm build:font run: pnpm build:font
- name: 'Upload to Artifacts' - name: 'Upload to Artifacts'
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: lucide-font name: lucide-font
path: lucide-font path: lucide-font

View File

@@ -14,11 +14,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -10,15 +10,31 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide-react-native: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- 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
with:
cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -15,11 +15,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -30,12 +30,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -10,12 +10,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -14,11 +14,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -29,12 +29,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -12,11 +12,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

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

View File

@@ -14,11 +14,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -29,12 +29,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -14,11 +14,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -29,12 +29,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -13,11 +13,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -28,12 +28,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v3.8.1 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile

View File

@@ -0,0 +1,43 @@
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

@@ -52,14 +52,15 @@ jobs:
'lucide-preact', 'lucide-preact',
'lucide-solid', 'lucide-solid',
'lucide-svelte', 'lucide-svelte',
'@lucide/svelte',
] ]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -85,12 +86,12 @@ 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@v3 - uses: actions/download-artifact@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -116,11 +117,11 @@ jobs:
needs: pre-release needs: pre-release
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 18
cache: 'pnpm' cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
@@ -132,7 +133,7 @@ jobs:
run: pnpm build:font run: pnpm build:font
- name: 'Upload to Artifacts' - name: 'Upload to Artifacts'
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: lucide-font name: lucide-font
path: lucide-font path: lucide-font
@@ -144,14 +145,14 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/download-artifact@v3 - uses: actions/download-artifact@v4
- 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@v1 uses: softprops/action-gh-release@v2
with: with:
tag_name: ${{ needs.pre-release.outputs.VERSION }} tag_name: ${{ needs.pre-release.outputs.VERSION }}
files: | files: |

View File

@@ -77,7 +77,7 @@ To distribute different packages we use [PNPM workspaces](https://pnpm.io/worksp
The configured directory for workspaces is the [packages](https://github.com/lucide-icons/lucide/tree/main/packages) directory, located in the root directory. There you will find all the current packages from lucide. The configured directory for workspaces is the [packages](https://github.com/lucide-icons/lucide/tree/main/packages) directory, located in the root directory. There you will find all the current packages from lucide.
There are more workspaces defined, see [`pnpm-workspace.yaml`](https://github.com/lucide-icons/lucide/blob/main/pnpm-workspace.yaml). There are more workspaces defined, see [`pnpm-workspace.yaml`](https://github.com/lucide-icons/lucide/blob/main/pnpm-workspace.yaml).
> Note: One package is not managed by pnpm: **lucide-flutter**, this package is written in Dart and used pub for publishing. > Note: One package is not managed by pnpm: **lucide-flutter**, this package is written in Dart and uses pub for publishing.
### Generated Code ### Generated Code
@@ -165,13 +165,13 @@ Detailed documentation about: installation, guides, packages, design guides etc.
All the icons of lucide in SVG format. These will be used as source for all the packages and other distributions for the lucide icons. All the icons of lucide in SVG format. These will be used as source for all the packages and other distributions for the lucide icons.
### packages ### Packages
Includes all the (npm) packages of lucide. Includes all the (npm) packages of lucide.
> Note: One package is not managed by pnpm: **lucide-flutter**, this package is written in Dart and used pub for publishing. > Note: One package is not managed by pnpm: **lucide-flutter**, this package is written in Dart and uses pub for publishing.
### scripts ### Scripts
Includes usefully scripts to automate certain jobs. Big part of the scripts is the template generation, for example it generates icon components for all the packages. These scripts are usually executed from the "scripts" section in the package.json. Includes usefully scripts to automate certain jobs. Big part of the scripts is the template generation, for example it generates icon components for all the packages. These scripts are usually executed from the "scripts" section in the package.json.
@@ -190,4 +190,4 @@ If you need any help or have problems with you contribution. Please don't hesita
Thank you to all the people who already contributed to Lucide! Thank you to all the people who already contributed to Lucide!
<a href="https://github.com/lucide-icons/lucide/graphs/contributors"> <a href="https://github.com/lucide-icons/lucide/graphs/contributors">
<img src="https://opencollective.com/lucide-icons/contributors.svg?width=890" /></a> <img src="https://opencollective.com/lucide-icons/contributors.svg?width=800" /></a>

View File

@@ -69,7 +69,9 @@ Lucide is totally free for commercial use and personal use, this software is lic
Thank you to all the people who contributed to Lucide! Thank you to all the people who contributed to Lucide!
<a href="https://github.com/lucide-icons/lucide/graphs/contributors"> <a href="https://github.com/lucide-icons/lucide/graphs/contributors">
<img src="https://opencollective.com/lucide-icons/contributors.svg?width=890" /></a>
<img src="https://opencollective.com/lucide-icons/contributors.svg?width=800" />
</a>
## Sponsors ## Sponsors

View File

@@ -38,6 +38,7 @@ 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,6 +9,8 @@ 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
@@ -24,6 +26,15 @@ 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>
@@ -36,6 +47,13 @@ const DiamondIcon = createLucideIcon('Diamond', diamond)
<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">
@@ -98,6 +116,16 @@ const DiamondIcon = createLucideIcon('Diamond', diamond)
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,6 +6,9 @@ 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

@@ -7,22 +7,22 @@ Implementation of the lucide icon library for svelte applications.
::: code-group ::: code-group
```sh [pnpm] ```sh [pnpm]
pnpm add lucide-svelte pnpm add @lucide/svelte
``` ```
```sh [yarn] ```sh [yarn]
yarn add lucide-svelte yarn add @lucide/svelte
``` ```
```sh [npm] ```sh [npm]
npm install lucide-svelte npm install @lucide/svelte
``` ```
```sh [bun] ```sh [bun]
bun add lucide-svelte bun add @lucide/svelte
``` ```
::: :::
> `@lucide/svelte` is only for Svelte 5, for Svelte 4 use the `lucide-svelte` package.
## How to use ## How to use
@@ -36,7 +36,7 @@ Default usage:
```svelte ```svelte
<script> <script>
import { Skull } from 'lucide-svelte'; import { Skull } from '@lucide/svelte';
</script> </script>
<Skull /> <Skull />
@@ -46,17 +46,17 @@ Additional props can be passed to adjust the icon:
```svelte ```svelte
<script> <script>
import { Camera } from 'lucide-svelte'; import { Camera } from '@lucide/svelte';
</script> </script>
<Camera color="#ff3e98" /> <Camera color="#ff3e98" />
``` ```
For faster builds and load times, you can import icons directly from the `lucide-svelte/icons` directory: For faster builds and load times, you can import icons directly from the `@lucide/svelte/icons` directory:
```svelte ```svelte
<script> <script>
import CircleAlert from 'lucide-svelte/icons/circle-alert'; import CircleAlert from '@lucide/svelte/icons/circle-alert';
</script> </script>
<CircleAlert color="#ff3e98" /> <CircleAlert color="#ff3e98" />
@@ -77,7 +77,7 @@ To customize the appearance of an icon, you can pass custom properties as props
```svelte ```svelte
<script> <script>
import { Phone } from 'lucide-svelte'; import { Phone } from '@lucide/svelte';
</script> </script>
<Phone fill="#333" /> <Phone fill="#333" />
@@ -91,53 +91,11 @@ The package includes type definitions for all icons. This is useful if you want
### TypeScript Example ### TypeScript Example
#### Svelte 4 ::: code-group
```svelte ```svelte [Svelte 5]
<script lang="ts"> <script lang="ts">
import { Home, Library, Cog, type Icon } from 'lucide-svelte'; import { Home, Library, Cog, type Icon as IconType } from '@lucide/svelte';
import type { ComponentType } from 'svelte';
type MenuItem = {
name: string;
href: string;
icon: ComponentType<Icon>;
};
const menuItems: MenuItem[] = [
{
name: 'Home',
href: '/',
icon: Home
},
{
name: 'Blog',
href: '/blog',
icon: Library
},
{
name: 'Projects',
href: '/projects',
icon: Cog
}
];
</script>
{#each menuItems as item}
<a href={item.href}>
<svelte:component this={item.icon} />
<span>{item.name}</span>
</a>
{/each}
```
#### Svelte 5
Some changes are required since Svelte 5 [deprecates](https://svelte.dev/docs/svelte/v5-migration-guide#Components-are-no-longer-classes-Component-typing-changes) the `ComponentType` typescript type.
```svelte
<script lang="ts">
import { Home, Library, Cog, type Icon as IconType } from 'lucide-svelte';
type MenuItem = { type MenuItem = {
name: string; name: string;
@@ -173,19 +131,98 @@ Some changes are required since Svelte 5 [deprecates](https://svelte.dev/docs/sv
{/each} {/each}
``` ```
```svelte [Svelte 4]
<script lang="ts">
import { Home, Library, Cog, type Icon } from '@lucide/svelte';
import type { ComponentType } from 'svelte';
type MenuItem = {
name: string;
href: string;
icon: ComponentType<Icon>;
};
const menuItems: MenuItem[] = [
{
name: 'Home',
href: '/',
icon: Home
},
{
name: 'Blog',
href: '/blog',
icon: Library
},
{
name: 'Projects',
href: '/projects',
icon: Cog
}
];
</script>
{#each menuItems as item}
<a href={item.href}>
<svelte:component this={item.icon} />
<span>{item.name}</span>
</a>
{/each}
```
:::
### JSDoc Example ### JSDoc Example
#### Svelte 4 ::: code-group
```svelte ```svelte [Svelte 5]
<script> <script>
import { Home, Library, Cog } from 'lucide-svelte'; import { Home, Library, Cog } from '@lucide/svelte';
/** /**
* @typedef {Object} MenuItem * @typedef {Object} MenuItem
* @property {string} name * @property {string} name
* @property {string} href * @property {string} href
* @property {import('svelte').ComponentType<import('lucide-svelte').Icon>} icon * @property {typeof import('@lucide/svelte').Icon} icon
*/
/** @type {MenuItem[]} */
const menuItems = [
{
name: 'Home',
href: '/',
icon: Home
},
{
name: 'Blog',
href: '/blog',
icon: Library
},
{
name: 'Projects',
href: '/projects',
icon: Cog
}
];
</script>
{#each menuItems as item}
{@const Icon = item.icon}
<a href={item.href}>
<Icon />
<span>{item.name}</span>
</a>
{/each}
```
```svelte [Svelte 4]
<script>
import { Home, Library, Cog } from '@lucide/svelte';
/**
* @typedef {Object} MenuItem
* @property {string} name
* @property {string} href
* @property {import('svelte').ComponentType<import('@lucide/svelte').Icon>} icon
*/ */
/** @type {MenuItem[]} */ /** @type {MenuItem[]} */
@@ -216,49 +253,7 @@ Some changes are required since Svelte 5 [deprecates](https://svelte.dev/docs/sv
{/each} {/each}
``` ```
:::
#### Svelte 5
```svelte
<script>
import { Home, Library, Cog } from 'lucide-svelte';
/**
* @typedef {Object} MenuItem
* @property {string} name
* @property {string} href
* @property {typeof import('lucide-svelte').Icon} icon
*/
/** @type {MenuItem[]} */
const menuItems = [
{
name: 'Home',
href: '/',
icon: Home
},
{
name: 'Blog',
href: '/blog',
icon: Library
},
{
name: 'Projects',
href: '/projects',
icon: Cog
}
];
</script>
{#each menuItems as item}
{@const Icon = item.icon}
<a href={item.href}>
<Icon />
<span>{item.name}</span>
</a>
{/each}
```
For more details about typing the `svelte:component` directive, see the [Svelte documentation](https://svelte.dev/docs/typescript#types-componenttype). For more details about typing the `svelte:component` directive, see the [Svelte documentation](https://svelte.dev/docs/typescript#types-componenttype).
@@ -275,7 +270,7 @@ This creates a single icon based on the iconNode passed and renders a Lucide ico
```svelte ```svelte
<script> <script>
import { Icon } from 'lucide-svelte'; import { Icon } from '@lucide/svelte';
import { burger, sausage } from '@lucide/lab'; import { burger, sausage } from '@lucide/lab';
</script> </script>
@@ -293,22 +288,11 @@ The example below imports all ES Modules, so exercise caution when using it. Imp
### Icon Component Example ### Icon Component Example
#### Svelte 4 ::: code-group
```svelte ```svelte [Svelte 5]
<script> <script>
import * as icons from 'lucide-svelte'; import * as icons from '@lucide/svelte';
export let name;
</script>
<svelte:component this={icons[name]} {...$$props} />
```
#### Svelte 5
```svelte
<script>
import * as icons from 'lucide-svelte';
let { name } = $props(); let { name } = $props();
const Icon = icons[name]; const Icon = icons[name];
@@ -317,6 +301,17 @@ The example below imports all ES Modules, so exercise caution when using it. Imp
<Icon {...props} /> <Icon {...props} />
``` ```
```svelte [Svelte 4]
<script>
import * as icons from '@lucide/svelte';
export let name;
</script>
<svelte:component this={icons[name]} {...$$props} />
```
:::
#### Using the Icon Component #### Using the Icon Component
```svelte ```svelte

View File

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

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -48,10 +48,12 @@
<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>
<path d="m240 140-100 50 100 50 100-50-100-50Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <g id="embed-lucide-layers" stroke="#3C3C43" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="translate(120 120), scale(10)">
<path d="m140 290 100 50 100-50" 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 240 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="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.2 KiB

After

Width:  |  Height:  |  Size: 7.3 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,9 +53,13 @@
<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)">
<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"/> <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="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,16 +52,18 @@
<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>
<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"/> <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="M280 140V180" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M8 2v4" />
<path d="M200 140V180" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M16 2v4" />
<path d="M150 220H330" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <rect width="18" height="18" x="3" y="4" rx="2" />
<path d="M200 260H200.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 10h18" />
<path d="M240 260H240.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M8 14h.01" />
<path d="M280 260H280.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M12 14h.01" />
<path d="M200 300H200.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M16 14h.01" />
<path d="M240 300H240.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M8 18h.01" />
<path d="M280 300H280.1" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M12 18h.01" />
<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: 17 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -54,10 +54,12 @@
</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"/>
<path d="M330 330L270 270M330 330V282M330 330H282" stroke="#3C3C43" 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="M150 282V330M150 330H198M150 330L210 270" 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="M330 198V150M330 150H282M330 150L270 210" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 16.2V21m0 0h4.8M3 21l6-6" />
<path d="M150 198V150M150 150H198M150 150L210 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="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,7 +54,9 @@
<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>
<path d="M150 150L220.7 320L245.8 246.1L320 220.7L150 150Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <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="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,7 +53,9 @@
<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>
<path d="M160 160L230.7 330L255.8 256.1L330 230.7L160 160Z" stroke="#3C3C43" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/> <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="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 } = metaData const { tags, categories, contributors, aliases, deprecated, deprecationReason, toBeRemovedInVersion } = metaData
const iconDetails = { const iconDetails = {
name: '${iconName}', name: '${iconName}',
@@ -36,6 +36,9 @@ 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: 508 B

After

Width:  |  Height:  |  Size: 468 B

View File

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

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 320 B

View File

@@ -6,7 +6,7 @@
"tags": [ "tags": [
"diameter", "diameter",
"zero", "zero",
"Ø", "ø",
"nothing", "nothing",
"null", "null",
"void", "void",
@@ -16,7 +16,12 @@
"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"
> >
<circle cx="12" cy="12" r="10" />
<path d="M22 2 2 22" /> <path d="M22 2 2 22" />
<circle cx="12" cy="12" r="10" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 270 B

15
icons/clock-fading.json Normal file
View File

@@ -0,0 +1,15 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"jguddas"
],
"tags": [
"time",
"watch",
"alarm"
],
"categories": [
"time"
]
}

18
icons/clock-fading.svg Normal file
View File

@@ -0,0 +1,18 @@
<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="M12 2a10 10 0 0 1 7.38 16.75" />
<path d="M12 6v6l4 2" />
<path d="M2.5 8.875a10 10 0 0 0-.5 3" />
<path d="M2.83 16a10 10 0 0 0 2.43 3.4" />
<path d="M4.636 5.235a10 10 0 0 1 .891-.857" />
<path d="M8.644 21.42a10 10 0 0 0 7.631-.38" />
</svg>

After

Width:  |  Height:  |  Size: 467 B

View File

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

View File

@@ -3,7 +3,8 @@
"contributors": [ "contributors": [
"mittalyashu", "mittalyashu",
"danielbayley", "danielbayley",
"karsa-mistmere" "karsa-mistmere",
"jamiemlaw"
], ],
"tags": [ "tags": [
"unlimited", "unlimited",

View File

@@ -9,5 +9,5 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
> >
<path d="M12 12c-2-2.67-4-4-6-4a4 4 0 1 0 0 8c2 0 4-1.33 6-4Zm0 0c2 2.67 4 4 6 4a4 4 0 0 0 0-8c-2 0-4 1.33-6 4Z" /> <path d="M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 284 B

View File

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

View File

@@ -9,8 +9,8 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
> >
<path d="M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-2 2Zm0 0a2 2 0 0 1-2-2v-9c0-1.1.9-2 2-2h2" />
<path d="M18 14h-8" />
<path d="M15 18h-5" /> <path d="M15 18h-5" />
<path d="M10 6h8v4h-8V6Z" /> <path d="M18 14h-8" />
<path d="M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9a2 2 0 0 1 2-2h2" />
<rect x="10" y="6" width="8" height="4" rx="1" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 414 B

After

Width:  |  Height:  |  Size: 416 B

15
icons/saudi-riyal.json Normal file
View File

@@ -0,0 +1,15 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"null78",
"jguddas"
],
"tags": [
"currency",
"money",
"payment"
],
"categories": [
"finance"
]
}

16
icons/saudi-riyal.svg Normal file
View File

@@ -0,0 +1,16 @@
<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 19.5-5.5 1.2" />
<path d="M14.5 4v11.22a1 1 0 0 0 1.242.97L20 15.2" />
<path d="m2.978 19.351 5.549-1.363A2 2 0 0 0 10 16V2" />
<path d="M20 10 4 13.5" />
</svg>

After

Width:  |  Height:  |  Size: 384 B

View File

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

23
icons/shield-user.json Normal file
View File

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

15
icons/shield-user.svg Normal file
View File

@@ -0,0 +1,15 @@
<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>

After

Width:  |  Height:  |  Size: 470 B

21
icons/shrimp.json Normal file
View File

@@ -0,0 +1,21 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere"
],
"tags": [
"seafood",
"shellfish",
"crustacean",
"prawn",
"scallop",
"whelk",
"arthropod",
"littleneck",
"quahog",
"cherrystone"
],
"categories": [
"animals"
]
}

17
icons/shrimp.svg Normal file
View File

@@ -0,0 +1,17 @@
<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="M11 12h.01" />
<path d="M13 22c.5-.5 1.12-1 2.5-1-1.38 0-2-.5-2.5-1" />
<path d="M14 2a3.276 3.276 0 0 1-3.227 1.798l-6.17-.561A2.387 2.387 0 1 0 4.387 8H15.5a1 1 0 0 1 0 13 1 1 0 0 0 0-5H12a7 7 0 0 1-7-7V8" />
<path d="M14 8a8.5 8.5 0 0 1 0 8" />
<path d="M16 16c2 0 4.5-4 4-6" />
</svg>

After

Width:  |  Height:  |  Size: 509 B

View File

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

View File

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

View File

@@ -0,0 +1,14 @@
<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>

After

Width:  |  Height:  |  Size: 316 B

View File

@@ -54,20 +54,23 @@
"eslint-config-prettier": "^8.10.0", "eslint-config-prettier": "^8.10.0",
"eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-alias": "^1.1.2",
"eslint-import-resolver-custom-alias": "^1.3.2", "eslint-import-resolver-custom-alias": "^1.3.2",
"eslint-import-resolver-typescript": "^3.6.3", "eslint-import-resolver-typescript": "^3.8.3",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"husky": "^8.0.3", "husky": "^8.0.3",
"lint-staged": "^13.3.0", "lint-staged": "^13.3.0",
"minimist": "^1.2.8", "minimist": "^1.2.8",
"p-memoize": "^7.1.1", "p-memoize": "^7.1.1",
"prettier": "3.2.4", "prettier": "3.2.4",
"semver": "^7.6.3", "semver": "^7.7.1",
"simple-git": "^3.27.0", "simple-git": "^3.27.0",
"svgo": "^3.3.2", "svgo": "^3.3.2",
"svgson": "^5.3.1", "svgson": "^5.3.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247", "engines": {
"node": ">=23.0.0"
},
"packageManager": "pnpm@10.6.1+sha512.40ee09af407fa9fbb5fbfb8e1cb40fbb74c0af0c3e10e9224d7b53c7658528615b2c92450e74cfad91e3a2dcafe3ce4050d80bda71d757756d2ce2b66213e9a3",
"pnpm": { "pnpm": {
"packageExtensions": { "packageExtensions": {
"vue-template-compiler": { "vue-template-compiler": {
@@ -75,6 +78,9 @@
"vue": "2.7.14" "vue": "2.7.14"
} }
} }
},
"overrides": {
"cross-spawn": "7.0.5"
} }
} }
} }

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.13", "vite": "5.4.14",
"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.13", "vite": "5.4.14",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,6 +1,6 @@
import plugins from '@lucide/rollup-plugins'; import plugins from '@lucide/rollup-plugins';
import dts from 'rollup-plugin-dts'; import dts from 'rollup-plugin-dts';
import pkg from './package.json' assert { type: 'json' }; import pkg from './package.json' with { type: 'json' };
const packageName = 'LucideReact'; const packageName = 'LucideReact';
const outputFileName = 'lucide-react-native'; const outputFileName = 'lucide-react-native';

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.2.1", "@vitejs/plugin-react": "^4.3.4",
"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.13", "vite": "5.4.14",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,6 +1,6 @@
import plugins from '@lucide/rollup-plugins'; import plugins from '@lucide/rollup-plugins';
import preserveDirectives from 'rollup-plugin-preserve-directives'; import preserveDirectives from 'rollup-plugin-preserve-directives';
import pkg from './package.json' assert { type: 'json' }; import pkg from './package.json' with { type: 'json' };
import dts from 'rollup-plugin-dts'; import dts from 'rollup-plugin-dts';
import getAliasesEntryNames from './scripts/getAliasesEntryNames.mjs'; import getAliasesEntryNames from './scripts/getAliasesEntryNames.mjs';

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.6", "@solidjs/testing-library": "^0.8.10",
"@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.8.7", "solid-js": "^1.9.4",
"typescript": "^4.9.4", "typescript": "^4.9.4",
"vite": "5.4.13", "vite": "5.4.14",
"vite-plugin-solid": "^2.10.1", "vite-plugin-solid": "^2.11.6",
"vitest": "^1.1.1", "vitest": "^1.1.1",
"esbuild": "^0.25.0" "esbuild": "^0.25.0"
}, },

View File

@@ -4,7 +4,7 @@ import esbuild from 'esbuild';
import plugins from '@lucide/rollup-plugins'; import plugins from '@lucide/rollup-plugins';
import ts from 'typescript'; import ts from 'typescript';
import pkg from './package.json' assert { type: 'json' }; import pkg from './package.json' with { type: 'json' };
const packageName = 'LucideSolid'; const packageName = 'LucideSolid';
const outputFileName = 'lucide-solid'; const outputFileName = 'lucide-solid';

View File

@@ -1,6 +1,6 @@
import plugins from '@lucide/rollup-plugins'; import plugins from '@lucide/rollup-plugins';
import dts from 'rollup-plugin-dts'; import dts from 'rollup-plugin-dts';
import pkg from './package.json' assert { type: 'json' }; import pkg from './package.json' with { type: 'json' };
const outputFileName = pkg.name; const outputFileName = pkg.name;
const outputDir = 'dist'; const outputDir = 'dist';

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.13", "vite": "5.4.14",
"vitest": "^1.1.1" "vitest": "^1.1.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,8 +1,7 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`Using Icon Component > should render icon and match snapshot 1`] = ` exports[`Using Icon Component > should render icon and match snapshot 1`] = `
<div> <svg
<svg
class="lucide-icon lucide" class="lucide-icon lucide"
fill="none" fill="none"
height="48" height="48"
@@ -13,7 +12,7 @@ exports[`Using Icon Component > should render icon and match snapshot 1`] = `
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="48" width="48"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
> >
<path <path
d="M6 12H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2" d="M6 12H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"
/> />
@@ -31,6 +30,5 @@ exports[`Using Icon Component > should render icon and match snapshot 1`] = `
/> />
</svg> </svg>
</div>
`; `;

View File

@@ -42,8 +42,7 @@ exports[`Using lucide icon components > should add a class to the element 1`] =
`; `;
exports[`Using lucide icon components > should adjust the size, stroke color and stroke width 1`] = ` exports[`Using lucide icon components > should adjust the size, stroke color and stroke width 1`] = `
<body> <div>
<div>
<svg <svg
class="lucide-icon lucide lucide-smile" class="lucide-icon lucide lucide-smile"
fill="none" fill="none"
@@ -82,13 +81,11 @@ exports[`Using lucide icon components > should adjust the size, stroke color and
</svg> </svg>
</div> </div>
</body>
`; `;
exports[`Using lucide icon components > should not scale the strokeWidth when absoluteStrokeWidth is set 1`] = ` exports[`Using lucide icon components > should not scale the strokeWidth when absoluteStrokeWidth is set 1`] = `
<div> <svg xmlns="http://www.w3.org/2000/svg"
<svg xmlns="http://www.w3.org/2000/svg"
width="48" width="48"
height="48" height="48"
viewbox="0 0 24 24" viewbox="0 0 24 24"
@@ -99,7 +96,7 @@ exports[`Using lucide icon components > should not scale the strokeWidth when ab
stroke-linejoin="round" stroke-linejoin="round"
data-testid="smile-icon" data-testid="smile-icon"
class="lucide-icon lucide lucide-smile" class="lucide-icon lucide lucide-smile"
> >
<circle cx="12" <circle cx="12"
cy="12" cy="12"
r="10" r="10"
@@ -119,13 +116,11 @@ exports[`Using lucide icon components > should not scale the strokeWidth when ab
y2="9" y2="9"
> >
</line> </line>
</svg> </svg>
</div>
`; `;
exports[`Using lucide icon components > should render an component 1`] = ` exports[`Using lucide icon components > should render an component 1`] = `
<body> <div>
<div>
<svg <svg
class="lucide-icon lucide lucide-smile" class="lucide-icon lucide lucide-smile"
fill="none" fill="none"
@@ -164,13 +159,11 @@ exports[`Using lucide icon components > should render an component 1`] = `
</svg> </svg>
</div> </div>
</body>
`; `;
exports[`Using lucide icon components > should render an icon slot 1`] = ` exports[`Using lucide icon components > should render an icon slot 1`] = `
<body> <div>
<div>
<svg <svg
class="lucide-icon lucide lucide-smile" class="lucide-icon lucide lucide-smile"
fill="none" fill="none"
@@ -212,6 +205,5 @@ exports[`Using lucide icon components > should render an icon slot 1`] = `
Test Test
</text> </text>
</svg> </svg>
</div> </div>
</body>
`; `;

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.13", "vite": "5.4.14",
"vitest": "^1.4.0", "vitest": "^1.1.1",
"vue": "^3.4.21" "vue": "^3.4.21"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,5 +1,5 @@
import plugins, { replace } from '@lucide/rollup-plugins'; import plugins, { replace } from '@lucide/rollup-plugins';
import pkg from './package.json' assert { type: 'json' }; import pkg from './package.json' with { type: 'json' };
import dts from 'rollup-plugin-dts'; import dts from 'rollup-plugin-dts';
const packageName = 'LucideVueNext'; const packageName = 'LucideVueNext';

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.13", "vite": "5.4.14",
"vitest": "^0.32.2", "vitest": "^1.1.1",
"vue": "2.7.14", "vue": "2.7.14",
"vue-template-compiler": "2.7.14" "vue-template-compiler": "2.7.14"
}, },

View File

@@ -1,5 +1,5 @@
import plugins, { replace } from '@lucide/rollup-plugins'; import plugins, { replace } from '@lucide/rollup-plugins';
import pkg from './package.json' assert { type: 'json' }; import pkg from './package.json' with { type: 'json' };
const packageName = 'LucideVue'; const packageName = 'LucideVue';
const outputFileName = 'lucide-vue'; const outputFileName = 'lucide-vue';

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.13", "vite": "5.4.14",
"vitest": "^1.1.1" "vitest": "^1.1.1"
} }
} }

View File

@@ -1,15 +1,16 @@
import defaultAttributes from './defaultAttributes';
import { IconNode, SVGProps } from './types'; import { IconNode, SVGProps } from './types';
type CreateElementParams = [tag: string, attrs: SVGProps, children?: IconNode]; type CreateSVGElementParams = [tag: string, attrs: SVGProps, children?: IconNode];
/** /**
* Creates a new HTMLElement from icon node * Creates a new SVGElement
* @param {string} tag * @param {string} tag - Tag name of the element
* @param {object} attrs * @param {object} attrs - Attributes of the element
* @param {array} children * @param {array} children - Children of the element
* @returns {HTMLElement} * @returns {SVGElement}
*/ */
const createElement = ([tag, attrs, children]: CreateElementParams) => { const createSVGElement = ([tag, attrs, children]: CreateSVGElementParams) => {
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) => {
@@ -18,7 +19,7 @@ const createElement = ([tag, attrs, children]: CreateElementParams) => {
if (children?.length) { if (children?.length) {
children.forEach((child) => { children.forEach((child) => {
const childElement = createElement(child); const childElement = createSVGElement(child);
element.appendChild(childElement); element.appendChild(childElement);
}); });
@@ -27,4 +28,20 @@ const createElement = ([tag, attrs, children]: CreateElementParams) => {
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(['svg', iconAttrs, iconNode]); const svgElement = createElement(iconNode, iconAttrs);
return element.parentNode?.replaceChild(svgElement, element); return element.parentNode?.replaceChild(svgElement, element);
}; };

View File

@@ -0,0 +1,19 @@
// 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

@@ -0,0 +1,37 @@
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

@@ -0,0 +1,17 @@
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,20 +1,6 @@
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 fs from 'fs'; import { getOriginalSvg } from './helpers';
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": "^2.1.1" "vitest": "^1.1.1"
} }
} }

2
packages/svelte/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
src/icons/*.svelte
.svelte-kit

73
packages/svelte/README.md Normal file
View File

@@ -0,0 +1,73 @@
<p align="center">
<a href="https://github.com/lucide-icons/lucide">
<img src="https://lucide.dev/package-logos/lucide-svelte.svg" alt="Lucide icon library for Svelte 5 applications." width="540">
</a>
</p>
<p align="center">
Lucide icon library for Svelte 5 applications.
</p>
<div align="center">
[![npm](https://img.shields.io/npm/v/%40lucide%2Fsvelte?color=blue)](https://www.npmjs.com/package/lucide-svelte)
![NPM Downloads](https://img.shields.io/npm/dw/%40lucide%2Fsvelte)
[![GitHub](https://img.shields.io/github/license/lucide-icons/lucide)](https://lucide.dev/license)
</div>
<p align="center">
<a href="https://lucide.dev/guide/">About</a>
·
<a href="https://lucide.dev/icons/">Icons</a>
·
<a href="https://lucide.dev/guide/packages/lucide-svelte">Documentation</a>
·
<a href="https://lucide.dev/license">License</a>
</p>
# Lucide Svelte
Implementation of the lucide icon library for svelte applications.
## Installation
```sh
pnpm add @lucide/svelte
```
```sh
npm install @lucide/svelte
```
```sh
yarn add @lucide/svelte
```
```sh
bun add @lucide/svelte
```
## Documentation
For full documentation, visit [lucide.dev](https://lucide.dev/guide/packages/lucide-svelte)
## Community
Join the [Discord server](https://discord.gg/EH6nSts) to chat with the maintainers and other users.
## License
Lucide is licensed under the ISC license. See [LICENSE](https://lucide.dev/license).
## Sponsors
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
<img src="https://lucide.dev/vercel.svg" alt="Powered by Vercel" width="200" />
</a>
<a href="https://www.digitalocean.com/?refcode=b0877a2caebd&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="https://lucide.dev/digitalocean.svg" width="200" alt="DigitalOcean Referral Badge" /></a>
### Awesome backers 🍺
<a href="https://www.scipress.io?utm_source=lucide"><img src="https://lucide.dev/sponsors/scipress.svg" width="180" alt="Scipress sponsor badge" /></a>
<a href="https://github.com/pdfme/pdfme"><img src="https://lucide.dev/sponsors/pdfme.svg" width="180" alt="pdfme sponsor badge" /></a>

View File

@@ -0,0 +1,79 @@
{
"name": "@lucide/svelte",
"description": "A Lucide icon library package for Svelte applications",
"version": "0.1.0",
"license": "ISC",
"homepage": "https://lucide.dev",
"bugs": "https://github.com/lucide-icons/lucide/issues",
"repository": {
"type": "git",
"url": "https://github.com/lucide-icons/lucide.git",
"directory": "packages/svelte"
},
"keywords": [
"Lucide",
"Svelte",
"Feather",
"Icons",
"Icon",
"SVG",
"Feather Icons",
"Fontawesome",
"Font Awesome"
],
"author": "Eric Fennis",
"type": "module",
"main": "dist/lucide-svelte.js",
"exports": {
".": {
"types": "./dist/lucide-svelte.d.ts",
"svelte": "./dist/lucide-svelte.js",
"default": "./dist/lucide-svelte.js"
},
"./icons": {
"types": "./dist/lucide-svelte.d.ts",
"svelte": "./dist/lucide-svelte.js"
},
"./icons/*": {
"types": "./dist/icons/*.svelte.d.ts",
"svelte": "./dist/icons/*.js",
"default": "./dist/icons/*.js"
}
},
"typings": "dist/lucide-svelte.d.ts",
"sideEffects": false,
"files": [
"dist"
],
"scripts": {
"build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:package && pnpm build:license",
"copy:license": "cp ../../LICENSE ./LICENSE",
"clean": "rm -rf dist stats ./src/icons/*.{ts,svelte} ./src/aliases/{aliases,prefixed,suffixed}.ts",
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --exportFileName=index.ts --iconFileExtension=.svelte --importImportFileExtension=.svelte --separateIconFileExport --separateIconFileExportExtension=.ts --withAliases --aliasesFileExtension=.ts --separateAliasesFile --separateAliasesFileExtension=.ts --aliasImportFileExtension=.js --pretty=false",
"build:package": "svelte-package --input ./src",
"build:license": "node ./scripts/appendBlockComments.mjs",
"test": "pnpm copy:license && pnpm build:icons && vitest run",
"test:watch": "vitest watch",
"version": "pnpm version --git-tag-version=false"
},
"devDependencies": {
"@lucide/build-icons": "workspace:*",
"@lucide/helpers": "workspace:*",
"@sveltejs/package": "^2.3.10",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@testing-library/jest-dom": "^6.1.4",
"@testing-library/svelte": "^5.2.7",
"@tsconfig/svelte": "^5.0.4",
"jest-serializer-html": "^7.1.0",
"jsdom": "^20.0.3",
"svelte": "^5.20.5",
"svelte-check": "^4.1.4",
"svelte-preprocess": "^6.0.3",
"typescript": "^5.1.6",
"vite": "6.0.7",
"vitest": "^1.1.1"
},
"peerDependencies": {
"svelte": "^5"
}
}

View File

@@ -0,0 +1,64 @@
import { lstatSync } from 'fs';
import { readdir, readFile, writeFile } from 'fs/promises';
import path from 'path';
import { getCurrentDirPath } from '@lucide/helpers';
import { getJSBanner } from './license.mjs';
const currentDir = getCurrentDirPath(import.meta.url);
const targetDirectory = path.join(currentDir, '../dist');
const files = await readdir(targetDirectory, {
recursive: true,
encoding: 'utf-8',
});
// eslint-disable-next-line no-restricted-syntax
for (const file of files) {
const filepath = path.join(targetDirectory, file);
const filestat = lstatSync(filepath);
// eslint-disable-next-line no-continue
if (filestat.isFile() === false || filestat.isDirectory()) continue;
// eslint-disable-next-line no-await-in-loop
const contents = await readFile(filepath, { encoding: 'utf-8' });
let newContents = contents;
const ext = path.extname(filepath);
let license;
if (/\.(js|mjs|cjs|ts)/.test(ext)) {
license = getJSBanner();
}
if (license) {
newContents = license + contents;
}
// Places icon block comment at the top of the Svelte component class
if (/icons\/(.*?)\.svelte\.d\.ts/.test(filepath)) {
const svelteFilepath = filepath.replace('.d.ts', '');
// eslint-disable-next-line no-await-in-loop
const svelteFileContents = await readFile(svelteFilepath, { encoding: 'utf-8' });
const blockCommentRegex = /\/\*\*\n\s\*\s(@component\s@name)[\s\S]*?\*\//;
const blockCommentMatch = blockCommentRegex.exec(svelteFileContents);
if (blockCommentMatch !== null) {
const blockComment = blockCommentMatch[0];
const exportClassRegex = /export default class (\w+) extends SvelteComponentTyped<(.*?)> {/;
if (exportClassRegex.test(newContents)) {
newContents = newContents.replace(
exportClassRegex,
`${blockComment}\nexport default class $1 extends SvelteComponentTyped<$2> {`,
);
}
}
}
if (newContents !== contents) {
// eslint-disable-next-line no-await-in-loop
await writeFile(filepath, newContents, { encoding: 'utf-8' });
}
}

View File

@@ -0,0 +1,43 @@
/* eslint-disable import/no-extraneous-dependencies */
import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs';
import { getJSBanner } from './license.mjs';
export default async ({
iconName,
children,
componentName,
getSvg,
deprecated,
deprecationReason,
}) => {
const svgContents = await getSvg();
const svgBase64 = base64SVG(svgContents);
return `\
<script lang="ts">
${getJSBanner()}
import Icon from '../Icon.svelte';
import type { IconNode, IconProps } from '../types.js';
let props: IconProps = $props();
const iconNode: IconNode = ${JSON.stringify(children)};
/**
* @component @name ${componentName}
* @description Lucide SVG icon component, renders SVG Element with children.
*
* @preview ![img](data:image/svg+xml;base64,${svgBase64}) - https://lucide.dev/icons/${iconName}
* @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
*
* @param {Object} props - Lucide icons props and any valid SVG attribute
* @returns {FunctionalComponent} Svelte component
* ${deprecated ? `@deprecated ${deprecationReason}` : ''}
*/
</script>
<Icon name="${iconName}" {...props} iconNode={iconNode}>
{@render props.children?.()}
</Icon>
`;
};

View File

@@ -0,0 +1,13 @@
import fs from 'fs';
import pkg from '../package.json' with { type: 'json' };
const license = fs.readFileSync('LICENSE', 'utf-8');
export function getJSBanner() {
return `/**
* @license ${pkg.name} v${pkg.version} - ${pkg.license}
*
* ${license.split('\n').join('\n * ')}
*/
`;
}

View File

@@ -0,0 +1,33 @@
<script lang="ts">
import defaultAttributes from './defaultAttributes';
import type { IconProps } from './types';
const {
name,
color = 'currentColor',
size = 24,
strokeWidth = 2,
absoluteStrokeWidth = false,
iconNode = [],
children,
...props
}: IconProps = $props();
</script>
<svg
{...defaultAttributes}
{...props}
width={size}
height={size}
stroke={color}
stroke-width={absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth}
class={['lucide-icon lucide', name && `lucide-${name}`, props.class]}
>
{#each iconNode as [tag, attrs]}
<svelte:element
this={tag}
{...attrs}
/>
{/each}
{@render children?.()}
</svg>

View File

@@ -0,0 +1,3 @@
export * from './aliases';
export * from './prefixed';
export * from './suffixed';

View File

@@ -0,0 +1,15 @@
import type { Attrs } from './types.js';
const defaultAttributes: Attrs = {
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',
};
export default defaultAttributes;

View File

@@ -0,0 +1 @@
Folder for generated icons

View File

@@ -0,0 +1,6 @@
export * from './icons/index';
export * as icons from './icons/index';
export * from './aliases';
export { default as defaultAttributes } from './defaultAttributes';
export * from './types';
export { default as Icon } from './Icon.svelte';

View File

@@ -0,0 +1,24 @@
import type { SVGAttributes, SvelteHTMLElements } from 'svelte/elements';
import type { Snippet } from 'svelte';
export type Attrs = SVGAttributes<SVGSVGElement>;
export type IconNode = [elementName: keyof SvelteHTMLElements, attrs: Attrs][];
export interface IconProps extends Attrs {
name?: string;
color?: string;
size?: number | string;
strokeWidth?: number | string;
absoluteStrokeWidth?: boolean;
iconNode?: IconNode;
children?: Snippet;
}
export type IconEvents = {
[evt: string]: CustomEvent<any>;
};
export type IconSlots = {
default: {};
};

Some files were not shown because too many files have changed in this diff Show More