Compare commits

...
67 Commits
Author SHA1 Message Date
Jakob GuddasandEric Fennis f8a1a76b83 feat(icons): added rose icon (#1972)
* Added icons/rose.svg

* Added icons/rose.json

* Updated icons/rose.svg

* Updated icons/rose.json

* Updated icons/rose.svg

* Updated icons/rose.json

* Updated icons/rose.svg

* Updated icons/rose.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-08-18 15:15:57 +02:00
Karsagithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Eric Fennis
bd50af7afb fix(icons): changed camera icon (#3539)
* Updated icons/camera.svg

* Updated icons/camera.json

* Updated icons/camera-off.svg

* Apply suggestion from @github-actions[bot]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-18 15:13:21 +02:00
cfabc9f608 docs(site): added official statement on brand logos in Lucide (#3541)
* docs(): added official statement on brand logos in Lucide

* docs(): fix accidental typo from adding link

* docs(): migrating some stuff to a more accessible plain language format

* Update .github/ISSUE_TEMPLATE/01_icon_request.yml

* Update .github/ISSUE_TEMPLATE/01_icon_request.yml

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

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/pull_request_template.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-18 15:11:06 +02:00
Karsa 09f98127c6 fix(icons): changed umbrella icon (#3490)
* Updated icons/umbrella.svg

* Updated icons/umbrella-off.svg

* Updated icons/umbrella.svg

* Updated icons/umbrella-off.svg
2025-08-18 15:09:45 +02:00
Jakob Guddas 867c0581af fix(license): add full text of Feather license (#3530)
* fix(license): add full text of Feather license

* Update LICENSE

* Update LICENSE
2025-08-09 05:54:10 +02:00
Eric Fennis 987edb14f8 ci(release.yml): Disable lucide-vue release (Deprecated) 2025-08-08 13:41:34 +02:00
Karsa 9db4dc7e1c feat(icons): added brick-wall-shield icon (#3476)
* Added icons/brick-wall-shield.svg

* Added icons/brick-wall-shield.json
2025-08-08 10:28:41 +02:00
Jacob Padilla 2150ce75ce feat(icons): added kayak icon (#3054)
* kayak svg and json schema

* made kayak icon 1px smaller on all sides

* added jguddas as contributor

* fixed gap in kayak paddle

* indentation
2025-08-08 10:14:20 +02:00
Jakob Guddas 106e37c3ce fix: deprecate rail-symbol (#2862) 2025-08-08 10:12:40 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 528ffd6fa5 chore(deps): bump astro from 5.5.2 to 5.12.8 (#3523)
Bumps [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) from 5.5.2 to 5.12.8.
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/astro@5.12.8/packages/astro)

---
updated-dependencies:
- dependency-name: astro
  dependency-version: 5.12.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-08 09:50:44 +02:00
LieOnLionandEric Fennis 3b92fae633 fix(icons): changed mic-off icon (#2823)
* Updated icons/mic-off.svg

* Updated icons/mic-off.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-08-08 09:38:22 +02:00
Karsa fcf42bf754 Updated icons/store.svg (#3501) 2025-08-08 09:29:49 +02:00
KarsaandEric Fennis 0b6149c02d fix(icons): changed apple icon (#3505)
* Updated icons/apple.svg

* Updated icons/apple.json

* Update apple.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-08-08 09:26:35 +02:00
Karsa bc9a8de419 feat(icons): added circle-star icon (#3507)
* Added icons/circle-star.svg

* Added icons/circle-star.json

* Added icons/square-star.svg

* Added icons/square-star.json

* Update square-star.json

* Update circle-star.json
2025-08-07 12:22:36 +02:00
Jakob Guddas 26ab33a832 fix: fixed array length error in diff endpoint (#3498) 2025-08-07 11:29:21 +02:00
Karsa ac4c3581c4 fix(site): fix icon style customizer (#3511) 2025-08-07 11:26:07 +02:00
KarsaandKarsa 1ddba6da04 fix(icons): changed school icon (#2968)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/school.svg

* Update school.svg

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-08-05 17:19:48 +02:00
Karsa 8754c9b6fd fix(icons): changed spade icon (#3502)
* Updated icons/spade.svg

* Updated icons/spade.json
2025-08-05 14:31:40 +02:00
Jakob Guddas e9febe4fab docs: add rule against war/violence related imagery (#3506)
* docs: add rule against war/violence related imagery

* Update 01_icon_request.yml
2025-08-05 10:29:23 +02:00
Jamie Law 570f7d7e76 chore(metadata): Add tags to x icon (#3341)
Added 'ex' and 'cross' as tags
2025-08-01 13:15:17 +02:00
KarsaandKarsa 6d43b9feb3 feat(icons): added turntable icon (#3429)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Added icons/turntable.svg

* Added icons/turntable.json

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-08-01 12:30:47 +02:00
Jakob Guddas 16166f838b feat(lucide-static): include aliases in icons directory (#3368) 2025-08-01 12:21:31 +02:00
Jakob Guddas 425bcc3f3d fix(icons): arcified cake-slice icon (#3345)
* Updated icons/cake-slice.svg

* Updated icons/cake-slice.json
2025-08-01 12:19:13 +02:00
Jakob Guddas 982af91724 fix(icons): changed a-arrow-* icons (#3474)
* Updated icons/a-arrow-up.svg

* Updated icons/a-arrow-down.svg
2025-08-01 12:09:22 +02:00
Eric Fennis a3ec4428f1 fix(lucide-vue-next): Support for kebabCase props (#3477)
* Fix kebabCase Vue props

* format code

* Fix tests

* Format code
2025-08-01 11:39:49 +02:00
AbdelrahmanandEric Fennis 673e76831d fix: add extensions to imports (#2950)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-08-01 11:39:36 +02:00
KarsaandKarsa b4291576b7 fix(icons): changed hospital icon (#2969)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/hospital.svg

* Update hospital.svg

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-31 13:54:05 +02:00
Karsa 95f5ecacad fix(icons): arcified message icons & fixed optical volume (#3473)
* fix(icons): arcify message icons & fix optical volume

* fix(icons): increase optical volume of messages-square
2025-07-31 12:57:36 +02:00
Karsa ef5c1b9bdd feat(icons): added hand-fist, renamed grab to hand-grab (#1843) 2025-07-31 12:44:26 +02:00
Eric Fennis b01715ebe8 chore(docs): Update vitepress deps (#3470)
* Update vitepress

* Format code

* Update deps

* Fix build

* Update lockfile
2025-07-31 11:45:59 +02:00
Karsa 05dd5fcfde fix(icons): changed tiny heart icons (#3471)
* Updated icons/file-heart.svg

* Updated icons/folder-heart.svg

* Updated icons/calendar-heart.svg

* Updated icons/scan-heart.svg

* Updated icons/book-heart.svg

* Updated icons/book-heart.json

* Updated icons/hand-heart.svg

* Updated icons/hand-heart.json

* Updated icons/message-circle-heart.svg

* Updated icons/message-circle-heart.json

* fix(icons): revert changes made to message-circle-heart in favour of https://github.com/lucide-icons/lucide/pull/3473
2025-07-31 10:40:17 +02:00
Jakob GuddasandEric Fennis e71198d9b3 chore: icon alias improvements (#2861)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-30 16:52:50 +02:00
Jakob GuddasandEric Fennis 57714e36ea feat(SvgPreview): add features from lucide studio (#3365)
* feat(SvgPreview): add features from lucide studio

* Update docs/.vitepress/lib/SvgPreview/index.tsx

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-30 16:20:24 +02:00
Epifânio Francisco 358c9c1e80 fix(docs): update prop name from absolute-stroke-width to absoluteStrokeWidth in vue-next guide (#3322)
- Changed kebab-case to camelCase for consistency with Vue prop naming conventions
- Updated props table in lucide-vue-next documentation
2025-07-30 15:56:48 +02:00
Alex 64ddff76c5 fix: properly select icons dir for tags & error if no metadata found (#3411)
Fixes #3359
Throwing an error in readAllMetadata now to ensure this error can't happen again in the future.
The error was caused by this script being moved to a different dir, but the relative url not being updated, causing no icons to be found.
2025-07-30 11:59:46 +02:00
Jakob Guddas 31a9cdcbcc ci: add "telegram" to close-issue-with-banned-phrases (#3475) 2025-07-30 09:04:52 +02:00
Karsa 69319ee2f0 feat(icons): arcified moon icons (#3380) 2025-07-29 20:50:39 +02:00
Karsagithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Jakob Guddas
7beb3ee666 fix(icons): changed gavel icon (#3465)
* Updated icons/gavel.svg

* Updated icons/gavel.json

* Update icons/gavel.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-29 19:16:31 +02:00
Eric Fennis 396d6d42ce ci(suggest-tags): Switch to github.event.pull_request.head.sha 2025-07-29 16:19:30 +02:00
Eric Fennis 37a60eefb2 ci: Switch to $GITHUB_SHA 2025-07-29 16:11:08 +02:00
c2c46b21ed fix(icons): changed mails, tags, files, file-stack, book-copy and folders icon (#2935)
* Updated icons/folders.svg

* Updated icons/folders.svg

* Updated icons/folders.svg

* Updated icons/folders.svg

* Updated icons/files.svg

* Updated icons/files.json

* Updated icons/mails.svg

* Updated icons/mails.json

* Updated icons/tags.svg

* Updated icons/tags.json

* Updated icons/files.svg

* Updated icons/file-stack.svg

* Updated icons/file-stack.json

* Updated icons/files.json

* Updated icons/images.svg

* Updated icons/square-stack.svg

* Updated icons/square-stack.json

* Updated icons/square-stack.svg

* Updated icons/files.svg

* Update icons/square-stack.json

* Update icons/square-stack.svg

* Updated icons/book-copy.svg

* Updated icons/tags.svg

* Updated icons/tags.svg

* Update icons/mails.svg

Co-authored-by: Karsa <contact@karsa.org>

* Update icons/folders.svg

Co-authored-by: Karsa <contact@karsa.org>

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Karsa <contact@karsa.org>
2025-07-29 09:37:58 +02:00
Karsa 0a0c8aa7e7 fix(icons): changed settings icon (#3467)
* Updated icons/settings.svg

* Updated icons/settings.json

* Updated icons/settings.svg

* Update settings.svg
2025-07-29 09:35:23 +02:00
Usama KhanandEric Fennis dc14e6ea8e feat(icons): added closed-caption icon (#2910)
* Added icons/closed-caption.svg

* Added icons/closed-caption.json

* Update closed-caption.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-29 09:28:40 +02:00
Jamie Law 1f67ef5307 fix(icons): Rounded and optically-centred flag-triangle-* icons (#3438)
* Rounded and optically-centred `flag-triangle-*` icons

* Increase size of flag
2025-07-29 09:23:43 +02:00
Jakob Guddas ff6f9a09ad Updated icons/folder-symlink.svg (#2558) 2025-07-29 09:22:54 +02:00
585b65f28f fix(icons): added rounding to heart-* icons (#3061)
* Updated icons/heart-handshake.svg

* Updated icons/heart-handshake.json

* Updated icons/heart-handshake.svg

* Updated icons/heart-handshake.svg

* Updated icons/heart-handshake.svg

* Updated icons/heart-handshake.svg

* Updated icons/heart-handshake.svg

* Updated icons/heart-handshake.svg

* Updated icons/heart.svg

* Updated icons/heart.json

* Updated icons/heart-pulse.svg

* Updated icons/heart-pulse.json

* Updated icons/heart-crack.svg

* Updated icons/heart-crack.json

* Updated icons/heart-off.svg

* Updated icons/heart-off.json

* Updated icons/heart-crack.svg

* Updated icons/heart-handshake.svg

* Updated icons/heart-minus.svg

* Updated icons/heart-minus.json

* Update icons/heart-minus.json

* Update icons/heart-minus.json

* Update icons/heart-minus.json

* Apply suggestions from code review

* Updated icons/heart-minus.svg

* Updated icons/heart-minus.svg

* Updated icons/heart-off.svg

* Updated icons/heart-plus.svg

* Updated icons/heart-plus.json

* Updated icons/heart-plus.json

* Update icons/heart-handshake.svg

Co-authored-by: Karsa <contact@karsa.org>

* Update icons/heart-handshake.svg

* Update icons/heart-crack.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Karsa <contact@karsa.org>
2025-07-29 07:31:19 +02:00
405feea8f6 fix(icons): Changed a-large-small icon (#3396)
* fix(icons): Changed a-large-small icon

* fix(icons): Changed case-sensitive icon

* fix(icons): Changed case-lower icon

* fix(icons): Changed case-upper icon

* Apply suggestions from code review

* Update .gitignore

* Update icons/a-large-small.json

* Update icons/case-upper.svg

* Update icons/case-upper.svg

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Karsa <contact@karsa.org>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-28 17:08:39 +02:00
KarsaandKarsa 5931a4a227 fix(icons): changed sailboat icon (#3460)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/sailboat.svg

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 15:59:58 +02:00
Zlendy d3bafc2848 fix(docs): Icon Component Example for Svelte 5 does not compile (#3416) 2025-07-28 15:58:31 +02:00
KarsaandKarsa a6f4a08bda fix(icons): changed wrench icon (#3459)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/wrench.svg

* Updated icons/wrench.json

* Updated icons/pickaxe.svg

* Updated icons/gavel.svg

* Updated icons/hammer.svg

* Updated icons/hammer.json

* Updated icons/pickaxe.svg

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 15:57:03 +02:00
5a93aff903 feat(icons): added handbag icon (#3298)
* Added icons/handbag.svg

* Added icons/handbag.json

* Update handbag.json

Added extra tags

* Fix trailing comma

* Update icons/handbag.svg

Co-authored-by: Karsa <contact@karsa.org>

* Update handbag.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Karsa <contact@karsa.org>
2025-07-28 15:56:37 +02:00
e6c50d543b feat(icons): added clipboard-clock icon (#3427)
* Added icons/clipboard-clock.svg

* Added icons/clipboard-clock.json

* Flip clock side

Co-authored-by: Karsa <contact@karsa.org>

* Add contributors

Co-authored-by: Karsa <contact@karsa.org>

* Extend use cases

Co-authored-by: Karsa <contact@karsa.org>

* Update icons/clipboard-clock.json

* Remove duplicated tag

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>

---------

Co-authored-by: Karsa <contact@karsa.org>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-28 15:51:52 +02:00
Karsa 0d7c70cab6 fix(icons): changed user-star icon (#3464)
* Updated icons/user-star.svg

* Updated icons/user-star.json

* Update user-star.json
2025-07-28 15:51:29 +02:00
Martin VítekandEric Fennis 379d1b1002 feat(icons): added user-star icon (#3331)
* Added icons/user-star.svg

* Added icons/user-star.json

* enlarge star in user-star icon

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-28 15:07:27 +02:00
7d6998941d feat(icons): added map-minus icon (#3259)
* Added icons/map-minus.svg

* Added icons/map-minus.json

* Update icons/map-minus.svg

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

* Update icons/map-minus.json

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

* Update icons/map-minus.json

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-28 14:59:25 +02:00
Eric Fennis 667bb8034d fix(icons): Rename location-edit to map-pin-pencil (#3462)
* Rename `location-edit` to `map-pin-pencil`

* Updated "aliases" object
2025-07-28 14:51:16 +02:00
KarsaandKarsa fd9c489d7a fix(icons): changed castle icon (#2972)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/castle.svg

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 13:57:04 +02:00
KarsaandKarsa acb0e37ac2 fix(icons): changed shovel icon (#3458)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/shovel.svg

* Updated icons/shovel.json

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 13:46:09 +02:00
KarsaandKarsa 6c25cbee67 feat(icons): added hat-glasses icon (#3431)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Added icons/hat-glasses.svg

* Added icons/hat-glasses.json

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 10:41:43 +02:00
Jamie Law 08121af31e fix(icons): arcify arrow-big- icons (#3356)
* fix(icons): arcify `arrow-big-` icons

* give correct attribution

* shorten stems of `arrow-big-*-dash` icons
2025-07-28 10:30:59 +02:00
KarsaandKarsa 2d484469cd fix(icons): changed sparkles icon (#3426)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/sparkle.svg

* Updated icons/sparkles.svg

* Updated icons/sparkles.json

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 10:24:37 +02:00
KarsaandJakob Guddas f66d167ead fix(icons): arcified playback icons (#3425)
* fix(icons): arcified playback icons

* fix(icons): fix file-play name & file-video-2 => file-video-camera

* fix(icons): add `stop` tags to square

* fix(icons): fix lines on skip icons

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2025-07-28 10:17:44 +02:00
Jamie Law c63e5a456e fix(icons): changed sprout icon (#3430)
* Updated icons/sprout.svg

* Updated icons/sprout.json

* Add a bend to the sprout stalk

* Add rounding to the leaf tip
2025-07-28 10:11:49 +02:00
KarsaandKarsa aac12f991a fix(icons): changed croissant icon (#3428)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/croissant.svg

---------

Co-authored-by: Karsa <karsa@karsa.org>
2025-07-28 10:11:12 +02:00
Jamie Law 3844a4b346 Refine refresh-ccw-dot to match other refresh- icons (#3437)
Also update attributions to include contributors to `refresh-ccw`, ignoring optimisations
2025-07-28 10:10:41 +02:00
98b43826a4 fix(icons): changed gem icon (#3442)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Updated icons/gem.svg

* Updated icons/gem.json

* Update gem.svg

* Update gem.svg

* Update gem.json

---------

Co-authored-by: Karsa <karsa@karsa.org>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2025-07-28 10:10:14 +02:00
Jakob Guddas e8194cbabe fix(icons): changed lasso icon (#3454)
* Updated icons/lasso.svg

* Updated icons/lasso.json
2025-07-28 09:57:12 +02:00
445 changed files with 5244 additions and 2154 deletions
+6 -4
View File
@@ -7,8 +7,10 @@ body:
value: |
Before submitting an icon request check if it has already been requested. If there is an open request, please add a 👍.
**Important note**: No new brand logos are allowed, see https://github.com/lucide-icons/lucide/issues/670.
Existing brand icons will also be phased out. For brand icons, consider using https://simpleicons.org, which offers purpose-built SVGs that are also on a 24×24px grid.
> [!CAUTION]
> New brand logos are **not** allowed, see our official statement: https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md.
>
> Existing brand icons are being phased out. Consider using https://simpleicons.org, which offers purpose-built SVGs that are also on a 24×24px grid.
- type: input
id: name
attributes:
@@ -41,9 +43,9 @@ body:
required: true
- label: I have searched existing icons to make sure it does not already exist and I didn't find any.
required: true
- label: I am not requesting a brand logo and the art is not protected by copyright.
- label: I am not requesting a brand logo and the art is not protected by copyright, see more at https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md
required: true
- label: I am not requesting an icon that includes religious, political imagery or hate symbols.
- label: I am not requesting an icon that includes religious, war/violence related, political imagery or hate symbols.
required: true
- label: I have provided appropriate use cases for the icon(s) requested.
required: true
+4 -2
View File
@@ -25,10 +25,12 @@ Common scopes: icons, docs, studio, site, dev
### Concept <!-- ONLY for new icons -->
<!-- All of these requirements must be fulfilled. -->
<!-- IMPORTANT! Please read our official statement on brand logos in Lucide: -->
<!-- https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md -->
- [ ] I have provided valid use cases for each icon.
- [ ] I have not added any a brand or logo icon.
- [ ] I have [not added any brand or logo icon](https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md).
- [ ] I have not used any hate symbols.
- [ ] I have not included any religious or political imagery.
- [ ] I have not included any religious, war/violence related or political imagery.
### Author, credits & license<!-- ONLY for new icons. -->
<!-- Please choose one of the following, and put an "x" next to it. -->
@@ -16,7 +16,7 @@ jobs:
- name: Check for blocked phrases in issue title
run: |
ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH")
BLOCKED_PHRASES=("twitter" "whatsapp" "logo" "google" "tiktok" "facebook" "slack" "discord" "bluesky" "spotify" "behance" "pix" "x.com")
BLOCKED_PHRASES=("twitter" "whatsapp" "logo" "google" "tiktok" "facebook" "slack" "discord" "bluesky" "spotify" "behance" "pix" "x.com" "telegram")
# Check title and body for blocked phrases
for PHRASE in "${BLOCKED_PHRASES[@]}"
@@ -33,5 +33,5 @@ jobs:
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
PULL_REQUEST_NUMBER: ${{ github.event.number }}
COMMIT_SHA: ${{ github.sha }}
COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-1
View File
@@ -48,7 +48,6 @@ jobs:
'lucide',
'lucide-react',
'lucide-react-native',
'lucide-vue',
'lucide-vue-next',
'lucide-angular',
'lucide-preact',
+71
View File
@@ -0,0 +1,71 @@
# Our Official Stance on Including Brand Logos in Lucide
## TL;DR
Lucide **does not accept** brand logos, and we do not plan to add them in the future.
This is due to a combination of **legal restrictions**, **design consistency concerns**, and **practical maintenance reasons**.
If you need brand logos, we recommend [Simple Icons](https://simpleicons.org/), which provides an extensive, legally safer collection of brand marks.
---
## 1. Historical Context
This is not a new debate — other icon sets have gone through the same discussion:
- **Material Design Icons** [deprecated all brand icons](https://github.com/Templarian/MaterialDesign/issues/6602) because they didn't fit the style, didn't work well in one color, and often looked out of place in a 24×24px grid.
- **Feather Icons** [came to the same conclusion](https://github.com/feathericons/feather/issues/763): brand logos have their own style, and forcing them into another inevitably leads to aesthetic compromises.
- **Lucide** learned from these examples — we'd rather focus on making a consistent set of non-brand icons that all work together.
## 2. Legal Considerations
Most brand logos:
- Are **protected by trademark or copyright**.
- Have **strict rules** for how they can be used (colors, spacing, proportions, etc.).
- **Don't allow modification** — but we'd have to change them to fit Lucide's style.
This means adding them could:
1. Break copyright or trademark law.
2. Make both you and the Lucide project legally responsible.
3. Force us to review every new request one by one for legal issues — something we simply can't do.
> **Note:** Simple Icons avoids this by keeping logos exactly as the brand provides them — though even they sometimes face [legal challenges](https://github.com/simple-icons/simple-icons/issues/11236).
## 3. Design & Consistency
Lucide is all about **visual consistency**.
Adding brand logos would:
- Break [our own design rules](https://lucide.dev/guide/design/icon-design-guide#icon-design-principles) for shapes, proportions, and stroke.
- Mix two fundamentally different categories of graphics (pictograms vs. corporate logos).
- Create a library where a subset of icons will always look "out of place".
If the logos are not in Lucide's style, why include them in Lucide at all? Better to use them from a dedicated brand icon source.
## 4. Maintenance Burden
Even with our current **"no brand icon requests"** policy, people still request them regularly.
Having any brand icons in the set:
- Makes people think we might add more in the future.
- Leads to repeated requests and the same conversations over and over.
- Wastes maintainer time redirecting people to the same explanation.
Removing them entirely solves this problem.
## 5. Recommended Alternatives
If you need brand icons, try:
- [Simple Icons](https://simpleicons.org/): offers a huge range of brands, in consistent SVG format, using a 24×24 viewBox, the same as ours.
- Official brand asset pages: most major companies provide downloadable SVGs.
You can use these alongside Lucide without bloating our core library.
## Final Words
Lucide is an **icon** set, not a **logo** set.
Logos belong in dedicated logo resources.
We're focusing on what Lucide does best: providing a clean, cohesive, and legally safe collection of open-source icons.
+25 -1
View File
@@ -1,6 +1,6 @@
ISC License
Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -13,3 +13,27 @@ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
---
The MIT License (MIT) (for portions derived from Feather)
Copyright (c) 2013-2023 Cole Bemis
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+6
View File
@@ -57,6 +57,12 @@ For more info on how to contribute please see the [contribution guidelines](http
Caught a mistake or want to contribute to the documentation? [Edit this page on Github](https://github.com/lucide-icons/lucide/blob/main/README.md)
## About brand logos
Lucide **does not accept** brand logos, and we do not plan to add them in the future. This is due to a combination of **legal restrictions**, **design consistency concerns**, and **practical maintenance reasons**.
[Click here to read our official statement about brand logos in Lucide.](./BRAND_LOGOS_STATEMENT.md)
## Community
Join the community on our [Discord](https://discord.gg/EH6nSts) server!
+19 -6
View File
@@ -13,10 +13,12 @@ export default eventHandler((event) => {
const data = pathData.at(-1).slice(0, -4);
const [name] = pathData;
const src = Buffer.from(data, 'base64')
.toString('utf8')
.replaceAll('\n', '')
.replace(/<svg[^>]*>|<\/svg>/g, '');
const src = Buffer.from(data, 'base64').toString('utf8').replaceAll('\n', '');
const width = parseInt((src.includes('<svg ') ? src.match(/width="(\d+)"/)?.[1] : null) ?? '24');
const height = parseInt(
(src.includes('<svg ') ? src.match(/height="(\d+)"/)?.[1] : null) ?? '24',
);
const children = [];
@@ -38,7 +40,7 @@ export default eventHandler((event) => {
children.push(
createElement(Backdrop, {
backdropString,
src,
src: src.replace(/<svg[^>]*>|<\/svg>/g, ''),
color: '#777',
}),
);
@@ -46,7 +48,18 @@ export default eventHandler((event) => {
const svg = Buffer.from(
// We can't use jsx here, is not supported here by nitro.
renderToString(createElement(SvgPreview, { src, showGrid: true }, children)),
renderToString(
createElement(
SvgPreview,
{
src: src.replace(/<svg[^>]*>|<\/svg>/g, ''),
height,
width,
showGrid: true,
},
children,
),
),
).toString('utf8');
defaultContentType(event, 'image/svg+xml');
@@ -17,6 +17,13 @@ export default eventHandler((event) => {
.replaceAll('\n', '')
.replace(/<svg[^>]*>|<\/svg>/g, '');
const width = parseInt(
(newSrc.includes('<svg ') ? newSrc.match(/width="(\d+)"/)?.[1] : null) ?? '24',
);
const height = parseInt(
(newSrc.includes('<svg ') ? newSrc.match(/height="(\d+)"/)?.[1] : null) ?? '24',
);
const children = [];
const oldSrc = iconNodes[name]
@@ -27,7 +34,9 @@ export default eventHandler((event) => {
const svg = Buffer.from(
// We can't use jsx here, is not supported here by nitro.
renderToString(createElement(Diff, { oldSrc, newSrc, showGrid: true }, children)),
renderToString(
createElement(Diff, { oldSrc, newSrc, showGrid: true, height, width }, children),
),
).toString('utf8');
defaultContentType(event, 'image/svg+xml');
+7
View File
@@ -36,6 +36,13 @@ export default defineConfig({
},
},
head: [
[
'link',
{
rel: 'preconnect',
href: 'https://analytics.lucide.dev',
},
],
[
'script',
{
+4 -4
View File
@@ -53,8 +53,8 @@ const Backdrop = ({
<rect
x="0"
y="0"
width="24"
height="24"
width="100%"
height="100%"
fill="#fff"
stroke="none"
/>
@@ -67,8 +67,8 @@ const Backdrop = ({
<rect
x="0"
y="0"
width="24"
height="24"
width="100%"
height="100%"
opacity={0.5}
fill={`url(#pattern-${id})`}
stroke="none"
+10 -6
View File
@@ -7,15 +7,17 @@ const SvgPreview = React.forwardRef<
{
oldSrc: string;
newSrc: string;
height: number;
width: number;
} & React.SVGProps<SVGSVGElement>
>(({ oldSrc, newSrc, children, ...props }, ref) => {
>(({ oldSrc, newSrc, children, height, width, ...props }, ref) => {
return (
<svg
ref={ref}
xmlns="http://www.w3.org/2000/svg"
width={24}
height={24}
viewBox="0 0 24 24"
width={width}
height={height}
viewBox={`0 0 ${width} ${height}`}
fill="none"
stroke="currentColor"
strokeWidth={2}
@@ -25,6 +27,8 @@ const SvgPreview = React.forwardRef<
>
<style>{darkModeCss}</style>
<Grid
width={width}
height={height}
strokeWidth={0.1}
stroke="#777"
strokeOpacity={0.3}
@@ -37,8 +41,8 @@ const SvgPreview = React.forwardRef<
<rect
x="0"
y="0"
width="24"
height="24"
width="100%"
height="100%"
fill="#000"
stroke="none"
/>
@@ -0,0 +1,137 @@
import React from 'react';
import pathToPoints from './path-to-points';
import { Path, PathProps } from './types';
export const GapViolationHighlight = ({
radius,
stroke,
strokeWidth,
strokeOpacity,
paths,
...props
}: {
paths: Path[];
} & PathProps<'stroke' | 'strokeOpacity' | 'strokeWidth', 'd'>) => {
const id = React.useId();
const groupedPaths = Object.entries(
paths.reduce(
(groups, val) => {
const key = val.c.id;
groups[key] = [...(groups[key] || []), val];
return groups;
},
{} as Record<number, Path[]>,
),
);
const groups: Group[] = [];
for (const [, paths] of groupedPaths) {
const d = paths.map((path) => path.d).join(' ');
const points = paths.flatMap((path) => pathToPoints(path));
groups.push({ id: d, points });
}
const mergedGroups = mergeGroups(groups, 2);
return (
<g {...props}>
<defs xmlns="http://www.w3.org/2000/svg">
<pattern
id={`backdrop-pattern-${id}`}
width=".1"
height=".1"
patternUnits="userSpaceOnUse"
patternTransform="rotate(45 50 50)"
>
<line
stroke={stroke}
strokeWidth={0.1}
y2={1}
/>
<line
stroke={stroke}
strokeWidth={0.1}
y2={1}
/>
</pattern>
</defs>
{mergedGroups.flatMap((ds, idx, arr) =>
arr.slice(0, idx).map((val, i) => (
<g
strokeWidth={strokeWidth}
key={i}
>
<mask
id={`svg-preview-backdrop-mask-${id}-${i}`}
maskUnits="userSpaceOnUse"
>
<path
stroke="white"
d={val.join(' ')}
/>
</mask>
<path
d={ds.join(' ')}
stroke={`url(#backdrop-pattern-${id})`}
strokeWidth={strokeWidth}
strokeOpacity={strokeOpacity}
mask={`url(#svg-preview-backdrop-mask-${id}-${i})`}
/>
</g>
)),
)}
</g>
);
};
type Point = { x: number; y: number };
type Group = { id: string; points: Point[] };
// Euclidean distance
function distance(a: Point, b: Point): number {
return Math.hypot(a.x - b.x, a.y - b.y);
}
// Check if two groups should be merged based on minimum distance
function shouldMerge(a: Group, b: Group, minDistance: number): boolean {
for (const pa of a.points) {
for (const pb of b.points) {
if (distance(pa, pb) <= minDistance) {
return true;
}
}
}
return false;
}
// Merge groups and return arrays of merged group IDs
function mergeGroups(groups: Group[], minDistance: number): string[][] {
const mergedGroups: Group[][] = groups.map((g) => [g]);
let changed = true;
while (changed) {
changed = false;
outer: for (let i = 0; i < mergedGroups.length; i++) {
for (let j = i + 1; j < mergedGroups.length; j++) {
// Check if any group in mergedGroups[i] should merge with any in mergedGroups[j]
if (
mergedGroups[i].some((ga) =>
mergedGroups[j].some((gb) => shouldMerge(ga, gb, minDistance)),
)
) {
// Merge group j into group i
mergedGroups[i] = [...mergedGroups[i], ...mergedGroups[j]];
mergedGroups.splice(j, 1);
changed = true;
break outer;
}
}
}
}
// Return only arrays of IDs
return mergedGroups.map((groupList) => groupList.map((g) => g.id));
}
+155 -90
View File
@@ -1,6 +1,7 @@
import React from 'react';
import { PathProps, Path } from './types';
import { getPaths, assert } from './utils';
import getPaths, { assert } from './utils';
import { GapViolationHighlight } from './GapViolationHighlight.tsx';
export const darkModeCss = `
@media screen and (prefers-color-scheme: light) {
@@ -20,10 +21,16 @@ export const darkModeCss = `
export const Grid = ({
radius,
fill = '#fff',
fill,
height,
width,
subGridSize = 0,
...props
}: {
height: number;
width: number;
strokeWidth: number;
subGridSize?: number;
radius: number;
} & PathProps<'stroke', 'strokeWidth'>) => (
<g
@@ -33,43 +40,53 @@ export const Grid = ({
>
<rect
className="svg-preview-grid-rect"
width={24 - props.strokeWidth}
height={24 - props.strokeWidth}
width={width - props.strokeWidth}
height={height - props.strokeWidth}
x={props.strokeWidth / 2}
y={props.strokeWidth / 2}
rx={radius}
fill={fill}
/>
<path
strokeDasharray={'0 0.1 ' + '0.1 0.15 '.repeat(11) + '0 0.15'}
strokeDasharray={
'0 0.1 ' + '0.1 0.15 '.repeat(subGridSize ? subGridSize * 4 - 1 : 95) + '0 0.15'
}
strokeWidth={0.1}
d={
props.d ||
new Array(Math.floor(24 - 1))
.fill(null)
.map((_, i) => i)
.filter((i) => i % 3 !== 2)
.flatMap((i) => [
`M${props.strokeWidth} ${i + 1}h${24 - props.strokeWidth * 2}`,
`M${i + 1} ${props.strokeWidth}v${24 - props.strokeWidth * 2}`,
])
.join('')
}
/>
<path
d={
props.d ||
new Array(Math.floor(24 - 1))
.fill(null)
.map((_, i) => i)
.filter((i) => i % 3 === 2)
.flatMap((i) => [
`M${props.strokeWidth} ${i + 1}h${24 - props.strokeWidth * 2}`,
`M${i + 1} ${props.strokeWidth}v${24 - props.strokeWidth * 2}`,
])
.join('')
[
...new Array(Math.floor(width - 1))
.fill(null)
.map((_, i) => i)
.filter((i) => !subGridSize || i % subGridSize !== subGridSize - 1)
.flatMap((i) => [`M${i + 1} ${props.strokeWidth}v${height - props.strokeWidth * 2}`]),
...new Array(Math.floor(height - 1))
.fill(null)
.map((_, i) => i)
.filter((i) => !subGridSize || i % subGridSize !== subGridSize - 1)
.flatMap((i) => [`M${props.strokeWidth} ${i + 1}h${width - props.strokeWidth * 2}`]),
].join('')
}
/>
{!!subGridSize && (
<path
d={
props.d ||
[
...new Array(Math.floor(width - 1))
.fill(null)
.map((_, i) => i)
.filter((i) => i % subGridSize === subGridSize - 1)
.flatMap((i) => [`M${i + 1} ${props.strokeWidth}v${height - props.strokeWidth * 2}`]),
...new Array(Math.floor(height - 1))
.fill(null)
.map((_, i) => i)
.filter((i) => i % subGridSize === subGridSize - 1)
.flatMap((i) => [`M${props.strokeWidth} ${i + 1}h${width - props.strokeWidth * 2}`]),
].join('')
}
/>
)}
</g>
);
@@ -99,6 +116,7 @@ const Shadow = ({
>
{groupedPaths.map(([id, paths]) => (
<mask
key={`svg-preview-shadow-mask-${id}`}
id={`svg-preview-shadow-mask-${id}`}
maskUnits="userSpaceOnUse"
strokeOpacity="1"
@@ -108,8 +126,8 @@ const Shadow = ({
<rect
x={0}
y={0}
width={24}
height={24}
width="100%"
height="100%"
fill="#fff"
stroke="none"
rx={radius}
@@ -152,30 +170,34 @@ const ColoredPath = ({
colors,
paths,
...props
}: { paths: Path[]; colors: string[] } & PathProps<never, 'd' | 'stroke'>) => (
<g
className="svg-preview-colored-path-group"
{...props}
>
{paths.map(({ d, c }, i) => (
<path
key={i}
d={d}
stroke={colors[(c.name === 'path' ? i : c.id) % colors.length]}
/>
))}
</g>
);
}: { paths: Path[]; colors: string[] } & PathProps<never, 'd' | 'stroke'>) => {
let idx = 0;
return (
<g
className="svg-preview-colored-path-group"
{...props}
>
{paths.map(({ d, c }, i) => (
<path
key={i}
d={d}
stroke={colors[(c.name === 'path' ? idx++ : c.id) % colors.length]}
/>
))}
</g>
);
};
const ControlPath = ({
paths,
radius,
pointSize,
...props
}: { pointSize: number; paths: Path[]; radius: number } & PathProps<
'stroke' | 'strokeWidth',
'd'
>) => {
}: {
pointSize: number;
paths: Path[];
radius: number;
} & PathProps<'stroke' | 'strokeWidth', 'd'>) => {
const controlPaths = paths.map((path, i) => {
const element = paths.filter((p) => p.c.id === path.c.id);
const lastElement = element.at(-1)?.next;
@@ -207,8 +229,8 @@ const ControlPath = ({
<rect
x="0"
y="0"
width="24"
height="24"
width="100%"
height="100%"
fill="#fff"
stroke="none"
rx={radius}
@@ -243,7 +265,7 @@ const ControlPath = ({
)
.join('')}
/>
{controlPaths.map(({ d, prev, next, startMarker, endMarker }, i) => (
{controlPaths.map(({ prev, next, startMarker, endMarker }, i) => (
<React.Fragment key={i}>
{startMarker && (
<circle
@@ -279,11 +301,37 @@ const Radii = ({
{...props}
>
{paths.map(
({ c, prev, next, circle }, i) =>
({ circle, next, prev, c }, i) =>
circle && (
<React.Fragment key={i}>
{c.name !== 'circle' && (
<path d={`M${prev.x} ${prev.y} ${circle.x} ${circle.y} ${next.x} ${next.y}`} />
{circle.tangentIntersection && c.name === 'path' && (
<>
<circle
cx={next.x * 2 - circle.tangentIntersection.x}
cy={next.y * 2 - circle.tangentIntersection.y}
r={0.25}
/>
<circle
cx={prev.x * 2 - circle.tangentIntersection.x}
cy={prev.y * 2 - circle.tangentIntersection.y}
r={0.25}
/>
<path
d={`M${next.x * 2 - circle.tangentIntersection.x} ${
next.y * 2 - circle.tangentIntersection.y
}L${circle.tangentIntersection.x} ${circle.tangentIntersection.y}L${prev.x * 2 - circle.tangentIntersection.x} ${
prev.y * 2 - circle.tangentIntersection.y
}`}
/>
<circle
cx={circle.tangentIntersection.x}
cy={circle.tangentIntersection.y}
r={0.25}
/>
</>
)}
{c.name === 'path' && (
<path d={`M${next.x} ${next.y}L${circle.x} ${circle.y}L${prev.x} ${prev.y}`} />
)}
<circle
cy={circle.y}
@@ -313,55 +361,60 @@ const Radii = ({
const Handles = ({
paths,
...props
}: { paths: Path[] } & PathProps<
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
any
>) => {
return (
<g
className="svg-preview-handles-group"
{...props}
>
{paths.map(({ c, prev, next, cp1, cp2 }) => (
<>
{cp1 && <path d={`M${prev.x} ${prev.y} ${cp1.x} ${cp1.y}`} />}
{cp1 && (
<circle
cy={cp1.y}
cx={cp1.x}
r={0.25}
/>
)}
{cp2 && <path d={`M${next.x} ${next.y} ${cp2.x} ${cp2.y}`} />}
{cp2 && (
<circle
cy={cp2.y}
cx={cp2.x}
r={0.25}
/>
)}
</>
))}
</g>
);
};
}: { paths: Path[] } & PathProps<'strokeWidth' | 'stroke' | 'strokeOpacity', any>) => (
<g
className="svg-preview-handles-group"
{...props}
>
{paths.map(({ c, prev, next, cp1, cp2 }, i) => (
<React.Fragment key={i}>
{cp1 && <path d={`M${prev.x} ${prev.y} ${cp1.x} ${cp1.y}`} />}
{cp1 && (
<circle
cy={cp1.y}
cx={cp1.x}
r={0.25}
/>
)}
{cp2 && <path d={`M${next.x} ${next.y} ${cp2.x} ${cp2.y}`} />}
{cp2 && (
<circle
cy={cp2.y}
cx={cp2.x}
r={0.25}
/>
)}
</React.Fragment>
))}
</g>
);
const SvgPreview = React.forwardRef<
SVGSVGElement,
{
height?: number;
width?: number;
src: string | ReturnType<typeof getPaths>;
showGrid?: boolean;
} & React.SVGProps<SVGSVGElement>
>(({ src, children, showGrid = false, ...props }, ref) => {
>(({ src, children, height = 24, width = 24, showGrid = false, ...props }, ref) => {
const subGridSize =
Math.max(height, width) % 3 === 0
? Math.max(height, width) > 24
? 12
: 3
: Math.max(height, width) % 5 === 0
? 5
: 0;
const paths = typeof src === 'string' ? getPaths(src) : src;
return (
<svg
ref={ref}
xmlns="http://www.w3.org/2000/svg"
width={24}
height={24}
viewBox="0 0 24 24"
width={width}
height={height}
viewBox={`0 0 ${width} ${height}`}
fill="none"
stroke="currentColor"
strokeWidth={2}
@@ -372,8 +425,12 @@ const SvgPreview = React.forwardRef<
<style>{darkModeCss}</style>
{showGrid && (
<Grid
height={height}
width={width}
subGridSize={subGridSize}
strokeWidth={0.1}
stroke="#777"
mask="url(#svg-preview-bounding-box-mask)"
strokeOpacity={0.3}
radius={1}
/>
@@ -385,6 +442,12 @@ const SvgPreview = React.forwardRef<
radius={1}
strokeOpacity={0.15}
/>
<GapViolationHighlight
paths={paths}
stroke="red"
strokeOpacity={0.75}
strokeWidth={4}
/>
<Handles
paths={paths}
strokeWidth={0.12}
@@ -433,4 +496,6 @@ const SvgPreview = React.forwardRef<
);
});
SvgPreview.displayName = 'SvgPreview';
export default SvgPreview;
@@ -0,0 +1,19 @@
import memoize from 'lodash/memoize';
import SVGPathCommander from 'svg-path-commander';
import { Path } from './types';
function pathToPoints({ d, prev, next }: Path, interval = 1) {
const commander = new SVGPathCommander(d);
const points = [];
try {
const totalLength = commander.getTotalLength();
points.push(prev);
for (let i = interval; i < totalLength - interval; i += interval) {
points.push(commander.getPointAtLength(i));
}
points.push(next);
} catch (err) {}
return points;
}
export default memoize(pathToPoints);
+61 -6
View File
@@ -1,7 +1,10 @@
import { INode, parseSync } from 'svgson';
// @ts-ignore
import toPath from 'element-to-path';
// @ts-ignore
import { SVGPathData, encodeSVGPath } from 'svg-pathdata';
import { Path, Point } from './types';
import memoize from 'lodash/memoize';
function assertNever(x: never): never {
throw new Error('Unknown type: ' + x['type']);
@@ -44,17 +47,21 @@ const extractNodes = (node: INode): INode[] => {
return [];
};
export const getNodes = (src: string) =>
extractNodes(parseSync(src.includes('<svg') ? src : `<svg>${src}</svg>`));
export const getNodes = memoize((src: string) =>
extractNodes(parseSync(src.includes('<svg') ? src : `<svg>${src}</svg>`)),
);
export const getCommands = (src: string) =>
getNodes(src)
.map(convertToPathNode)
.flatMap(({ d, name }, idx) =>
new SVGPathData(d).toAbs().commands.map((c, cIdx) => ({ ...c, id: idx, idx: cIdx, name })),
new SVGPathData(d)
.toAbs()
// @ts-ignore
.commands.map((c, cIdx) => ({ ...c, id: idx, idx: cIdx, name })),
);
export const getPaths = (src: string) => {
const getPaths = (src: string) => {
const commands = getCommands(src.includes('<svg') ? src : `<svg>${src}</svg>`);
const paths: Path[] = [];
let prev: Point | undefined = undefined;
@@ -237,6 +244,7 @@ export const getPaths = (src: string) => {
break;
}
default: {
// @ts-ignore
assertNever(c);
}
}
@@ -244,7 +252,7 @@ export const getPaths = (src: string) => {
return paths;
};
export const arcEllipseCenter = (
const arcEllipseCenter = (
x1: number,
y1: number,
rx: number,
@@ -296,5 +304,52 @@ export const arcEllipseCenter = (
M2[1][0] * Cp[0] + M2[1][1] * Cp[1] + V3[1],
];
return { x: C[0], y: C[1] };
return {
x: C[0],
y: C[1],
tangentIntersection: intersectTangents(
{ x: x1, y: y1 },
{ x: x2, y: y2 },
{ x: C[0], y: C[1] },
),
};
};
function getTangentDirection(p: Point, center: Point): Point {
// Tangent is perpendicular to the radius vector (rotate radius 90°)
const dx = p.x - center.x;
const dy = p.y - center.y;
return { x: -dy, y: dx }; // 90° rotation
}
function intersectTangents(start: Point, end: Point, center: Point): Point | null {
const t1 = getTangentDirection(start, center);
const t2 = getTangentDirection(end, center);
// Solve: start + λ * t1 = end + μ * t2
const A = [
[t1.x, -t2.x],
[t1.y, -t2.y],
];
const b = [end.x - start.x, end.y - start.y];
// Compute determinant
const det = A[0][0] * A[1][1] - A[0][1] * A[1][0];
if (Math.abs(det) < 1e-10) {
// Lines are parallel, no intersection
return null;
}
const invDet = 1 / det;
const lambda = (b[0] * A[1][1] - b[1] * A[0][1]) * invDet;
// Intersection point = start + lambda * t1
return {
x: start.x + lambda * t1.x,
y: start.y + lambda * t1.y,
};
}
export default memoize(getPaths);
@@ -178,6 +178,8 @@ const DiamondIcon = createLucideIcon('Diamond', diamond)
stroke-width: var(--customize-strokeWidth, 2);
width: calc(var(--customize-size, 24) * 1px);
height: calc(var(--customize-size, 24) * 1px);
max-width: 3rem;
max-height: 3rem;
}
html.absolute-stroke-width .lucide-icon.customizable {
@@ -26,10 +26,9 @@ const iconComponent = computed(() => {
<component
ref="previewIcon"
:is="iconComponent"
:width="size"
:height="size"
:stroke="color"
:stroke-width="absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth"
:size="size"
:color="color"
:strokeWidth="absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth"
/>
<svg class="icon-grid" :viewBox="`0 0 ${size} ${size}`" fill="none" stroke-width="0.1" xmlns="http://www.w3.org/2000/svg">
<g :key="`grid-${i}`" v-for="(_, i) in gridLines">
@@ -110,7 +110,7 @@ const customizingActive = computed(() => {
name="size"
v-model="size"
:min="16"
:max="48"
:max="256"
:step="4"
/>
</InputField>
@@ -2,7 +2,7 @@
import { ref, inject, Ref } from 'vue';
export const ICON_STYLE_CONTEXT = Symbol('size');
export const ICON_STYLE_CONTEXT = Symbol('style');
interface IconSizeContext {
size: Ref<number>;
+2 -40
View File
@@ -25,6 +25,7 @@
--vp-code-editor-string: #032f62;
--vp-c-text-4: rgba(60, 60, 67, 0.32);
--vp-home-hero-name-color: var(--vp-c-text);
}
.dark {
@@ -60,36 +61,15 @@
.VPHomeHero .image-container {
transform: none;
width: 100%;
/* padding: 0 24px; */
}
/* .VPHomeHero .container {
flex-direction: column-reverse;
} */
.VPHomeHero .container .main {
/* flex:1; */
flex-shirk: 0;
}
.VPHomeHero .container .main h1.name {
color: var(--vp-c-text);
}
.VPHomeHero .container .main h1.name .clip {
color: inherit;
-webkit-text-fill-color: unset;
color: var(--vp-c-text);
font-size: 36px;
}
.VPHomeHero .container .main h1::first-line {
.VPHomeHero .name::first-line {
color: var(--vp-c-brand);
}
/* */
.VPHomeHero .container .image {
margin: 0;
order: 2;
/* flex: 1; */
margin-top: 32px;
}
@@ -98,10 +78,6 @@
justify-content: flex-end;
}
.VPHomeHero .container .image-bg {
display: none;
}
.VPFeature .icon {
background-color: var(--vp-c-bg);
}
@@ -115,12 +91,6 @@
padding-left: 0;
}
@media (min-width: 640px) {
.VPHomeHero .container .main h1.name .clip {
font-size: unset;
}
}
@media (min-width: 960px) {
.VPHomeHero .container .image {
order: 1;
@@ -140,18 +110,11 @@
.VPHomeHero .container .image-container {
display: block;
}
.VPHomeHero .container .main h1.name {
}
}
.VPNavBarHamburger .container > span {
border-radius: 2px;
}
/*
html:has(* .outline-link:target) {
scroll-behavior: smooth;
} */
.sp-wrapper + * {
margin-top: 24px;
@@ -183,7 +146,6 @@ html:has(* .outline-link:target) {
font-size: 14px;
font-weight: 500;
position: relative;
/* box-sizing: content-box; */
}
.sp-wrapper .sp-tabs .sp-tab-button:after {
+1 -1
View File
@@ -296,7 +296,7 @@ The example below imports all ES Modules, so exercise caution when using it. Imp
```svelte [Svelte 5]
<script>
import * as icons from '@lucide/svelte';
let { name } = $props();
let { name, ...props } = $props();
const Icon = icons[name];
</script>
+1 -1
View File
@@ -54,7 +54,7 @@ import { Camera } from 'lucide-vue-next';
| `size` | *number* | 24 |
| `color` | *string* | currentColor |
| `stroke-width` | *number* | 2 |
| `absolute-stroke-width` | *boolean* | false |
| `absoluteStrokeWidth` | *boolean* | false |
| `default-class` | *string* | lucide-icon |
### Applying props
+1 -1
View File
@@ -60,7 +60,7 @@ Additional props can be passed to adjust the icon:
| `size` | *number* | 24 |
| `color` | *string* | currentColor |
| `stroke-width` | *number* | 2 |
| `absolute-stroke-width` | *boolean* | false |
| `absoluteStrokeWidth` | *boolean* | false |
| `default-class` | *string* | lucide-icon |
### Applying props
+1
View File
@@ -2,6 +2,7 @@ import copy from 'rollup-plugin-copy';
import replace from '@rollup/plugin-replace';
export default defineNitroConfig({
compatibilityDate: '2025-07-30',
preset: 'vercel_edge',
srcDir: '.vitepress',
routeRules: {
+5 -5
View File
@@ -28,12 +28,12 @@
"@lucide/build-icons": "workspace:*",
"@lucide/helpers": "workspace:*",
"@lucide/shared": "workspace:*",
"@rollup/plugin-replace": "^6.0.1",
"@rollup/plugin-replace": "^6.0.2",
"@types/semver": "^7.5.3",
"h3": "^1.8.0",
"nitropack": "2.8.1",
"rollup-plugin-copy": "^3.4.0",
"vitepress": "^1.3.1"
"rollup-plugin-copy": "^3.5.0",
"vitepress": "^1.6.3",
"svg-path-commander": "^2.1.11"
},
"dependencies": {
"@floating-ui/vue": "^1.0.3",
@@ -57,6 +57,6 @@
"sitemap": "^7.1.1",
"svg-pathdata": "^6.0.3",
"svgson": "^5.2.1",
"vue": "^3.5.13"
"vue": "^3.5.18"
}
}
+1 -4
View File
@@ -21,10 +21,7 @@ const MAX_RELATED_ICONS = 4 * 17; // grid of 4x17 icons, = 68 icons
const arrayMatches = (a, b) => a.filter((item) => b.includes(item)).length;
const nameParts = (icon) =>
[
icon.name,
...(icon.aliases?.map((alias) => (typeof alias === 'string' ? alias : alias.name)) ?? []),
]
[icon.name, ...(icon.aliases?.map((alias) => alias.name) ?? [])]
.join('-')
.split('-')
.filter((word) => word.length > 2);
+7 -9
View File
@@ -159,16 +159,14 @@ try {
const aliases = iconMetaData.aliases ?? [];
if (aliases.length) {
aliases
.map((alias) => (typeof alias === 'string' ? alias : alias.name))
.forEach((alias) => {
if (!(alias in newReleaseMetaData)) {
return;
}
aliases.forEach((alias) => {
if (!(alias.name in newReleaseMetaData)) {
return;
}
contents.createdRelease =
newReleaseMetaData[alias].createdRelease ?? defaultReleaseMetaData.createdRelease;
});
contents.createdRelease =
newReleaseMetaData[alias.name].createdRelease ?? defaultReleaseMetaData.createdRelease;
});
}
const output = JSON.stringify(contents, null, 2);
+1 -3
View File
@@ -11,9 +11,7 @@ const iconMetaData = await getIconMetaData(path.resolve(scriptDir, '../../icons'
const iconAliasesRedirectRoutes = Object.entries(iconMetaData)
.filter(([, { aliases }]) => aliases?.length)
.map(([iconName, { aliases }]) => {
aliases = aliases.map((alias) => (typeof alias === 'object' ? alias.name : alias));
const aliasRouteMatches = aliases.join('|');
const aliasRouteMatches = aliases.map((alias) => alias.name).join('|');
return {
src: `/icons/${aliasRouteMatches}`,
+23 -24
View File
@@ -21,32 +21,29 @@
"aliases": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": ["name"],
"properties": {
"name": {
"type": "string"
},
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"deprecated": {
"const": true
},
"deprecationReason": {
"$ref": "#/$defs/aliasDeprecationReasons"
},
"toBeRemovedInVersion": {
"$ref": "#/$defs/versionNumber",
"description": "The version this icon will be removed in."
}
},
"dependentRequired": {
"deprecated": ["deprecationReason", "toBeRemovedInVersion"]
}
"deprecated": {
"const": true
},
"deprecationReason": {
"$ref": "#/$defs/aliasDeprecationReasons"
},
"toBeRemovedInVersion": {
"$ref": "#/$defs/versionNumber",
"description": "The version this icon will be removed in."
}
]
},
"dependentRequired": {
"deprecated": ["deprecationReason", "toBeRemovedInVersion"],
"deprecationReason": ["deprecated"],
"toBeRemovedInVersion": ["deprecated"]
}
},
"uniqueItems": true
},
@@ -130,7 +127,9 @@
}
},
"dependentRequired": {
"deprecated": ["deprecationReason", "toBeRemovedInVersion"]
"deprecated": ["deprecationReason", "toBeRemovedInVersion"],
"deprecationReason": ["deprecated"],
"toBeRemovedInVersion": ["deprecated"]
},
"$defs": {
"iconDeprecationReasons": {
+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3.5 13h6" />
<path d="m2 16 4.5-9 4.5 9" />
<path d="M18 7v9" />
<path d="m14 12 4 4 4-4" />
</svg>
<path d="M18 16V7" />
<path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" />
<path d="M3.304 13h6.392" />
</svg>

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 349 B

+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3.5 13h6" />
<path d="m2 16 4.5-9 4.5 9" />
<path d="M18 16V7" />
<path d="m14 11 4-4 4 4" />
</svg>
<path d="M18 16V7" />
<path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" />
<path d="M3.304 13h6.392" />
</svg>

Before

Width:  |  Height:  |  Size: 319 B

After

Width:  |  Height:  |  Size: 349 B

+3 -1
View File
@@ -4,7 +4,9 @@
"it-is-not",
"jguddas",
"danielbayley",
"ericfennis"
"ericfennis",
"vichotech",
"karsa-mistmere"
],
"tags": [
"letter",
+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 14h-5" />
<path d="M16 16v-3.5a2.5 2.5 0 0 1 5 0V16" />
<path d="M4.5 13h6" />
<path d="m3 16 4.5-9 4.5 9" />
<path d="m15 16 2.536-7.328a1.02 1.02 1 0 1 1.928 0L22 16" />
<path d="M15.697 14h5.606" />
<path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" />
<path d="M3.304 13h6.392" />
</svg>

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 390 B

+6 -1
View File
@@ -19,6 +19,11 @@
"time"
],
"aliases": [
"alarm-check"
{
"name": "alarm-check",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -15,6 +15,11 @@
"time"
],
"aliases": [
"alarm-minus"
{
"name": "alarm-minus",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -15,6 +15,11 @@
"time"
],
"aliases": [
"alarm-plus"
{
"name": "alarm-plus",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+21 -1
View File
@@ -5,7 +5,27 @@
],
"tags": [
"fruit",
"food"
"food",
"healthy",
"snack",
"nutrition",
"fresh",
"produce",
"grocery",
"organic",
"harvest",
"vitamin",
"red",
"green",
"juicy",
"sweet",
"tart",
"bite",
"orchard",
"plant",
"core",
"raw",
"diet"
],
"categories": [
"food-beverage"
+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 20.94c1.5 0 2.75 1.06 4 1.06 3 0 6-8 6-12.22A4.91 4.91 0 0 0 17 5c-2.22 0-4 1.44-5 2-1-.56-2.78-2-5-2a4.9 4.9 0 0 0-5 4.78C2 14 5 22 8 22c1.25 0 2.5-1.06 4-1.06Z" />
<path d="M10 2c1 .5 2 2 2 5" />
<path d="M12 6.528V3a1 1 0 0 1 1-1h0" />
<path d="M18.237 21A15 15 0 0 0 22 11a6 6 0 0 0-10-4.472A6 6 0 0 0 2 11a15.1 15.1 0 0 0 3.763 10 3 3 0 0 0 3.648.648 5.5 5.5 0 0 1 5.178 0A3 3 0 0 0 18.237 21" />
</svg>

Before

Width:  |  Height:  |  Size: 423 B

After

Width:  |  Height:  |  Size: 416 B

+2 -1
View File
@@ -2,7 +2,8 @@
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"karsa-mistmere"
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"backwards",
+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 5H9" />
<path d="M15 9v3h4l-7 7-7-7h4V9z" />
<path d="M15 11a1 1 0 0 0 1 1h2.939a1 1 0 0 1 .75 1.811l-6.835 6.836a1.207 1.207 0 0 1-1.707 0L4.31 13.81a1 1 0 0 1 .75-1.811H8a1 1 0 0 0 1-1V9a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1z" />
<path d="M9 4h6" />
</svg>

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 411 B

+3 -1
View File
@@ -3,7 +3,9 @@
"contributors": [
"Andreto",
"mittalyashu",
"danielbayley"
"danielbayley",
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"backwards",
+1 -1
View File
@@ -9,5 +9,5 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 6v6h4l-7 7-7-7h4V6h6z" />
<path d="M15 11a1 1 0 0 0 1 1h2.939a1 1 0 0 1 .75 1.811l-6.835 6.836a1.207 1.207 0 0 1-1.707 0L4.31 13.81a1 1 0 0 1 .75-1.811H8a1 1 0 0 0 1-1V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1z" />
</svg>

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 389 B

+2 -1
View File
@@ -2,7 +2,8 @@
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"karsa-mistmere"
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"previous",
+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M19 15V9" />
<path d="M15 15h-3v4l-7-7 7-7v4h3v6z" />
<path d="M13 9a1 1 0 0 1-1-1V5.061a1 1 0 0 0-1.811-.75l-6.835 6.836a1.207 1.207 0 0 0 0 1.707l6.835 6.835a1 1 0 0 0 1.811-.75V16a1 1 0 0 1 1-1h2a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1z" />
<path d="M20 9v6" />
</svg>

Before

Width:  |  Height:  |  Size: 275 B

After

Width:  |  Height:  |  Size: 414 B

+3 -1
View File
@@ -4,7 +4,9 @@
"Andreto",
"mittalyashu",
"ericfennis",
"danielbayley"
"danielbayley",
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"previous",
+1 -1
View File
@@ -9,5 +9,5 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M18 15h-6v4l-7-7 7-7v4h6v6z" />
<path d="M13 9a1 1 0 0 1-1-1V5.061a1 1 0 0 0-1.811-.75l-6.835 6.836a1.207 1.207 0 0 0 0 1.707l6.835 6.835a1 1 0 0 0 1.811-.75V16a1 1 0 0 1 1-1h6a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1z" />
</svg>

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 391 B

+2 -1
View File
@@ -2,7 +2,8 @@
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"karsa-mistmere"
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"next",
+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M5 9v6" />
<path d="M9 9h3V5l7 7-7 7v-4H9V9z" />
<path d="M11 9a1 1 0 0 0 1-1V5.061a1 1 0 0 1 1.811-.75l6.836 6.836a1.207 1.207 0 0 1 0 1.707l-6.836 6.835a1 1 0 0 1-1.811-.75V16a1 1 0 0 0-1-1H9a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1z" />
<path d="M4 9v6" />
</svg>

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 413 B

+3 -1
View File
@@ -4,7 +4,9 @@
"Andreto",
"mittalyashu",
"ericfennis",
"danielbayley"
"danielbayley",
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"next",
+1 -1
View File
@@ -9,5 +9,5 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M6 9h6V5l7 7-7 7v-4H6V9z" />
<path d="M11 9a1 1 0 0 0 1-1V5.061a1 1 0 0 1 1.811-.75l6.836 6.836a1.207 1.207 0 0 1 0 1.707l-6.836 6.835a1 1 0 0 1-1.811-.75V16a1 1 0 0 0-1-1H5a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1z" />
</svg>

Before

Width:  |  Height:  |  Size: 248 B

After

Width:  |  Height:  |  Size: 391 B

+2 -1
View File
@@ -2,7 +2,8 @@
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"karsa-mistmere"
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"caps lock",
+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M9 19h6" />
<path d="M9 15v-3H5l7-7 7 7h-4v3H9z" />
<path d="M9 13a1 1 0 0 0-1-1H5.061a1 1 0 0 1-.75-1.811l6.836-6.835a1.207 1.207 0 0 1 1.707 0l6.835 6.835a1 1 0 0 1-.75 1.811H16a1 1 0 0 0-1 1v2a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z" />
<path d="M9 20h6" />
</svg>

Before

Width:  |  Height:  |  Size: 273 B

After

Width:  |  Height:  |  Size: 413 B

+3 -1
View File
@@ -3,7 +3,9 @@
"contributors": [
"Andreto",
"mittalyashu",
"danielbayley"
"danielbayley",
"karsa-mistmere",
"jamiemlaw"
],
"tags": [
"shift",
+1 -1
View File
@@ -9,5 +9,5 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M9 18v-6H5l7-7 7 7h-4v6H9z" />
<path d="M9 13a1 1 0 0 0-1-1H5.061a1 1 0 0 1-.75-1.811l6.836-6.835a1.207 1.207 0 0 1 1.707 0l6.835 6.835a1 1 0 0 1-.75 1.811H16a1 1 0 0 0-1 1v6a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z" />
</svg>

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 390 B

+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"arrow-down-01"
{
"name": "arrow-down-01",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"arrow-down-10"
{
"name": "arrow-down-10",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"arrow-down-az"
{
"name": "arrow-down-az",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"sort-desc"
{
"name": "sort-desc",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -22,6 +22,11 @@
"arrows"
],
"aliases": [
"arrow-down-za"
{
"name": "arrow-down-za",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"arrow-up-01"
{
"name": "arrow-up-01",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"arrow-up-10"
{
"name": "arrow-up-10",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -21,6 +21,11 @@
"arrows"
],
"aliases": [
"arrow-up-az"
{
"name": "arrow-up-az",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -22,6 +22,11 @@
"arrows"
],
"aliases": [
"sort-asc"
{
"name": "sort-asc",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -22,6 +22,11 @@
"arrows"
],
"aliases": [
"arrow-up-za"
{
"name": "arrow-up-za",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -12,6 +12,11 @@
"design"
],
"aliases": [
"axis-3-d"
{
"name": "axis-3-d",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -5,7 +5,12 @@
"jguddas"
],
"aliases": [
"verified"
{
"name": "verified",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
],
"tags": [
"verified",
+6 -1
View File
@@ -15,6 +15,11 @@
"shapes"
],
"aliases": [
"badge-help"
{
"name": "badge-help",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+3 -3
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M2 16V4a2 2 0 0 1 2-2h11" />
<path d="M22 18H11a2 2 0 1 0 0 4h10.5a.5.5 0 0 0 .5-.5v-15a.5.5 0 0 0-.5-.5H11a2 2 0 0 0-2 2v12" />
<path d="M5 14H4a2 2 0 1 0 0 4h1" />
<path d="M5 7a2 2 0 0 0-2 2v11" />
<path d="M5.803 18H5a2 2 0 0 0 0 4h9.5a.5.5 0 0 0 .5-.5V21" />
<path d="M9 15V4a2 2 0 0 1 2-2h9.5a.5.5 0 0 1 .5.5v14a.5.5 0 0 1-.5.5H11a2 2 0 0 1 0-4h10" />
</svg>

Before

Width:  |  Height:  |  Size: 389 B

After

Width:  |  Height:  |  Size: 406 B

+6 -1
View File
@@ -25,6 +25,11 @@
"development"
],
"aliases": [
"book-template"
{
"name": "book-template",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0.0"
}
]
}
+2 -1
View File
@@ -1,7 +1,8 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley"
"danielbayley",
"karsa-mistmere"
],
"tags": [
"diary",
+1 -1
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 8.2A2.22 2.22 0 0 0 13.8 6c-.8 0-1.4.3-1.8.9-.4-.6-1-.9-1.8-.9A2.22 2.22 0 0 0 8 8.2c0 .6.3 1.2.7 1.6A226.652 226.652 0 0 0 12 13a404 404 0 0 0 3.3-3.1 2.413 2.413 0 0 0 .7-1.7" />
<path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" />
<path d="M8.62 9.8A2.25 2.25 0 1 1 12 6.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z" />
</svg>

Before

Width:  |  Height:  |  Size: 506 B

After

Width:  |  Height:  |  Size: 424 B

+2 -1
View File
@@ -1,7 +1,8 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley"
"danielbayley",
"karsa-mistmere"
],
"tags": [
"robot",
+3 -3
View File
@@ -10,9 +10,9 @@
stroke-linejoin="round"
>
<path d="M12 6V2H8" />
<path d="m8 18-4 4V8a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2Z" />
<path d="M2 12h2" />
<path d="M9 11v2" />
<path d="M15 11v2" />
<path d="M2 12h2" />
<path d="M20 12h2" />
<path d="M20 16a2 2 0 0 1-2 2H8.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 4 20.286V8a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2z" />
<path d="M9 11v2" />
</svg>

Before

Width:  |  Height:  |  Size: 402 B

After

Width:  |  Height:  |  Size: 458 B

+6 -1
View File
@@ -5,7 +5,12 @@
"karsa-mistmere"
],
"aliases": [
"curly-braces"
{
"name": "curly-braces",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
],
"tags": [
"json",
+68
View File
@@ -0,0 +1,68 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere",
"danielbayley"
],
"tags": [
"firewall",
"security",
"bricks",
"mortar",
"cement",
"materials",
"construction",
"builder",
"labourer",
"quantity surveyor",
"blocks",
"stone",
"cybersecurity",
"secure",
"safety",
"protection",
"guardian",
"armored",
"armoured",
"defense",
"defence",
"defender",
"block",
"threat",
"prevention",
"antivirus",
"vigilance",
"vigilant",
"detection",
"scan",
"find",
"strength",
"strong",
"tough",
"invincible",
"invincibility",
"invulnerable",
"undamaged",
"audit",
"admin",
"verification",
"crest",
"bravery",
"knight",
"foot soldier",
"infantry",
"trooper",
"pawn",
"battle",
"war",
"military",
"army",
"cadet",
"scout"
],
"categories": [
"security",
"home",
"connectivity"
]
}
+20
View File
@@ -0,0 +1,20 @@
<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 9v1.258" />
<path d="M16 3v5.46" />
<path d="M21 9.118V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5.75" />
<path d="M22 17.5c0 2.499-1.75 3.749-3.83 4.474a.5.5 0 0 1-.335-.005c-2.085-.72-3.835-1.97-3.835-4.47V14a.5.5 0 0 1 .5-.499c1 0 2.25-.6 3.12-1.36a.6.6 0 0 1 .76-.001c.875.765 2.12 1.36 3.12 1.36a.5.5 0 0 1 .5.5z" />
<path d="M3 15h7" />
<path d="M3 9h12.142" />
<path d="M8 15v6" />
<path d="M8 3v6" />
</svg>

After

Width:  |  Height:  |  Size: 653 B

+2 -1
View File
@@ -2,7 +2,8 @@
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"jguddas"
"jguddas",
"karsa-mistmere"
],
"tags": [
"debug",
+3 -3
View File
@@ -9,13 +9,13 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12.765 21.522a.5.5 0 0 1-.765-.424v-8.196a.5.5 0 0 1 .765-.424l5.878 3.674a1 1 0 0 1 0 1.696z" />
<path d="M10 19.655A6 6 0 0 1 6 14v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 3.97" />
<path d="M14 15.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997a1 1 0 0 1-1.517-.86z" />
<path d="M14.12 3.88 16 2" />
<path d="M18 11a4 4 0 0 0-4-4h-4a4 4 0 0 0-4 4v3a6.1 6.1 0 0 0 2 4.5" />
<path d="M20.97 5c0 2.1-1.6 3.8-3.5 4" />
<path d="M3 21c0-2.1 1.7-3.9 3.8-4" />
<path d="M6 13H2" />
<path d="M6.53 9C4.6 8.8 3 7.1 3 5" />
<path d="m8 2 1.88 1.88" />
<path d="M9 7.13v-1a3.003 3.003 0 1 1 6 0v1" />
<path d="M9 7.13v-1a3 3 0 0 1 4.18-2.895 3 3 0 0 1 1.821 2.896v1" />
</svg>

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 678 B

+2 -1
View File
@@ -1,7 +1,8 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley"
"danielbayley",
"jguddas"
],
"tags": [
"birthday",
+2 -2
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="9" cy="7" r="2" />
<path d="M7.2 7.9 3 11v9c0 .6.4 1 1 1h16c.6 0 1-.4 1-1v-9c0-2-3-6-7-8l-3.6 2.6" />
<path d="M16 13H3" />
<path d="M16 17H3" />
<path d="m7.2 7.9-3.388 2.5A2 2 0 0 0 3 12.01V20a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1v-8.654c0-2-2.44-6.026-6.44-8.026a1 1 0 0 0-1.082.057L10.4 5.6" />
<circle cx="9" cy="7" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 374 B

After

Width:  |  Height:  |  Size: 437 B

+4 -3
View File
@@ -9,8 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3 10h18V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7" />
<path d="M8 2v4" />
<path d="M12.127 22H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.125" />
<path d="M14.62 18.8A2.25 2.25 0 1 1 18 15.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z" />
<path d="M16 2v4" />
<path d="M21.29 14.7a2.43 2.43 0 0 0-2.65-.52c-.3.12-.57.3-.8.53l-.34.34-.35-.34a2.43 2.43 0 0 0-2.65-.53c-.3.12-.56.3-.79.53-.95.94-1 2.53.2 3.74L17.5 22l3.6-3.55c1.2-1.21 1.14-2.8.19-3.74Z" />
<path d="M3 10h18" />
<path d="M8 2v4" />
</svg>

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 475 B

+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<line x1="2" x2="22" y1="2" y2="22" />
<path d="M7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16" />
<path d="M9.5 4h5L17 7h3a2 2 0 0 1 2 2v7.5" />
<path d="M14.121 15.121A3 3 0 1 1 9.88 10.88" />
<path d="M14.564 14.558a3 3 0 1 1-4.122-4.121" />
<path d="m2 2 20 20" />
<path d="M20 20H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 .819-.175" />
<path d="M9.695 4.024A2 2 0 0 1 10.004 4h3.993a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v7.344" />
</svg>

Before

Width:  |  Height:  |  Size: 404 B

After

Width:  |  Height:  |  Size: 488 B

+11 -1
View File
@@ -3,9 +3,19 @@
"contributors": [
"colebemis",
"lscheibel",
"ericfennis"
"ericfennis",
"karsa-mistmere"
],
"tags": [
"photography",
"lens",
"focus",
"capture",
"shot",
"visual",
"image",
"device",
"equipment",
"photo",
"webcam",
"video"
+1 -1
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z" />
<path d="M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z" />
<circle cx="12" cy="13" r="3" />
</svg>

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 437 B

+6 -1
View File
@@ -16,6 +16,11 @@
"multimedia"
],
"aliases": [
"subtitles"
{
"name": "subtitles",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+5 -2
View File
@@ -1,7 +1,9 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley"
"danielbayley",
"vichotech",
"karsa-mistmere"
],
"tags": [
"text",
@@ -11,6 +13,7 @@
"typography"
],
"categories": [
"text"
"text",
"development"
]
}
+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="7" cy="12" r="3" />
<path d="M10 9v6" />
<circle cx="17" cy="12" r="3" />
<path d="M14 7v8" />
<path d="M10 9v7" />
<path d="M14 6v10" />
<circle cx="17.5" cy="12.5" r="3.5" />
<circle cx="6.5" cy="12.5" r="3.5" />
</svg>

Before

Width:  |  Height:  |  Size: 323 B

After

Width:  |  Height:  |  Size: 336 B

+3 -1
View File
@@ -1,7 +1,9 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley"
"danielbayley",
"vichotech",
"karsa-mistmere"
],
"tags": [
"text",
+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m3 15 4-8 4 8" />
<path d="M4 13h6" />
<circle cx="18" cy="12" r="3" />
<path d="M21 9v6" />
<path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" />
<path d="M22 9v7" />
<path d="M3.304 13h6.392" />
<circle cx="18.5" cy="12.5" r="3.5" />
</svg>

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 359 B

+5 -2
View File
@@ -2,7 +2,9 @@
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"jguddas"
"jguddas",
"vichotech",
"karsa-mistmere"
],
"tags": [
"text",
@@ -12,6 +14,7 @@
"typography"
],
"categories": [
"text"
"text",
"development"
]
}
+3 -3
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m3 15 4-8 4 8" />
<path d="M4 13h6" />
<path d="M15 11h4.5a2 2 0 0 1 0 4H15V7h4a2 2 0 0 1 0 4" />
<path d="M15 11h4.5a1 1 0 0 1 0 5h-4a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h3a1 1 0 0 1 0 5" />
<path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" />
<path d="M3.304 13h6.392" />
</svg>

Before

Width:  |  Height:  |  Size: 321 B

After

Width:  |  Height:  |  Size: 391 B

+8 -9
View File
@@ -9,13 +9,12 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M22 20v-9H2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2Z" />
<path d="M18 11V4H6v7" />
<path d="M15 22v-4a3 3 0 0 0-3-3a3 3 0 0 0-3 3v4" />
<path d="M22 11V9" />
<path d="M2 11V9" />
<path d="M6 4V2" />
<path d="M18 4V2" />
<path d="M10 4V2" />
<path d="M14 4V2" />
<path d="M10 5V3" />
<path d="M14 5V3" />
<path d="M15 21v-3a3 3 0 0 0-6 0v3" />
<path d="M18 3v8" />
<path d="M18 5H6" />
<path d="M22 11H2" />
<path d="M22 9v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9" />
<path d="M6 3v8" />
</svg>

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 443 B

+6 -1
View File
@@ -14,6 +14,11 @@
"notifications"
],
"aliases": [
"alert-circle"
{
"name": "alert-circle",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -18,6 +18,11 @@
"gaming"
],
"aliases": [
"arrow-down-circle"
{
"name": "arrow-down-circle",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -20,6 +20,11 @@
"gaming"
],
"aliases": [
"arrow-left-circle"
{
"name": "arrow-left-circle",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -14,6 +14,11 @@
"navigation"
],
"aliases": [
"arrow-down-left-from-circle"
{
"name": "arrow-down-left-from-circle",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -14,6 +14,11 @@
"navigation"
],
"aliases": [
"arrow-down-right-from-circle"
{
"name": "arrow-down-right-from-circle",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+6 -1
View File
@@ -18,6 +18,11 @@
"development"
],
"aliases": [
"arrow-up-left-from-circle"
{
"name": "arrow-up-left-from-circle",
"deprecationReason": "alias.name",
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}

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