Compare commits

...

35 Commits

Author SHA1 Message Date
Yashu Mittal
6c31ab914a add timer off icon (#309) 2021-11-17 20:18:26 +01:00
SMAH1
f591c86aba Refactoring (#436) 2021-11-17 20:18:12 +01:00
Eric Fennis
8cab99a2ee New Figma Plugin setup (#434)
* Update changes

* Add new ui files

* add new script files

* process

* fix build

* try to fix the worker

* try to implement rollup for figma plugin

* bump flutter package version

* add vite for figma-plugin

* add vite

* add vite

* Fix ext output

* make plugin work!

* Add Folder open icon

Co-authored-by: Jan <72730682+JanTrichter@users.noreply.github.com>

* add new fetcher

* Build new api

* add plugin fetcher

* fix fetch icons

* Fix search

* Fix site build

* update yarn.lock

Co-authored-by: Jan <72730682+JanTrichter@users.noreply.github.com>
2021-11-17 20:12:45 +01:00
Brandon Duffany
ac25cdca38 Add wrap-text icon (#435)
* Add wrap text icon

* Optimize

* Add tags for wrap-text
2021-11-15 07:52:30 +01:00
dependabot[bot]
dca5f0f5a6 Bump dns-packet from 1.3.1 to 1.3.4 (#442)
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

---
updated-dependencies:
- dependency-name: dns-packet
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 16:09:34 +01:00
dependabot[bot]
dc988cdf45 Bump tar from 6.1.0 to 6.1.11 (#441)
Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.11.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 16:07:11 +01:00
dependabot[bot]
326267521d Bump url-parse from 1.5.1 to 1.5.3 (#440)
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 16:07:02 +01:00
dependabot[bot]
e6253d2455 Bump jszip from 3.6.0 to 3.7.1 (#439)
Bumps [jszip](https://github.com/Stuk/jszip) from 3.6.0 to 3.7.1.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/master/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.6.0...v3.7.1)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 16:06:52 +01:00
SMAH1
fa55b04fa0 Use 'angular build workflow' in Windows (#433) 2021-11-14 15:50:03 +01:00
SMAH1
eded6e0db2 Support Angular version 11 or higher (#432) 2021-11-14 15:48:50 +01:00
Eric Fennis
1f9a3b6a8d Add folder-open icon (#429)
* bump flutter package version

* Add Folder open icon

Co-authored-by: Jan <72730682+JanTrichter@users.noreply.github.com>

Co-authored-by: Jan <72730682+JanTrichter@users.noreply.github.com>
2021-11-09 20:32:31 +01:00
Yashu Mittal
ee3f9bf92d create wand icon (#351)
* create wand icon

* Update wand.svg

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2021-10-23 12:48:09 +02:00
Yashu Mittal
11631bf008 add settings-2 icon (#231)
* add settings-2 icon

* Update settings-2.svg

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2021-10-23 12:41:50 +02:00
Lucide Bot
46da57d763 📦 Bump lucide package versions to 0.16.12 2021-10-17 21:29:19 +00:00
David Pérez Cabrera
ce6935405d Added chevron-first and chevron-last (#423)
* Added chevron-first and chevron-last

* Update icons/chevron-first.svg

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

* Update icons/chevron-last.svg

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

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2021-10-17 23:19:05 +02:00
Prateek SU
a12d15cde1 Fix flutter test (#426)
* Fix flutter test

* Remove assets from gitignore
2021-10-15 16:17:40 +02:00
Eric Fennis
cbc058012e Merge branch 'master' of github.com:lucide-icons/lucide 2021-10-14 12:44:58 +02:00
Eric Fennis
c630032d40 remove pre generated icons in flutter package 2021-10-14 12:40:23 +02:00
Prateek SU
a7f2285e7d Add tests for flutter package and Formatted files (#421)
*  Add tests for flutter release package

* 👷 Format files

* Add long description to fix pubspec score
2021-10-14 12:37:40 +02:00
Martijn Loth
9d706ffc75 Fixed error in link to the Angular specific docs (#422)
Just a small typo in the readme that didn't link to the corrects docs in this repo.
2021-10-14 12:31:05 +02:00
Prateek SU
748c8d2f4e Fix for flutter release package (#420)
* Fix for flutter release package

* Lowercase font name for flutter package

* Simplify assets copying

* Update .github/workflows/release.yml

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

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2021-10-10 20:03:02 +02:00
Lucide Bot
f8e8f46085 📦 Bump lucide package versions to 0.16.10 2021-10-06 06:46:13 +00:00
Christoph Nölke
7964a535b2 add gem icon (#359)
* add gem icon

Co-authored-by: b0b90 <babersheikh@outlook.com>

* Update icons/gem.svg

Remove additional edges of the gem and reduce height.

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

Co-authored-by: b0b90 <babersheikh@outlook.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2021-10-06 08:35:58 +02:00
Eric Fennis
0e35ba400c Fix Piggybank name 2021-10-03 15:35:15 +02:00
b0b90
f920d52e08 add piggy-bank icon (#350)
* 4 icons added

* Delete rocking-chair.svg

* Delete gem.svg

* Delete landmark.svg

* Update piggy-bank-.svg

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2021-10-03 15:28:37 +02:00
Eric Fennis
ebe64a6c7f Merge branch 'master' of github.com:lucide-icons/lucide 2021-10-03 15:26:34 +02:00
Eric Fennis
2672c011e5 Fix flutter package in release 2021-10-03 15:25:32 +02:00
Eric Fennis
63052c9d9e Fix types 2021-10-03 13:40:23 +02:00
Sri Aspari
e27d114c6e Add verified icon (#416)
* Add verified icon

* Add verified tag

* Fix verified icon
2021-10-03 12:23:09 +02:00
Eric Fennis
1404dbed83 Update ICON_DESIGN_GUIDE.md 2021-10-03 10:14:49 +02:00
Eric Fennis
4c868c92e5 Update the text a bit to avoid confusion, #416 2021-10-03 10:14:33 +02:00
Prateek SU
4cdb9f8b94 Fix flutter package generation (#415) 2021-10-02 20:40:53 +02:00
Lucide Bot
4ff430e49d 📦 Bump lucide package versions to 0.16.7 2021-10-01 15:03:24 +00:00
Eric Fennis
4e949b38e9 Add list-plus icon (#411)
* add list plug icon

* Add tags

* add list-minus and list-plus

* Add tags
2021-10-01 16:53:39 +02:00
Lucide Bot
c48679cc1a 📦 Bump lucide package versions to 0.16.6 2021-10-01 07:29:41 +00:00
70 changed files with 3687 additions and 7508 deletions

View File

@@ -71,4 +71,3 @@ jobs:
tag_name: ${{ steps.new-version.outputs.NEW_VERSION }}
name: New icons ${{ steps.new-version.outputs.NEW_VERSION }}
body: ${{ steps.change-log.outputs.CHANGE_LOG }}

View File

@@ -1,7 +1,7 @@
name: 'Close stale issues and PR'
name: Close stale issues and PR
on:
schedule:
- cron: '45 1 * * *'
- cron: "45 1 * * *"
jobs:
stale:
@@ -10,9 +10,9 @@ jobs:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-pr-message: 'This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
close-pr-message: 'This PR was closed because it has been stalled for 5 days with no activity.'
close-pr-label: '🧶 stale'
stale-pr-message: This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.
close-pr-message: This PR was closed because it has been stalled for 5 days with no activity.
close-pr-label: 🧶 stale
days-before-stale: 30
days-before-close: 5
days-before-pr-close: -1

View File

@@ -3,12 +3,12 @@ name: Release Packages
on:
push:
tags:
- 'v*'
- "v*"
workflow_dispatch:
inputs:
version:
description: 'Version'
description: Version
required: true
jobs:
@@ -35,8 +35,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install dependencies
run: yarn --prefer-offline
@@ -70,8 +70,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install dependencies
run: yarn --prefer-offline
@@ -105,8 +105,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install dependencies
run: yarn --prefer-offline
@@ -140,8 +140,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install dependencies
run: yarn --prefer-offline
@@ -175,8 +175,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install dependencies
run: yarn --prefer-offline
@@ -210,8 +210,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install dependencies
run: yarn --prefer-offline
@@ -245,8 +245,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
with:
node-version: '14'
cache: 'yarn'
node-version: "14"
cache: yarn
- name: Install FontForge
run: sudo apt-get install zlib1g-dev fontforge
@@ -256,18 +256,18 @@ jobs:
- name: Install and move sfnt2woff-zopfli
run: |
cd sfnt2woff-zopfli
make
sudo mv sfnt2woff-zopfli /usr/local/bin/sfnt2woff
cd sfnt2woff-zopfli
make
sudo mv sfnt2woff-zopfli /usr/local/bin/sfnt2woff
- name: Clone woff2
run: git clone --recursive https://github.com/google/woff2.git
- name: Install woff2
run: |
cd woff2
sudo make clean all
sudo mv woff2_compress /usr/local/bin/ && sudo mv woff2_decompress /usr/local/bin/
cd woff2
sudo make clean all
sudo mv woff2_compress /usr/local/bin/ && sudo mv woff2_decompress /usr/local/bin/
- name: Install Font Custom dependency
run: sudo gem install fontcustom
@@ -277,23 +277,23 @@ jobs:
- name: Build Icon Font
run: |
mkdir build
list=(-200 -300 "" -500 -600)
command=''
for name in "${list[@]}"
do
subcommand="(yarn build:outline-icons --outputDir=converted_icons${name} && fontcustom compile "./converted_icons${name}" -h -n "lucide${name}" -o ./build -F)"
if [ -z "$command" ]
then
command="$subcommand";
else
command="$command & $subcommand";
fi
done
mkdir build
list=(-200 -300 "" -500 -600)
command=''
for name in "${list[@]}"
do
subcommand="(yarn build:outline-icons --outputDir=converted_icons${name} && fontcustom compile "./converted_icons${name}" -h -n "lucide${name}" -o ./build -F)"
if [ -z "$command" ]
then
command="$subcommand";
else
command="$command & $subcommand";
fi
done
eval $command
eval $command
- name: 'Upload to Artifacts'
- name: "Upload to Artifacts"
uses: actions/upload-artifact@v1
with:
name: lucide-font
@@ -304,13 +304,13 @@ jobs:
runs-on: ubuntu-latest
needs: [pre-build, lucide-font]
container:
image: cirrusci/flutter:latest
image: cirrusci/flutter:latest
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
- uses: actions/cache@v2
with:
path: '~/.pub-cache'
path: ~/.pub-cache
key: ${{ runner.os }}-pub-${{ hashFiles('~/.pub-cache') }}
restore-keys: |
${{ runner.os }}-pub-
@@ -336,11 +336,20 @@ jobs:
- name: List lucide-font folder
run: ls lucide-font
- name: Move the ttf file
run: mv lucide-font/lucide.ttf packages/lucide-flutter/assets/Lucide.ttf
- name: Copy assets from lucide-font directory
run: |
mkdir packages/lucide-flutter/assets
cp lucide-font/lucide.ttf packages/lucide-flutter/assets/lucide.ttf
cp lucide-font/lucide-preview.html packages/lucide-flutter/assets/lucide-preview.html
- name: Generate exports file
run: dart tool/generate_fonts.dart lucide-font/lucide-preview.html
run: |
dart tool/generate_fonts.dart assets/lucide-preview.html
flutter format .
working-directory: packages/lucide-flutter
- name: Test
run: flutter test
working-directory: packages/lucide-flutter
- name: Update yaml
@@ -357,11 +366,21 @@ jobs:
name: lucide-flutter-pubspec-yaml
path: packages/lucide-flutter/pubspec.yaml
post-release:
if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
needs: [pre-build, lucide, lucide-react, lucide-vue, lucide-vue-next, lucide-angular, lucide-preact, lucide-flutter, lucide-font]
needs:
[
pre-build,
lucide,
lucide-react,
lucide-vue,
lucide-vue-next,
lucide-angular,
lucide-preact,
lucide-flutter,
lucide-font,
]
steps:
- uses: actions/checkout@v2

View File

@@ -113,7 +113,7 @@ yarn add lucide-angular
npm install lucide-angular
```
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/packages/lucide-angular#lucide-angular).
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/master/packages/lucide-angular#lucide-angular).
### Preact

View File

@@ -5,7 +5,7 @@ Here are rules that should be followed to keep quality and consistency when maki
## Summary of the rules we have
1. Icons must be designed on a **24 by 24 pixels** canvas.
2. Icons must have a **1 pixel padding** within the canvas.
2. Icons must have at least **1 pixel padding** within the canvas.
3. Icons must have a **stroke width of 2 pixels**.
4. Icons must use **round joins**.
5. Icons must use **round caps**.
@@ -19,7 +19,7 @@ Here are rules that should be followed to keep quality and consistency when maki
![24px-24px](images/24px-24px.png?raw=true "24px-24px")
### 2. Icons must have a 1 pixel padding within the canvas.
### 2. Icons must have at least 1 pixel padding within the canvas.
![1px-padding](images/1px-padding.png?raw=true "1px-padding")

14
icons/chevron-first.svg Normal file
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"
>
<polyline points="17 18 11 12 17 6" />
<path d="M7 6v12" />
</svg>

After

Width:  |  Height:  |  Size: 272 B

14
icons/chevron-last.svg Normal file
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"
>
<polyline points="7 18 13 12 7 6" />
<path d="M17 6v12" />
</svg>

After

Width:  |  Height:  |  Size: 271 B

13
icons/folder-open.svg Normal file
View File

@@ -0,0 +1,13 @@
<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="M6 17l2-5h14l-3 8a2 2 0 01-2 1H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h7a2 2 0 012 2v4" />
</svg>

After

Width:  |  Height:  |  Size: 305 B

16
icons/gem.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"
>
<polygon points="6 3 18 3 22 9 12 22 2 9" />
<path d="M12 22l4-13-3-6" />
<path d="M12 22L8 9l3-6" />
<path d="M2 9h20" />
</svg>

After

Width:  |  Height:  |  Size: 339 B

16
icons/list-minus.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="M11 12H3" />
<path d="M16 6H3" />
<path d="M16 18H3" />
<path d="M21 12h-6" />
</svg>

After

Width:  |  Height:  |  Size: 304 B

17
icons/list-plus.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 12H3" />
<path d="M16 6H3" />
<path d="M16 18H3" />
<path d="M18 9V15" />
<path d="M21 12H15" />
</svg>

After

Width:  |  Height:  |  Size: 328 B

17
icons/list-x.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 12H3" />
<path d="M16 6H3" />
<path d="M16 18H3" />
<path d="M19 10l-4 4" />
<path d="M15 10l4 4" />
</svg>

After

Width:  |  Height:  |  Size: 332 B

15
icons/piggy-bank.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="M19 5c-1.5 0-2.8 1.4-3 2-3.5-1.5-11-.3-11 5 0 1.8 0 3 2 4.5V20h4v-2h3v2h4v-4c1-.5 1.7-1 2-2h2v-4h-2c0-1-.5-1.5-1-2h0V5Z" />
<path d="M2 9v1c0 1.1.9 2 2 2h1"/>
<path d="M16 11h0" />
</svg>

After

Width:  |  Height:  |  Size: 404 B

16
icons/settings-2.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 7h-9" />
<path d="M14 17H5" />
<circle cx="17" cy="17" r="3" />
<circle cx="7" cy="7" r="3" />
</svg>

After

Width:  |  Height:  |  Size: 324 B

16
icons/timer-off.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="M10 2h4" />
<path d="M7.43 7.433A8 8 0 0118.566 18.57M4.582 11A8 8 0 0015 21.419" />
<path d="M2 2l20 20" />
<path d="M12 12v-2" />
</svg>

After

Width:  |  Height:  |  Size: 357 B

15
icons/verified.svg Executable 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="M12 3a3.6 3.6 0 00-3.05 1.68 3.6 3.6 0 00-.9-.1 3.6 3.6 0 00-2.42 1.06 3.6 3.6 0 00-.94 3.32A3.6 3.6 0 003 12a3.6 3.6 0 001.69 3.05 3.6 3.6 0 00.95 3.32 3.6 3.6 0 003.35.96A3.6 3.6 0 0012 21a3.6 3.6 0 003.04-1.67 3.6 3.6 0 004.3-4.3A3.6 3.6 0 0021 12a3.6 3.6 0 00-1.67-3.04v0a3.6 3.6 0 00-4.3-4.3A3.6 3.6 0 0012 3z" />
<path d="M15 10l-4 4" />
<path d="M9 12l2 2" />
</svg>

After

Width:  |  Height:  |  Size: 590 B

21
icons/wand.svg Normal file
View File

@@ -0,0 +1,21 @@
<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 4V2" />
<path d="M15 16v-2" />
<path d="M8 9h2" />
<path d="M20 9h2" />
<path d="M17.8 11.8L19 13" />
<path d="M15 9h0" />
<path d="M17.8 6.2L19 5" />
<path d="M3 21l9-9" />
<path d="M12.2 6.2L11 5" />
</svg>

After

Width:  |  Height:  |  Size: 441 B

16
icons/wrap-text.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"
>
<line x1="3" y1="6" x2="21" y2="6" />
<path d="M3 12h15a3 3 0 110 6h-4" />
<polyline points="16 16 14 18 16 20" />
<line x1="3" y1="18" x2="10" y2="18" />
</svg>

After

Width:  |  Height:  |  Size: 371 B

View File

@@ -46,6 +46,9 @@ testem.log
.DS_Store
Thumbs.db
#npm-yarn
# npm-yarn
package-lock.json
src/createElement.js
# angular cache
.angular/cache

View File

@@ -1,7 +1,7 @@
{
"name": "lucide-angular",
"description": "A Lucide icon library package for Angular applications",
"version": "0.16.5",
"version": "0.16.12",
"author": "SMAH1",
"license": "ISC",
"homepage": "https://lucide.dev",
@@ -23,7 +23,7 @@
],
"scripts": {
"build": "yarn clean && yarn build:icons && yarn build:ng",
"clean": "rm -rf dist && rm -rf ./src/icons/*.ts",
"clean": "npx shx rm -rf dist && npx shx rm -rf ./src/icons/*.ts",
"build:icons": "yarn --cwd ../../ build:icons --output=../packages/lucide-angular/src --templateSrc=../packages/lucide-angular/scripts/exportTemplate --iconFileExtention=.ts --exportFileName=index.ts",
"build:ng": "ng build --prod",
"test:headless": "ng test --no-watch --no-progress --browsers=ChromeHeadlessCI",
@@ -33,35 +33,31 @@
"postinstall": "ngcc"
},
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"@angular/common": "^11.2.6",
"@angular/core": "^11.2.6"
"tslib": "^2.3.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.1102.5",
"@angular/cli": "~11.2.5",
"@angular/common": "~11.2.6",
"@angular/compiler": "~11.2.6",
"@angular/compiler-cli": "~11.2.6",
"@angular/core": "~11.2.6",
"@angular/platform-browser": "~11.2.6",
"@angular/platform-browser-dynamic": "~11.2.6",
"@types/jasmine": "~3.6.0",
"@types/node": "^12.11.1",
"codelyzer": "^6.0.0",
"jasmine-core": "~3.6.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "~6.1.0",
"@angular/cli": "~11.2.15",
"@angular/common": "~11.2.14",
"@angular/compiler": "~11.2.14",
"@angular/compiler-cli": "~11.2.14",
"@angular/core": "~11.2.14",
"@angular/platform-browser": "~11.2.14",
"@angular/platform-browser-dynamic": "~11.2.14",
"ng-packagr": "^11.2.4",
"@types/jasmine": "~3.10.2",
"@types/node": "^16.11.7",
"codelyzer": "^6.0.2",
"jasmine-core": "~3.10.1",
"jasmine-spec-reporter": "~7.0.0",
"karma": "~6.3.8",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.0.3",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"ng-packagr": "^11.0.0",
"karma-jasmine": "~4.0.1",
"karma-jasmine-html-reporter": "^1.7.0",
"protractor": "~7.0.0",
"puppeteer": "^8.0.0",
"ts-node": "~8.3.0",
"ts-node": "~10.4.0",
"tslint": "~6.1.0",
"typescript": "~4.1.5"
}

View File

@@ -1,675 +0,0 @@
// Global variable with Figma's plugin API.
declare const figma: PluginAPI
declare const __html__: string
interface PluginAPI {
readonly currentPage: PageNode
// Root of the current Figma document.
readonly root: DocumentNode
// API for accessing viewport information.
readonly viewport: ViewportAPI
// call this once your plugin is finished executing.
closePlugin(): void
// Command that the user chose through menu when launching the plugin.
readonly command: string
// Finds a node by its id. If not found, returns null.
getNodeById(id: string): BaseNode | null
// Finds a style by its id. If not found, returns null.
getStyleById(id: string): BaseStyle | null
// Access browser APIs and/or show UI to the user.
showUI(html: string, options?: ShowUIOptions): void
readonly ui: UIAPI
// Lets you store persistent data on the user's local machine
readonly clientStorage: ClientStorageAPI
// This value is returned when a property is in a "mixed" state.
// In order to check if a property is in a mixed state, always
// compare directly to this value. I.e.
// `if (node.cornerRadius === figma.mixed) { ... }`
mixed: symbol
// Creates new nodes. Nodes will start off inserted
// into the current page.
// To move them elsewhere use `appendChild` or `insertChild`
createRectangle(): RectangleNode
createLine(): LineNode
createEllipse(): EllipseNode
createPolygon(): PolygonNode
createStar(): StarNode
createVector(): VectorNode
createText(): TextNode
createBooleanOperation(): BooleanOperationNode
createFrame(): FrameNode
createComponent(): ComponentNode
createPage(): PageNode
createSlice(): SliceNode
// Creates styles. A style's id can be assigned to
// node properties like textStyleId, fillStyleId, etc.
createPaintStyle(): PaintStyle
createTextStyle(): TextStyle
createEffectStyle(): EffectStyle
createGridStyle(): GridStyle
// These let you insert stuff from the team library if you have the key
importComponentByKeyAsync(key: string): Promise<ComponentNode>
importStyleByKeyAsync(key: string): Promise<BaseStyle>
// Return all fonts currently supported for use with the "fontName" property
listAvailableFontsAsync(): Promise<Font[]>
// You must await the promise returned here before being able to use "fontName"
loadFontAsync(fontName: FontName): Promise<void>
// Creates node from an SVG string.
createNodeFromSvg(svg: string): FrameNode
// Creates an Image object using the provided file contents.
createImage(data: Uint8Array): Image
// Groups every node in `nodes` under a new group.
group(nodes: ReadonlyArray<BaseNode>, parent: BaseNode & ChildrenMixin, index?: number): FrameNode
// Flattens every node in `nodes` into a single vector network.
flatten(nodes: ReadonlyArray<BaseNode>, parent?: BaseNode & ChildrenMixin, index?: number): VectorNode
}
interface ClientStorageAPI {
// This stores information in the browser, not on the server. It's similar to localStorage, but is
// asynchronous, and allows storing objects, arrays, strings, numbers, booleans, null, undefined and Uint8Arrays.
getAsync(key: string): Promise<any | undefined>
setAsync(key: string, value: any): Promise<void>
}
type ShowUIOptions = {
visible?: boolean, // defaults to true
width?: number, // defaults to 300
height?: number, // defaults to 200
}
interface UIAPI {
show(): void
hide(): void
resize(width: number, height: number): void
close(): void
// Sends a message to the iframe.
postMessage(pluginMessage: any): void
// Registers a callback for messages sent by the iframe.
onmessage: ((pluginMessage: any) => void) | undefined
}
interface ViewportAPI {
center: { x: number, y: number }
// 1.0 means 100% zoom, 0.5 means 50% zoom.
zoom: number
// Adjust the viewport such that it shows the provided nodes.
scrollAndZoomIntoView(nodes: ReadonlyArray<BaseNode>)
}
// manifest.json format
interface ManifestJson {
// Name of the plugin.
name: string
// Version of the runtime that the plugin uses, e.g. '0.5.0'.
version: string
// The file name that contains the plugin code.
script: string
// The file name that contains the html code made available in script.
html?: string
// Shell command to be executed before the contents of the `html` and `script` files are read.
build?: string
// Menu items to show up in UI.
menu?: ManifestMenuItem[]
}
type ManifestMenuItem =
// Clickable menu item.
{ name: string, command: string } |
// Separator
{ separator: true } |
// Submenu
{ name: string, menu: ManifestMenuItem[] }
////////////////////////////////////////////////////////////////////////////////
// Values
// These are the top two rows of a 3x3 matrix. This is enough to represent
// translation, rotation, and skew.
type Transform = [
[number, number, number],
[number, number, number]
]
interface Vector {
readonly x: number
readonly y: number
}
interface RGB {
readonly r: number
readonly g: number
readonly b: number
}
interface RGBA {
readonly r: number
readonly g: number
readonly b: number
readonly a: number
}
interface FontName {
readonly family: string
readonly style: string
}
interface ArcData {
readonly startingAngle: number
readonly endingAngle: number
readonly innerRadius: number
}
interface ShadowEffect {
readonly type: "DROP_SHADOW" | "INNER_SHADOW"
readonly color: RGBA
readonly offset: Vector
readonly radius: number
readonly visible: boolean
readonly blendMode: BlendMode
}
interface BlurEffect {
readonly type: "LAYER_BLUR" | "BACKGROUND_BLUR"
readonly radius: number
readonly visible: boolean
}
type Effect = ShadowEffect | BlurEffect
type ConstraintType = "MIN" | "CENTER" | "MAX" | "STRETCH" | "SCALE"
interface Constraints {
readonly horizontal: ConstraintType
readonly vertical: ConstraintType
}
interface ColorStop {
readonly position: number
readonly color: RGBA
}
interface SolidPaint {
readonly type: "SOLID"
readonly color: RGB
readonly visible?: boolean
readonly opacity?: number
}
interface GradientPaint {
readonly type: "GRADIENT_LINEAR" | "GRADIENT_RADIAL" | "GRADIENT_ANGULAR" | "GRADIENT_DIAMOND"
readonly gradientTransform: Transform
readonly gradientStops: ReadonlyArray<ColorStop>
readonly visible?: boolean
readonly opacity?: number
}
interface ImagePaint {
readonly type: "IMAGE"
readonly scaleMode: "FILL" | "FIT" | "CROP" | "TILE"
readonly image: Image | null
readonly imageTransform?: Transform // setting for "CROP"
readonly scalingFactor?: number // setting for "TILE"
readonly visible?: boolean
readonly opacity?: number
}
type Paint = SolidPaint | GradientPaint | ImagePaint
interface Guide {
readonly axis: "X" | "Y"
readonly offset: number
}
interface RowsColsLayoutGrid {
readonly pattern: "ROWS" | "COLUMNS"
readonly alignment: "MIN" | "STRETCH" | "CENTER"
readonly gutterSize: number
readonly count: number // Infinity when "Auto" is set in the UI
readonly sectionSize?: number // Not set for alignment: "STRETCH"
readonly offset?: number // Not set for alignment: "CENTER"
readonly visible?: boolean
readonly color?: RGBA
}
interface GridLayoutGrid {
readonly pattern: "GRID"
readonly sectionSize: number
readonly visible?: boolean
readonly color?: RGBA
}
type LayoutGrid = RowsColsLayoutGrid | GridLayoutGrid
interface ExportSettingsImage {
format: "JPG" | "PNG"
contentsOnly?: boolean // defaults to true
suffix?: string
constraint?: { // defaults to unscaled ({ type: "SCALE", value: 1 })
type: "SCALE" | "WIDTH" | "HEIGHT"
value: number
}
}
interface ExportSettingsSVG {
format: "SVG"
contentsOnly?: boolean // defaults to true
suffix?: string
svgOutlineText?: boolean // defaults to true
svgIdAttribute?: boolean // defaults to false
svgSimplifyStroke?: boolean // defaults to true
}
interface ExportSettingsPDF {
format: "PDF"
contentsOnly?: boolean // defaults to true
suffix?: string
}
type ExportSettings = ExportSettingsImage | ExportSettingsSVG | ExportSettingsPDF
type WindingRule = "NONZERO" | "EVENODD"
interface VectorVertex {
readonly x: number
readonly y: number
readonly strokeCap?: StrokeCap
readonly strokeJoin?: StrokeJoin
readonly cornerRadius?: number
readonly handleMirroring?: HandleMirroring
}
interface VectorSegment {
readonly start: number
readonly end: number
readonly tangentStart?: Vector // Defaults to { x: 0, y: 0 }
readonly tangentEnd?: Vector // Defaults to { x: 0, y: 0 }
}
interface VectorRegion {
readonly windingRule: WindingRule
readonly loops: ReadonlyArray<ReadonlyArray<number>>
}
interface VectorNetwork {
readonly vertices: ReadonlyArray<VectorVertex>
readonly segments: ReadonlyArray<VectorSegment>
readonly regions?: ReadonlyArray<VectorRegion> // Defaults to []
}
interface VectorPath {
// Similar to the svg fill-rule
// "NONE" means an open path won't have a fill
readonly windingRule: WindingRule | "NONE"
readonly data: string
}
type VectorPaths = ReadonlyArray<VectorPath>
interface NumberWithUnits {
readonly value: number
readonly units: "PIXELS" | "PERCENT"
}
type BlendMode =
"PASS_THROUGH" |
"NORMAL" |
"DARKEN" |
"MULTIPLY" |
"LINEAR_BURN" |
"COLOR_BURN" |
"LIGHTEN" |
"SCREEN" |
"LINEAR_DODGE" |
"COLOR_DODGE" |
"OVERLAY" |
"SOFT_LIGHT" |
"HARD_LIGHT" |
"DIFFERENCE" |
"EXCLUSION" |
"HUE" |
"SATURATION" |
"COLOR" |
"LUMINOSITY"
interface Font {
fontName: FontName
}
////////////////////////////////////////////////////////////////////////////////
// Mixins
interface BaseNodeMixin {
readonly id: string
readonly parent: (BaseNode & ChildrenMixin) | null
name: string
visible: boolean
locked: boolean
removed: boolean
toString(): string
remove(): void
// Attach custom data to a node. Only your plugin will be able to read this.
getPluginData(key: string): string
setPluginData(key: string, value: string): void
// Attach custom data to a node. All plugins will be able to read this.
// Namespace is a string that must be at least 3 alphanumeric characters, and should
// be a name related to your plugin. This is a mandatory argument to avoid multiple
// multiple plugins adding keys like "data" and colliding with each other. Other
// plugins will still be able to read shared plugin data as long as they know the
// namespace you use.
getSharedPluginData(namespace: string, key: string): string
setSharedPluginData(namespace: string, key: string, value: string): void
}
interface ChildrenMixin {
// Sorted back-to-front. I.e. the top-most child is last in this array.
readonly children: ReadonlyArray<BaseNode>
// Adds to the end of the .children array. I.e. visually on top of all other
// children.
appendChild(child: BaseNode): void
insertChild(index: number, child: BaseNode): void
findAll(callback?: (node: BaseNode) => boolean): ReadonlyArray<BaseNode>
findOne(callback: (node: BaseNode) => boolean): BaseNode | null
}
interface LayoutMixin {
readonly absoluteTransform: Transform
relativeTransform: Transform
x: number // The same as "relativeTransform[0][2]"
y: number // The same as "relativeTransform[1][2]"
rotation: number // The angle of the x axis of "relativeTransform" in degrees. Returns values from -180 to 180.
readonly size: Vector
readonly width: number // The same as "size.x"
readonly height: number // The same as "size.y"
// Resizes the node. If children of the node has constraints, it applies those constraints
// width and height must be >= 0.01
resize(width: number, height: number): void
// Resizes the node. Children of the node are never resized, even if those children have
// constraints. width and height must be >= 0.01
resizeWithoutConstraints(width: number, height: number): void
constraints: Constraints
}
interface BlendMixin {
opacity: number
blendMode: BlendMode
isMask: boolean
effects: ReadonlyArray<Effect>
effectStyleId: string
}
interface FrameMixin {
backgrounds: ReadonlyArray<Paint>
layoutGrids: ReadonlyArray<LayoutGrid>
clipsContent: boolean
guides: ReadonlyArray<Guide>
gridStyleId: string
backgroundStyleId: string
}
type StrokeCap = "NONE" | "ROUND" | "SQUARE" | "ARROW_LINES" | "ARROW_EQUILATERAL"
type StrokeJoin = "MITER" | "BEVEL" | "ROUND"
type HandleMirroring = "NONE" | "ANGLE" | "ANGLE_AND_LENGTH"
interface GeometryMixin {
fills: ReadonlyArray<Paint> | symbol // This can return figma.mixed on TEXT nodes
strokes: ReadonlyArray<Paint>
strokeWeight: number
strokeAlign: "CENTER" | "INSIDE" | "OUTSIDE"
strokeCap: StrokeCap | symbol // This can return figma.mixed on VECTOR nodes if vertices have different strokeCap values
strokeJoin: StrokeJoin | symbol // This can return figma.mixed on VECTOR nodes if vertices have different strokeJoin values
dashPattern: ReadonlyArray<number>
fillStyleId: string | symbol // This can return figma.mixed on TEXT nodes
strokeStyleId: string
}
interface CornerMixin {
// This can return figma.mixed on VECTOR nodes if vertices have different cornerRadius values,
// and on RECTANGLE nodes if node.topLeftRadius etc has different values
cornerRadius: number | symbol
cornerSmoothing: number
}
interface ExportMixin {
exportSettings: ExportSettings[]
exportAsync(settings?: ExportSettings): Promise<Uint8Array> // Defaults to PNG format
}
////////////////////////////////////////////////////////////////////////////////
// Nodes
interface DocumentNode extends BaseNodeMixin, ChildrenMixin {
readonly type: "DOCUMENT"
clone(): DocumentNode // Note: this always throws an error
}
interface PageNode extends BaseNodeMixin, ChildrenMixin, ExportMixin {
readonly type: "PAGE"
clone(): PageNode // cloned node starts off inserted into current page
guides: ReadonlyArray<Guide>
selection: ReadonlyArray<BaseNode>
}
interface FrameNode extends BaseNodeMixin, BlendMixin, ChildrenMixin, FrameMixin, LayoutMixin, ExportMixin {
readonly type: "FRAME" | "GROUP"
clone(): FrameNode // cloned node starts off inserted into current page
}
interface SliceNode extends BaseNodeMixin, LayoutMixin, ExportMixin {
readonly type: "SLICE"
clone(): SliceNode // cloned node starts off inserted into current page
}
interface RectangleNode extends BaseNodeMixin, BlendMixin, CornerMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "RECTANGLE"
clone(): RectangleNode // cloned node starts off inserted into current page
topLeftRadius: number
topRightRadius: number
bottomLeftRadius: number
bottomRightRadius: number
}
interface LineNode extends BaseNodeMixin, BlendMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "LINE"
clone(): LineNode // cloned node starts off inserted into current page
}
interface EllipseNode extends BaseNodeMixin, BlendMixin, CornerMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "ELLIPSE"
clone(): EllipseNode // cloned node starts off inserted into current page
arcData: ArcData
}
interface PolygonNode extends BaseNodeMixin, BlendMixin, CornerMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "POLYGON"
clone(): PolygonNode // cloned node starts off inserted into current page
pointCount: number
}
interface StarNode extends BaseNodeMixin, BlendMixin, CornerMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "STAR"
clone(): StarNode // cloned node starts off inserted into current page
pointCount: number
// This is a percentage value from 0 to 1
innerRadius: number
}
interface VectorNode extends BaseNodeMixin, BlendMixin, CornerMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "VECTOR"
clone(): VectorNode // cloned node starts off inserted into current page
vectorNetwork: VectorNetwork
vectorPaths: VectorPaths
handleMirroring: HandleMirroring | symbol // This can return figma.mixed if vertices have different handleMirroring values
}
interface TextNode extends BaseNodeMixin, BlendMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "TEXT"
clone(): TextNode // cloned node starts off inserted into current page
characters: string
textAlignHorizontal: "LEFT" | "CENTER" | "RIGHT" | "JUSTIFIED"
textAlignVertical: "TOP" | "CENTER" | "BOTTOM"
textAutoResize: "NONE" | "WIDTH_AND_HEIGHT" | "HEIGHT"
paragraphIndent: number
paragraphSpacing: number
autoRename: boolean
// These properties can all return figma.mixed if the text has multiple values for the property
textStyleId: string | symbol
fontSize: number | symbol
fontName: FontName | symbol
textCase: "ORIGINAL" | "UPPER" | "LOWER" | "TITLE" | symbol
textDecoration: "NONE" | "UNDERLINE" | "STRIKETHROUGH" | symbol
letterSpacing: NumberWithUnits | symbol
lineHeight: NumberWithUnits | symbol
}
interface ComponentNode extends BaseNodeMixin, BlendMixin, ChildrenMixin, FrameMixin, LayoutMixin, ExportMixin {
readonly type: "COMPONENT"
clone(): ComponentNode // cloned node starts off inserted into current page
createInstance(): InstanceNode // instance starts off inserted into current page
description: string
readonly remote: boolean
readonly key: string // The key to use with "importComponentByKeyAsync"
}
interface InstanceNode extends BaseNodeMixin, BlendMixin, ChildrenMixin, FrameMixin, LayoutMixin, ExportMixin {
readonly type: "INSTANCE"
clone(): InstanceNode // cloned node starts off inserted into current page
masterComponent: ComponentNode
}
interface BooleanOperationNode extends BaseNodeMixin, BlendMixin, ChildrenMixin, CornerMixin, GeometryMixin, LayoutMixin, ExportMixin {
readonly type: "BOOLEAN_OPERATION"
clone(): BooleanOperationNode // cloned node starts off inserted into current page
booleanOperation: "UNION" | "INTERSECT" | "SUBTRACT" | "EXCLUDE"
}
type BaseNode =
DocumentNode |
PageNode |
SliceNode |
FrameNode |
ComponentNode |
InstanceNode |
BooleanOperationNode |
VectorNode |
StarNode |
LineNode |
EllipseNode |
PolygonNode |
RectangleNode |
TextNode
type NodeType =
"DOCUMENT" |
"PAGE" |
"SLICE" |
"FRAME" |
"GROUP" |
"COMPONENT" |
"INSTANCE" |
"BOOLEAN_OPERATION" |
"VECTOR" |
"STAR" |
"LINE" |
"ELLIPSE" |
"POLYGON" |
"RECTANGLE" |
"TEXT"
////////////////////////////////////////////////////////////////////////////////
// Styles
type StyleType = "PAINT" | "TEXT" | "EFFECT" | "GRID"
interface BaseStyle {
// The string to uniquely identify a style by
readonly id: string
readonly type: StyleType
name: string // Note: setting this also sets "autoRename" to false on TextNodes
description: string
remote: boolean
readonly key: string // The key to use with "importStyleByKeyAsync"
remove(): void
}
interface PaintStyle extends BaseStyle {
type: "PAINT"
paints: ReadonlyArray<Paint>
}
interface TextStyle extends BaseStyle {
type: "TEXT"
fontSize: number
textDecoration: "NONE" | "UNDERLINE" | "STRIKETHROUGH"
fontName: FontName
letterSpacing: NumberWithUnits
lineHeight: NumberWithUnits
paragraphIndent: number
paragraphSpacing: number
textCase: "ORIGINAL" | "UPPER" | "LOWER" | "TITLE"
}
interface EffectStyle extends BaseStyle {
type: "EFFECT"
effects: ReadonlyArray<Paint>
}
interface GridStyle extends BaseStyle {
type: "GRID"
layoutGrids: ReadonlyArray<LayoutGrid>
}
////////////////////////////////////////////////////////////////////////////////
// Other
interface Image {
// Returns a unique hash for the image
readonly hash: string
// The contents of the image file
getBytesAsync(): Promise<Uint8Array>
}

View File

@@ -2,7 +2,16 @@
"name": "Lucide Icons",
"id": "939567362549682242",
"api": "1.0.0",
"ui": "build/ui.html",
"main": "build/main.js",
"editorType": ["figma"]
"editorType": ["figma"],
"main": "dist/assets/main.js",
"ui": {
"interface": "dist/src/interface/interface.html",
"worker": "dist/src/worker/worker.html"
},
"parameterOnly": false,
"parameters": [{
"name": "Icon",
"key": "icon-name",
"description": "Enter the name of the icon you want to insert."
}]
}

View File

@@ -1,27 +1,30 @@
{
"name": "lucide-figma",
"version": "0.15.11",
"license": "ISC",
"private": true,
"main": "build/ui.js",
"license": "ISC",
"main": "src/main.js",
"scripts": {
"build": "webpack --mode=production",
"watch": "webpack --mode=development --watch"
"dev": "vite",
"build": "tsc && rm -rf dist && yarn build:main && yarn build:worker && yarn build:interface",
"build:main": "INPUT=main vite build",
"build:worker": "INPUT=worker vite build",
"build:interface": "INPUT=interface vite build",
"serve": "vite preview"
},
"dependencies": {
"@emotion/core": "^10.0.14",
"@types/react": "^16.8.23",
"@types/react-dom": "^16.8.4",
"css-loader": "^3.0.0",
"html-webpack-inline-source-plugin": "^0.0.10",
"html-webpack-plugin": "^3.2.0",
"lucide-react": "0.16.0",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"style-loader": "^0.23.1",
"ts-loader": "^6.0.4",
"typescript": "^3.5.2",
"webpack": "^4.35.2",
"webpack-cli": "^3.3.5"
"minimist": "^1.2.5",
"react": "^17.0.0",
"react-dom": "^17.0.0"
},
"devDependencies": {
"@figma/plugin-typings": "^1.36.0",
"@types/react": "^17.0.0",
"@types/react-dom": "^17.0.0",
"@vitejs/plugin-react": "^1.0.0",
"typescript": "^4.3.2",
"vite": "^2.6.4",
"vite-plugin-singlefile": "^0.5.1"
}
}

View File

@@ -0,0 +1,68 @@
import iconNodeToSvg from "../helpers/iconNodeToSvg"
export type IconNode = any[]
export type IconName = string
export type Tag = string[]
export interface Tags {
[key:string]: Tag
}
export interface LucideIcons {
version: string
iconNodes: { [key: IconName]: IconNode }
tags: Tags,
svgs: { [key: IconName]: string }
}
export const fetchIcons = async (cachedIcons? : LucideIcons): Promise<LucideIcons> => {
const response = await fetch('https://unpkg.com/lucide-static@latest/package.json')
const packageJson = await response.json();
if(cachedIcons && cachedIcons?.version === packageJson.version) {
return cachedIcons
}
const iconNodesResponse = await fetch(`https://unpkg.com/lucide-static@${packageJson.version}/icon-nodes.json`)
const tagsResponse = await fetch('https://unpkg.com/lucide-static@latest/tags.json')
const iconNodes = await iconNodesResponse.json();
const tags = await tagsResponse.json();
const svgs = Object.keys(iconNodes).reduce((acc : { [key:string]: string}, iconName) => {
acc[iconName] = iconNodeToSvg(iconName, iconNodes[iconName])
return acc
}, {})
const lucideIcons: LucideIcons = {
version: packageJson.version,
tags,
iconNodes,
svgs
}
parent.postMessage({
pluginMessage: {
type: "setCachedIcons",
lucideIcons
}
}, "*")
return lucideIcons
}
export const getIcons = () => new Promise<LucideIcons>(async (resolve, reject)=> {
parent.postMessage({
pluginMessage: {
type: "getCachedIcons",
}
}, "*")
window.onmessage = async (event) => {
if (event.type === 'message' && event?.data?.pluginMessage.type === 'cachedIcons') {
const lucideIcons = await fetchIcons(event?.data?.pluginMessage?.cachedIcons)
resolve(lucideIcons)
}
}
});

View File

@@ -0,0 +1,16 @@
.icon-button {
padding: 8px;
color: var(--color-black);
background: transparent;
border: 0;
border-radius: 2px;
appearance: none;
outline: 0;
&:hover {
background: rgba(0, 0, 0, 0.06);
}
&:focus,
&:active {
box-shadow: inset 0 0 0 2px var(--color-blue);
}
}

View File

@@ -0,0 +1,32 @@
import { renderToString } from 'react-dom/server'
import { FC } from 'react';
import './IconButton.scss'
interface IconButtonProps {
name: string,
component: FC,
}
function IconButton({ name, component: IconComponent }: IconButtonProps) {
const onIconClick = () => {
const svg = renderToString(<IconComponent/>);
parent.postMessage({ pluginMessage: {
type: 'drawIcon',
icon: { name, svg }
}}, '*')
}
return (
<button
key={name}
aria-label={name}
onClick={onIconClick}
className='icon-button'
>
<IconComponent />
</button>
)
}
export default IconButton

View File

@@ -0,0 +1 @@
export { default } from './IconButton'

View File

@@ -0,0 +1,17 @@
.search-input {
.icon {
position: absolute;
top: 0;
left: 0;
padding: 4px;
}
input {
width: 100%;
height: 40px;
padding: 0 16px 0 36px;
font-family: inherit;
font-size: 11px;
border: 0;
outline: 0;
}
}

View File

@@ -0,0 +1,30 @@
import "./SearchInput.scss"
import { ChangeEvent } from "react"
import SearchIcon from "../icons/SearchIcon"
interface SearchInputProps extends React.HTMLProps<HTMLDivElement> {
value: string,
iconCount: number,
onChange: (event: ChangeEvent<HTMLInputElement>) => void
}
function SearchInput({ value, onChange, iconCount, className, ...props }: SearchInputProps) {
return (
<div
className="search-input"
{...props}
>
<SearchIcon className='icon'/>
<input
autoFocus
type="search"
value={value}
onChange={onChange}
placeholder={`Search ${iconCount} icons`}
className="input__field"
/>
</div>
)
}
export default SearchInput

View File

@@ -0,0 +1 @@
export { default } from './SearchInput'

View File

@@ -1,44 +0,0 @@
import { jsx } from '@emotion/core'
import theme from '../theme'
import { renderToString } from 'react-dom/server'
import { FC } from 'react';
interface IconButtonProps {
name: string,
component: FC,
}
function IconButton({ name, component: IconComponent }: IconButtonProps) {
const onIconclick = () => {
const svg = renderToString(<IconComponent/>);
parent.postMessage({ pluginMessage: { name, svg }}, '*')
}
return (
<button
key={name}
aria-label={name}
onClick={onIconclick}
css={{
padding: theme.space[2],
color: '#333',
background: 'transparent',
border: 0,
borderRadius: theme.radii[1],
appearance: 'none',
outline: 0,
'&:hover': {
background: 'rgba(0, 0, 0, 0.06)',
},
'&:focus, &:active': {
boxShadow: `inset 0 0 0 2px ${theme.colors.blue}`,
},
}}
>
<IconComponent />
</button>
)
}
export default IconButton

View File

@@ -1,43 +0,0 @@
import { jsx } from '@emotion/core'
import theme from '../theme'
import SearchIcon from './search-icon'
interface SearchInputProps extends React.HTMLProps<HTMLDivElement> {
value: string,
iconCount: number,
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void
}
function SearchInput({ value, onChange, iconCount, ...props }: SearchInputProps) {
return (
<div css={{ position: 'relative' }} {...props}>
<div
css={{
position: 'absolute',
top: 0,
left: 0,
padding: theme.space[1],
}}
>
<SearchIcon fill="#333" />
</div>
<input
autoFocus
type="search"
value={value}
onChange={onChange}
placeholder={`Search ${iconCount} icons`}
css={{
width: '100%',
height: 40,
padding: `0 ${theme.space[4]} 0 36px`,
fontFamily: 'inherit',
fontSize: theme.fontSizes[0],
border: 0,
outline: 0,
}}
/>
</div>
)
}
export default SearchInput

View File

@@ -0,0 +1,13 @@
import { Tags } from "../api/fetchIcons";
import { Icon } from "../hooks/useSearch";
export default (icons: Icon[], tags: Tags ,query:string) =>
icons.filter(([name]: Icon) => {
const iconTags = tags && tags[name] ? tags[name] : []
return [name, ...iconTags].some(
(item:string) => item
.toLowerCase()
.includes(query)
)
})

View File

@@ -0,0 +1,11 @@
import { createReactComponent } from "lucide-react";
import { createElement } from "react";
import { renderToString } from "react-dom/server";
import { IconNode } from "../api/fetchIcons";
const iconNodeToSvg = (iconName: string, iconNode : IconNode) => {
const IconComponent = createReactComponent(iconName, iconNode)
return renderToString(createElement(IconComponent));
}
export default iconNodeToSvg

View File

@@ -0,0 +1,17 @@
import { IconName, IconNode, Tags } from "../api/fetchIcons";
import filterIcons from "../helpers/filterIcons";
export type Icon = [
name: IconName,
iconNode: IconNode
]
function useSearch(icons: Icon[], tags: Tags ,query: string) {
if(!query) return icons;
const searchString = query.toLowerCase()
return filterIcons(icons, tags, searchString);
}
export default useSearch;

View File

@@ -0,0 +1 @@
<svg fill="none" height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="m18.8744 19.5815c-1.0453.8849-2.3975 1.4185-3.8744 1.4185-3.3137 0-6-2.6863-6-6s2.6863-6 6-6 6 2.6863 6 6c0 1.4769-.5336 2.8291-1.4185 3.8744l4.2721 4.272-.7072.7072zm1.1256-4.5815c0 2.7614-2.2386 5-5 5s-5-2.2386-5-5 2.2386-5 5-5 5 2.2386 5 5z" fill="#000" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 408 B

View File

@@ -0,0 +1 @@
<svg fill="none" height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="m18.3972 18.6046c-.7793.625-1.7687.9988-2.8455.9988-2.5138 0-4.5517-2.0378-4.5517-4.5517 0-2.5138 2.0379-4.5517 4.5517-4.5517 2.5139 0 4.5517 2.0379 4.5517 4.5517 0 1.0769-.3739 2.0664-.999 2.8458l3.2491 3.2492-.7071.7071zm.7062-3.5529c0 1.9616-1.5901 3.5517-3.5517 3.5517-1.9615 0-3.5517-1.5901-3.5517-3.5517 0-1.9615 1.5902-3.5517 3.5517-3.5517 1.9616 0 3.5517 1.5902 3.5517 3.5517z" fill="#000" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 549 B

View File

@@ -0,0 +1,3 @@
<script type="module" src="./interface.tsx"></script>
<div id="root"></div>

View File

@@ -0,0 +1,49 @@
@font-face {
font-family: Inter;
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.9')
format('woff2'),
url('https://rsms.me/inter/font-files/Inter-Regular.woff?v=3.9')
format('woff');
}
:root {
--color-blue: #18a0fb;
--color-black: #333;
}
body {
font-family: Inter, sans-serif;
font-size: 11px;
margin: 0;
}
.search-input {
position: sticky;
top: 0;
border-bottom: 1px solid #e5e5e5;
backface-visibility: hidden;
}
main {
padding-bottom: 8px;
}
.icon-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-gap: 8px;
}
footer {
margin-top: 8px;
padding: 8px;
font-size: 12px;
color: rgba(0, 0, 0, 0.5);
.footer-link {
color: inherit;
}
}

View File

@@ -0,0 +1,67 @@
import { useEffect, useMemo, useState } from 'react'
import { createReactComponent } from 'lucide-react'
import ReactDOM from 'react-dom'
import IconButton from '../components/IconButton'
import SearchInput from '../components/SearchInput'
import useSearch, { Icon } from '../hooks/useSearch'
import { getIcons } from '../api/fetchIcons'
import './interface.scss'
function App() {
const [query, setQuery] = useState('')
const [icons, setIcons] = useState<Icon[]>([])
const [tags, setTags] = useState({})
const [version, setVersion ] = useState('')
const searchResults = useMemo(() => useSearch(icons, tags, query), [icons, query])
const getLatestIcons = async () => {
const lucideIcons = await getIcons()
setIcons(Object.entries(lucideIcons.iconNodes))
setTags(lucideIcons.tags)
setVersion(lucideIcons.version)
}
useEffect(() => {
getLatestIcons()
}, [])
if(!icons.length) {
return null
}
return (
<div>
<SearchInput
value={query}
iconCount={icons.length}
onChange={(event) => setQuery(event.target.value)}
/>
<main>
<div className='icon-grid'>
{searchResults.map(([name, iconNode] :any) => (
<IconButton
name={name}
key={name}
component={createReactComponent(name, iconNode)}
/>
))}
</div>
<footer>
<a
href="https://lucide.dev"
target="_blank"
className='footer-link'
>
Lucide v{version}
</a>
</footer>
</main>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'))

View File

@@ -1,9 +1,97 @@
figma.showUI(__html__, { width: 300, height: 400 })
import type { LucideIcons } from "./api/fetchIcons";
import filterIcons from "./helpers/filterIcons";
figma.ui.onmessage = ({name, svg}) => {
const icon = figma.createNodeFromSvg(svg)
icon.name = name
icon.x = figma.viewport.center.x
icon.y = figma.viewport.center.y
figma.currentPage.selection = [icon]
figma.showUI(__uiFiles__.worker, { visible: false })
let cachedIcons: LucideIcons
const setResults = ({result, query, lucideIcons} : { result: SuggestionResults, query: string, lucideIcons: LucideIcons }) => {
const icons = Object.entries(lucideIcons.iconNodes);
const suggestions = filterIcons(icons, lucideIcons.tags, query.toLowerCase()).map(([name]) => ({
name,
icon: lucideIcons.svgs[name]
}))
result.setSuggestions(suggestions)
}
figma.parameters.on('input', async ({ parameters, key, query, result }) => {
if (key === 'icon-name') {
console.log('typ tpy', query);
cachedIcons = await figma.clientStorage.getAsync(`lucide-icons`)
console.log('cachedIcons', cachedIcons);
if(cachedIcons && cachedIcons.iconNodes && cachedIcons.tags) {
setResults({result, query, lucideIcons: cachedIcons})
}
}
})
const drawIcon = ({icon: {name, svg}}: any) => {
const min = 0
const max = 100
const randomPosition = () => Math.floor(Math.random() * (max - min + 1) + min)
const icon = figma.createNodeFromSvg(svg)
icon.name = name
icon.x = Math.round(figma.viewport.center.x + randomPosition())
icon.y = Math.round(figma.viewport.center.y + randomPosition())
figma.currentPage.selection = [icon]
// lock children
icon.children.forEach((vectorNode, key) => {
icon.children[key].locked = true
});
}
const setCachedIcons = async (pluginMessage: any) => {
if(pluginMessage.lucideIcons) {
await figma.clientStorage.setAsync(`lucide-icons`, pluginMessage.lucideIcons)
}
}
const getCachedIcons = async () => {
cachedIcons = await figma.clientStorage.getAsync(`lucide-icons`)
const response = { type: 'cachedIcons' }
if(cachedIcons) {
Object.assign(response, { cachedIcons })
}
figma.ui.postMessage(response)
}
getCachedIcons()
figma.ui.onmessage = (event) => {
console.log(event, 'main');
switch (event.type) {
case "drawIcon":
drawIcon(event)
break;
case "getCachedIcons":
getCachedIcons()
break;
case "setCachedIcons":
setCachedIcons(event)
break;
case "close":
figma.closePlugin()
break;
default:
break;
}
}
figma.on('run', event => {
if(event.parameters) {
figma.ui.postMessage({ type: 'getSvg', iconName: event.parameters['icon-name'], cachedIcons })
} else {
figma.showUI(__uiFiles__.interface, { width: 300, height: 400 })
}
})

View File

@@ -1,4 +0,0 @@
declare module 'lucide-react';
declare module 'lucide';
declare module 'lucide/icons';
declare module 'lucide/build/icons';

View File

@@ -1,10 +0,0 @@
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.9')
format('woff2'),
url('https://rsms.me/inter/font-files/Inter-Regular.woff?v=3.9')
format('woff');
}

View File

@@ -1 +0,0 @@
<div id="root"></div>

View File

@@ -1,82 +0,0 @@
import { Global, jsx } from '@emotion/core'
import { version } from '../package.json'
import React, { useMemo } from 'react'
import ReactDOM from 'react-dom'
import IconButton from './components/icon-button'
import SearchInput from './components/search-input'
import theme from './theme'
import './ui.css'
import tags from '../../../tags.json'
import * as iconComponents from 'lucide-react'
import { toPascalCase } from './helpers/naming';
import useSearch from '../../../site/src/lib/useSearch';
declare var ICONS: [];
function App() {
const [query, setQuery] = React.useState('')
const icons = ICONS.map(name => {
const componentName = toPascalCase(name);
return {
name,
tags: tags[name] || [],
component: iconComponents[componentName] || null
}
}).filter(({component}) => !!component)
const searchResults = useMemo(() => useSearch(icons, query), [icons, query])
return (
<div>
<Global
styles={{ body: { margin: 0, fontFamily: 'Inter, sans-serif' } }}
/>
<SearchInput
value={query}
iconCount={icons.length}
onChange={event => setQuery(event.target.value)}
css={{
position: 'sticky',
top: 0,
borderBottom: '1px solid #e5e5e5',
backfaceVisibility: 'hidden'
}}
/>
<div css={{ padding: theme.space[2] }}>
<div
css={{
display: 'grid',
gridTemplateColumns: 'repeat(6, 1fr)',
gridGap: theme.space[1],
}}
>
{searchResults.map(({name, component: Icon} :any) => (
<IconButton
name={name}
key={name}
component={Icon}
/>
))}
</div>
<div
css={{
marginTop: theme.space[2],
padding: theme.space[2],
fontSize: theme.fontSizes[0],
color: 'rgba(0, 0, 0, 0.5)',
}}
>
<a
href="https://lucide.dev"
target="_blank"
css={{ color: 'inherit' }}
>
Lucide v{version}
</a>
</div>
</div>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'))

View File

@@ -0,0 +1 @@
<script type="module" src="./worker.ts"></script>

View File

@@ -0,0 +1,60 @@
import { fetchIcons, LucideIcons } from "../api/fetchIcons"
import { createReactComponent } from 'lucide-react'
import { renderToString } from 'react-dom/server'
import { createElement } from "react"
const getLatestIcons = async ({ cachedIcons }: any) => {
const lucideIcons = await fetchIcons(cachedIcons)
parent.postMessage({
pluginMessage: {
type: "latestIcons",
lucideIcons,
}
}, "*")
}
const getSvg = async ({ cachedIcons, iconName }: { cachedIcons: LucideIcons, iconName: string }) => {
if (!cachedIcons) {
return;
}
const iconNode = cachedIcons.iconNodes[iconName];
if (iconNode) {
const IconComponent = createReactComponent(iconName, iconNode)
const svg = renderToString(createElement(IconComponent));
parent.postMessage({ pluginMessage: {
type: 'drawIcon',
icon: { name, svg }
}}, '*')
parent.postMessage({ pluginMessage: {
type: 'close',
}}, '*')
}
}
window.onmessage = async (event) => {
if (!event?.data?.pluginMessage) {
return
}
const { pluginMessage } = event.data
switch (pluginMessage.type) {
case "getLatestIcons":
getLatestIcons(pluginMessage)
break;
case "getSvg":
getSvg(pluginMessage)
break;
default:
break;
}
}
console.log('Hello world!')

View File

@@ -1,12 +1,24 @@
{
"compilerOptions": {
"esModuleInterop": true,
"lib": ["dom", "esnext"],
"jsx": "react",
"jsxFactory": "jsx",
"resolveJsonModule": true,
"strict": true,
"target": "ESNext",
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": false,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": false,
"noEmit": true,
"jsx": "react-jsx",
"typeRoots": [
"./node_modules/@types",
"../../node_modules/@figma"
],
},
"exclude": ["node_modules"],
"include": ["src"]
}

View File

@@ -0,0 +1,40 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { viteSingleFile } from "vite-plugin-singlefile"
import { resolve } from 'path'
const entries = {
main: resolve(__dirname, 'src/main.ts'),
interface: resolve(__dirname, './src/interface/interface.html'),
worker: resolve(__dirname, './src/worker/worker.html'),
}
const input = {};
if(process.env['INPUT']) {
const entry = process.env['INPUT'];
input[entry] = entries[entry]
}
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), viteSingleFile()],
build: {
target: "esnext",
assetsInlineLimit: 100000000,
chunkSizeWarningLimit: 100000000,
cssCodeSplit: false,
brotliSize: false,
emptyOutDir: false,
rollupOptions: {
input,
inlineDynamicImports: true,
output: {
manualChunks: (chunk) => "all.js",
entryFileNames: `assets/[name].js`,
chunkFileNames: `assets/[name].js`,
assetFileNames: `assets/[name].[ext]`
},
},
},
})

View File

@@ -1,48 +0,0 @@
const fs = require('fs');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin');
const webpack = require('webpack');
module.exports = (env, argv) => ({
// This is necessary because Figma's 'eval' works differently than normal eval
devtool: argv.mode === 'production' ? false : 'inline-source-map',
entry: {
ui: './src/ui.tsx',
main: './src/main.ts',
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'build'),
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
{
test: /\.css$/,
loader: [{ loader: 'style-loader' }, { loader: 'css-loader' }],
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
plugins: [
new webpack.DefinePlugin({
ICONS: JSON.stringify(
fs.readdirSync(path.join(process.cwd(), '../../icons')).map(name => name.split('.')[0]),
),
}),
new HtmlWebpackPlugin({
template: './src/ui.html',
filename: 'ui.html',
inlineSource: '.(js)$',
chunks: ['ui'],
}),
new HtmlWebpackInlineSourcePlugin(),
],
});

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@
.pub-cache/
.pub/
build/
assets
pubspec.lock
# Android related
**/android/**/gradle-wrapper.jar

View File

@@ -1,499 +1,12 @@
library lucide_icons;
import "package:flutter/widgets.dart";
import "src/icon_data.dart";
// THIS FILE IS AUTOMATICALLY GENERATED!
class LucideIcons {
static const IconData activity = const LucideIconData(0xf100);
static const IconData airplay = const LucideIconData(0xf101);
static const IconData alarmCheck = const LucideIconData(0xf102);
static const IconData alarmClock = const LucideIconData(0xf103);
static const IconData alarmMinus = const LucideIconData(0xf104);
static const IconData alarmPlus = const LucideIconData(0xf105);
static const IconData album = const LucideIconData(0xf106);
static const IconData alertCircle = const LucideIconData(0xf107);
static const IconData alertOctagon = const LucideIconData(0xf108);
static const IconData alertTriangle = const LucideIconData(0xf109);
static const IconData alignCenter = const LucideIconData(0xf10a);
static const IconData alignJustify = const LucideIconData(0xf10b);
static const IconData alignLeft = const LucideIconData(0xf10c);
static const IconData alignRight = const LucideIconData(0xf10d);
static const IconData anchor = const LucideIconData(0xf10e);
static const IconData aperture = const LucideIconData(0xf10f);
static const IconData archive = const LucideIconData(0xf110);
static const IconData arrowBigDown = const LucideIconData(0xf111);
static const IconData arrowBigLeft = const LucideIconData(0xf112);
static const IconData arrowBigRight = const LucideIconData(0xf113);
static const IconData arrowBigUp = const LucideIconData(0xf114);
static const IconData arrowDown = const LucideIconData(0xf115);
static const IconData arrowDownCircle = const LucideIconData(0xf116);
static const IconData arrowDownLeft = const LucideIconData(0xf117);
static const IconData arrowDownRight = const LucideIconData(0xf118);
static const IconData arrowLeft = const LucideIconData(0xf119);
static const IconData arrowLeftCircle = const LucideIconData(0xf11a);
static const IconData arrowRight = const LucideIconData(0xf11b);
static const IconData arrowRightCircle = const LucideIconData(0xf11c);
static const IconData arrowUp = const LucideIconData(0xf11d);
static const IconData arrowUpCircle = const LucideIconData(0xf11e);
static const IconData arrowUpLeft = const LucideIconData(0xf11f);
static const IconData arrowUpRight = const LucideIconData(0xf120);
static const IconData asterisk = const LucideIconData(0xf121);
static const IconData atSign = const LucideIconData(0xf122);
static const IconData award = const LucideIconData(0xf123);
static const IconData axe = const LucideIconData(0xf124);
static const IconData banknote = const LucideIconData(0xf125);
static const IconData barChart = const LucideIconData(0xf126);
static const IconData barChart2 = const LucideIconData(0xf127);
static const IconData battery = const LucideIconData(0xf128);
static const IconData batteryCharging = const LucideIconData(0xf129);
static const IconData batteryFull = const LucideIconData(0xf12a);
static const IconData batteryLow = const LucideIconData(0xf12b);
static const IconData batteryMedium = const LucideIconData(0xf12c);
static const IconData beaker = const LucideIconData(0xf12d);
static const IconData bell = const LucideIconData(0xf12e);
static const IconData bellMinus = const LucideIconData(0xf12f);
static const IconData bellOff = const LucideIconData(0xf130);
static const IconData bellPlus = const LucideIconData(0xf131);
static const IconData bellRing = const LucideIconData(0xf132);
static const IconData bike = const LucideIconData(0xf133);
static const IconData binary = const LucideIconData(0xf134);
static const IconData bitcoin = const LucideIconData(0xf135);
static const IconData bluetooth = const LucideIconData(0xf136);
static const IconData bluetoothConnected = const LucideIconData(0xf137);
static const IconData bluetoothOff = const LucideIconData(0xf138);
static const IconData bluetoothSearching = const LucideIconData(0xf139);
static const IconData bold = const LucideIconData(0xf13a);
static const IconData book = const LucideIconData(0xf13b);
static const IconData bookOpen = const LucideIconData(0xf13c);
static const IconData bookmark = const LucideIconData(0xf13d);
static const IconData bot = const LucideIconData(0xf13e);
static const IconData box = const LucideIconData(0xf13f);
static const IconData boxSelect = const LucideIconData(0xf140);
static const IconData briefcase = const LucideIconData(0xf141);
static const IconData brush = const LucideIconData(0xf142);
static const IconData bug = const LucideIconData(0xf143);
static const IconData building = const LucideIconData(0xf144);
static const IconData bus = const LucideIconData(0xf145);
static const IconData calculator = const LucideIconData(0xf146);
static const IconData calendar = const LucideIconData(0xf147);
static const IconData camera = const LucideIconData(0xf148);
static const IconData cameraOff = const LucideIconData(0xf149);
static const IconData car = const LucideIconData(0xf14a);
static const IconData cast = const LucideIconData(0xf14b);
static const IconData check = const LucideIconData(0xf14c);
static const IconData checkCircle = const LucideIconData(0xf14d);
static const IconData checkCircle2 = const LucideIconData(0xf14e);
static const IconData checkSquare = const LucideIconData(0xf14f);
static const IconData chevronDown = const LucideIconData(0xf150);
static const IconData chevronLeft = const LucideIconData(0xf151);
static const IconData chevronRight = const LucideIconData(0xf152);
static const IconData chevronUp = const LucideIconData(0xf153);
static const IconData chevronsDown = const LucideIconData(0xf154);
static const IconData chevronsDownUp = const LucideIconData(0xf155);
static const IconData chevronsLeft = const LucideIconData(0xf156);
static const IconData chevronsRight = const LucideIconData(0xf157);
static const IconData chevronsUp = const LucideIconData(0xf158);
static const IconData chevronsUpDown = const LucideIconData(0xf159);
static const IconData chrome = const LucideIconData(0xf15a);
static const IconData circle = const LucideIconData(0xf15b);
static const IconData circleSlashed = const LucideIconData(0xf15c);
static const IconData clipboard = const LucideIconData(0xf15d);
static const IconData clipboardCheck = const LucideIconData(0xf15e);
static const IconData clipboardCopy = const LucideIconData(0xf15f);
static const IconData clipboardList = const LucideIconData(0xf160);
static const IconData clipboardX = const LucideIconData(0xf161);
static const IconData clock = const LucideIconData(0xf162);
static const IconData cloud = const LucideIconData(0xf163);
static const IconData cloudDrizzle = const LucideIconData(0xf164);
static const IconData cloudFog = const LucideIconData(0xf165);
static const IconData cloudHail = const LucideIconData(0xf166);
static const IconData cloudLightning = const LucideIconData(0xf167);
static const IconData cloudMoon = const LucideIconData(0xf168);
static const IconData cloudOff = const LucideIconData(0xf169);
static const IconData cloudRain = const LucideIconData(0xf16a);
static const IconData cloudRainWind = const LucideIconData(0xf16b);
static const IconData cloudSnow = const LucideIconData(0xf16c);
static const IconData cloudSun = const LucideIconData(0xf16d);
static const IconData cloudy = const LucideIconData(0xf16e);
static const IconData clover = const LucideIconData(0xf16f);
static const IconData code = const LucideIconData(0xf170);
static const IconData code2 = const LucideIconData(0xf171);
static const IconData codepen = const LucideIconData(0xf172);
static const IconData codesandbox = const LucideIconData(0xf173);
static const IconData coffee = const LucideIconData(0xf174);
static const IconData coins = const LucideIconData(0xf175);
static const IconData columns = const LucideIconData(0xf176);
static const IconData command = const LucideIconData(0xf177);
static const IconData compass = const LucideIconData(0xf178);
static const IconData contact = const LucideIconData(0xf179);
static const IconData contrast = const LucideIconData(0xf17a);
static const IconData copy = const LucideIconData(0xf17b);
static const IconData copyleft = const LucideIconData(0xf17c);
static const IconData copyright = const LucideIconData(0xf17d);
static const IconData cornerDownLeft = const LucideIconData(0xf17e);
static const IconData cornerDownRight = const LucideIconData(0xf17f);
static const IconData cornerLeftDown = const LucideIconData(0xf180);
static const IconData cornerLeftUp = const LucideIconData(0xf181);
static const IconData cornerRightDown = const LucideIconData(0xf182);
static const IconData cornerRightUp = const LucideIconData(0xf183);
static const IconData cornerUpLeft = const LucideIconData(0xf184);
static const IconData cornerUpRight = const LucideIconData(0xf185);
static const IconData cpu = const LucideIconData(0xf186);
static const IconData creditCard = const LucideIconData(0xf187);
static const IconData crop = const LucideIconData(0xf188);
static const IconData cross = const LucideIconData(0xf189);
static const IconData crosshair = const LucideIconData(0xf18a);
static const IconData crown = const LucideIconData(0xf18b);
static const IconData currency = const LucideIconData(0xf18c);
static const IconData database = const LucideIconData(0xf18d);
static const IconData delete = const LucideIconData(0xf18e);
static const IconData disc = const LucideIconData(0xf18f);
static const IconData divide = const LucideIconData(0xf190);
static const IconData divideCircle = const LucideIconData(0xf191);
static const IconData divideSquare = const LucideIconData(0xf192);
static const IconData dollarSign = const LucideIconData(0xf193);
static const IconData download = const LucideIconData(0xf194);
static const IconData downloadCloud = const LucideIconData(0xf195);
static const IconData dribbble = const LucideIconData(0xf196);
static const IconData droplet = const LucideIconData(0xf197);
static const IconData droplets = const LucideIconData(0xf198);
static const IconData edit = const LucideIconData(0xf199);
static const IconData edit2 = const LucideIconData(0xf19a);
static const IconData edit3 = const LucideIconData(0xf19b);
static const IconData equal = const LucideIconData(0xf19c);
static const IconData equalNot = const LucideIconData(0xf19d);
static const IconData euro = const LucideIconData(0xf19e);
static const IconData expand = const LucideIconData(0xf19f);
static const IconData externalLink = const LucideIconData(0xf1a0);
static const IconData eye = const LucideIconData(0xf1a1);
static const IconData eyeOff = const LucideIconData(0xf1a2);
static const IconData facebook = const LucideIconData(0xf1a3);
static const IconData fastForward = const LucideIconData(0xf1a4);
static const IconData feather = const LucideIconData(0xf1a5);
static const IconData figma = const LucideIconData(0xf1a6);
static const IconData file = const LucideIconData(0xf1a7);
static const IconData fileCheck = const LucideIconData(0xf1a8);
static const IconData fileCheck2 = const LucideIconData(0xf1a9);
static const IconData fileCode = const LucideIconData(0xf1aa);
static const IconData fileDigit = const LucideIconData(0xf1ab);
static const IconData fileInput = const LucideIconData(0xf1ac);
static const IconData fileMinus = const LucideIconData(0xf1ad);
static const IconData fileMinus2 = const LucideIconData(0xf1ae);
static const IconData fileOutput = const LucideIconData(0xf1af);
static const IconData filePlus = const LucideIconData(0xf1b0);
static const IconData filePlus2 = const LucideIconData(0xf1b1);
static const IconData fileSearch = const LucideIconData(0xf1b2);
static const IconData fileText = const LucideIconData(0xf1b3);
static const IconData fileX = const LucideIconData(0xf1b4);
static const IconData fileX2 = const LucideIconData(0xf1b5);
static const IconData files = const LucideIconData(0xf1b6);
static const IconData film = const LucideIconData(0xf1b7);
static const IconData filter = const LucideIconData(0xf1b8);
static const IconData flag = const LucideIconData(0xf1b9);
static const IconData flame = const LucideIconData(0xf1ba);
static const IconData flashlight = const LucideIconData(0xf1bb);
static const IconData flashlightOff = const LucideIconData(0xf1bc);
static const IconData flaskConical = const LucideIconData(0xf1bd);
static const IconData flaskRound = const LucideIconData(0xf1be);
static const IconData folder = const LucideIconData(0xf1bf);
static const IconData folderMinus = const LucideIconData(0xf1c0);
static const IconData folderPlus = const LucideIconData(0xf1c1);
static const IconData formInput = const LucideIconData(0xf1c2);
static const IconData forward = const LucideIconData(0xf1c3);
static const IconData framer = const LucideIconData(0xf1c4);
static const IconData frown = const LucideIconData(0xf1c5);
static const IconData functionSquare = const LucideIconData(0xf1c6);
static const IconData gamepad = const LucideIconData(0xf1c7);
static const IconData gamepad2 = const LucideIconData(0xf1c8);
static const IconData gauge = const LucideIconData(0xf1c9);
static const IconData gavel = const LucideIconData(0xf1ca);
static const IconData ghost = const LucideIconData(0xf1cb);
static const IconData gift = const LucideIconData(0xf1cc);
static const IconData gitBranch = const LucideIconData(0xf1cd);
static const IconData gitBranchPlus = const LucideIconData(0xf1ce);
static const IconData gitCommit = const LucideIconData(0xf1cf);
static const IconData gitMerge = const LucideIconData(0xf1d0);
static const IconData gitPullRequest = const LucideIconData(0xf1d1);
static const IconData github = const LucideIconData(0xf1d2);
static const IconData gitlab = const LucideIconData(0xf1d3);
static const IconData glasses = const LucideIconData(0xf1d4);
static const IconData globe = const LucideIconData(0xf1d5);
static const IconData globe2 = const LucideIconData(0xf1d6);
static const IconData grab = const LucideIconData(0xf1d7);
static const IconData graduationCap = const LucideIconData(0xf1d8);
static const IconData grid = const LucideIconData(0xf1d9);
static const IconData gripHorizontal = const LucideIconData(0xf1da);
static const IconData gripVertical = const LucideIconData(0xf1db);
static const IconData hammer = const LucideIconData(0xf1dc);
static const IconData hand = const LucideIconData(0xf1dd);
static const IconData handMetal = const LucideIconData(0xf1de);
static const IconData hardDrive = const LucideIconData(0xf1df);
static const IconData hardHat = const LucideIconData(0xf1e0);
static const IconData hash = const LucideIconData(0xf1e1);
static const IconData haze = const LucideIconData(0xf1e2);
static const IconData headphones = const LucideIconData(0xf1e3);
static const IconData heart = const LucideIconData(0xf1e4);
static const IconData helpCircle = const LucideIconData(0xf1e5);
static const IconData hexagon = const LucideIconData(0xf1e6);
static const IconData highlighter = const LucideIconData(0xf1e7);
static const IconData history = const LucideIconData(0xf1e8);
static const IconData home = const LucideIconData(0xf1e9);
static const IconData image = const LucideIconData(0xf1ea);
static const IconData imageMinus = const LucideIconData(0xf1eb);
static const IconData imageOff = const LucideIconData(0xf1ec);
static const IconData imagePlus = const LucideIconData(0xf1ed);
static const IconData import = const LucideIconData(0xf1ee);
static const IconData inbox = const LucideIconData(0xf1ef);
static const IconData indent = const LucideIconData(0xf1f0);
static const IconData indianRupee = const LucideIconData(0xf1f1);
static const IconData infinity = const LucideIconData(0xf1f2);
static const IconData info = const LucideIconData(0xf1f3);
static const IconData inspect = const LucideIconData(0xf1f4);
static const IconData instagram = const LucideIconData(0xf1f5);
static const IconData italic = const LucideIconData(0xf1f6);
static const IconData jerseyPound = const LucideIconData(0xf1f7);
static const IconData key = const LucideIconData(0xf1f8);
static const IconData languages = const LucideIconData(0xf1f9);
static const IconData laptop = const LucideIconData(0xf1fa);
static const IconData laptop2 = const LucideIconData(0xf1fb);
static const IconData lasso = const LucideIconData(0xf1fc);
static const IconData lassoSelect = const LucideIconData(0xf1fd);
static const IconData layers = const LucideIconData(0xf1fe);
static const IconData layout = const LucideIconData(0xf1ff);
static const IconData layoutDashboard = const LucideIconData(0xf200);
static const IconData layoutGrid = const LucideIconData(0xf201);
static const IconData layoutList = const LucideIconData(0xf202);
static const IconData layoutTemplate = const LucideIconData(0xf203);
static const IconData library = const LucideIconData(0xf204);
static const IconData lifeBuoy = const LucideIconData(0xf205);
static const IconData lightbulb = const LucideIconData(0xf206);
static const IconData lightbulbOff = const LucideIconData(0xf207);
static const IconData link = const LucideIconData(0xf208);
static const IconData link2 = const LucideIconData(0xf209);
static const IconData link2Off = const LucideIconData(0xf20a);
static const IconData linkedin = const LucideIconData(0xf20b);
static const IconData list = const LucideIconData(0xf20c);
static const IconData listChecks = const LucideIconData(0xf20d);
static const IconData listOrdered = const LucideIconData(0xf20e);
static const IconData loader = const LucideIconData(0xf20f);
static const IconData loader2 = const LucideIconData(0xf210);
static const IconData locate = const LucideIconData(0xf211);
static const IconData locateFixed = const LucideIconData(0xf212);
static const IconData lock = const LucideIconData(0xf213);
static const IconData logIn = const LucideIconData(0xf214);
static const IconData logOut = const LucideIconData(0xf215);
static const IconData mail = const LucideIconData(0xf216);
static const IconData map = const LucideIconData(0xf217);
static const IconData mapPin = const LucideIconData(0xf218);
static const IconData maximize = const LucideIconData(0xf219);
static const IconData maximize2 = const LucideIconData(0xf21a);
static const IconData meh = const LucideIconData(0xf21b);
static const IconData menu = const LucideIconData(0xf21c);
static const IconData messageCircle = const LucideIconData(0xf21d);
static const IconData messageSquare = const LucideIconData(0xf21e);
static const IconData mic = const LucideIconData(0xf21f);
static const IconData micOff = const LucideIconData(0xf220);
static const IconData minimize = const LucideIconData(0xf221);
static const IconData minimize2 = const LucideIconData(0xf222);
static const IconData minus = const LucideIconData(0xf223);
static const IconData minusCircle = const LucideIconData(0xf224);
static const IconData minusSquare = const LucideIconData(0xf225);
static const IconData monitor = const LucideIconData(0xf226);
static const IconData monitorOff = const LucideIconData(0xf227);
static const IconData monitorSpeaker = const LucideIconData(0xf228);
static const IconData moon = const LucideIconData(0xf229);
static const IconData moreHorizontal = const LucideIconData(0xf22a);
static const IconData moreVertical = const LucideIconData(0xf22b);
static const IconData mountain = const LucideIconData(0xf22c);
static const IconData mountainSnow = const LucideIconData(0xf22d);
static const IconData mousePointer = const LucideIconData(0xf22e);
static const IconData mousePointer2 = const LucideIconData(0xf22f);
static const IconData mousePointerClick = const LucideIconData(0xf230);
static const IconData move = const LucideIconData(0xf231);
static const IconData moveDiagonal = const LucideIconData(0xf232);
static const IconData moveDiagonal2 = const LucideIconData(0xf233);
static const IconData moveHorizontal = const LucideIconData(0xf234);
static const IconData moveVertical = const LucideIconData(0xf235);
static const IconData music = const LucideIconData(0xf236);
static const IconData navigation = const LucideIconData(0xf237);
static const IconData navigation2 = const LucideIconData(0xf238);
static const IconData network = const LucideIconData(0xf239);
static const IconData octagon = const LucideIconData(0xf23a);
static const IconData option = const LucideIconData(0xf23b);
static const IconData outdent = const LucideIconData(0xf23c);
static const IconData package = const LucideIconData(0xf23d);
static const IconData palette = const LucideIconData(0xf23e);
static const IconData paperclip = const LucideIconData(0xf23f);
static const IconData pause = const LucideIconData(0xf240);
static const IconData pauseCircle = const LucideIconData(0xf241);
static const IconData pauseOctagon = const LucideIconData(0xf242);
static const IconData penTool = const LucideIconData(0xf243);
static const IconData pencil = const LucideIconData(0xf244);
static const IconData percent = const LucideIconData(0xf245);
static const IconData personStanding = const LucideIconData(0xf246);
static const IconData phone = const LucideIconData(0xf247);
static const IconData phoneCall = const LucideIconData(0xf248);
static const IconData phoneForwarded = const LucideIconData(0xf249);
static const IconData phoneIncoming = const LucideIconData(0xf24a);
static const IconData phoneMissed = const LucideIconData(0xf24b);
static const IconData phoneOff = const LucideIconData(0xf24c);
static const IconData phoneOutgoing = const LucideIconData(0xf24d);
static const IconData pieChart = const LucideIconData(0xf24e);
static const IconData pipette = const LucideIconData(0xf24f);
static const IconData plane = const LucideIconData(0xf250);
static const IconData play = const LucideIconData(0xf251);
static const IconData playCircle = const LucideIconData(0xf252);
static const IconData plugZap = const LucideIconData(0xf253);
static const IconData plus = const LucideIconData(0xf254);
static const IconData plusCircle = const LucideIconData(0xf255);
static const IconData plusSquare = const LucideIconData(0xf256);
static const IconData pocket = const LucideIconData(0xf257);
static const IconData podcast = const LucideIconData(0xf258);
static const IconData pointer = const LucideIconData(0xf259);
static const IconData poundSterling = const LucideIconData(0xf25a);
static const IconData power = const LucideIconData(0xf25b);
static const IconData powerOff = const LucideIconData(0xf25c);
static const IconData printer = const LucideIconData(0xf25d);
static const IconData qrCode = const LucideIconData(0xf25e);
static const IconData radio = const LucideIconData(0xf25f);
static const IconData radioReceiver = const LucideIconData(0xf260);
static const IconData redo = const LucideIconData(0xf261);
static const IconData refreshCcw = const LucideIconData(0xf262);
static const IconData refreshCw = const LucideIconData(0xf263);
static const IconData regex = const LucideIconData(0xf264);
static const IconData repeat = const LucideIconData(0xf265);
static const IconData repeat1 = const LucideIconData(0xf266);
static const IconData reply = const LucideIconData(0xf267);
static const IconData replyAll = const LucideIconData(0xf268);
static const IconData rewind = const LucideIconData(0xf269);
static const IconData rockingChair = const LucideIconData(0xf26a);
static const IconData rotateCcw = const LucideIconData(0xf26b);
static const IconData rotateCw = const LucideIconData(0xf26c);
static const IconData rss = const LucideIconData(0xf26d);
static const IconData ruler = const LucideIconData(0xf26e);
static const IconData russianRuble = const LucideIconData(0xf26f);
static const IconData save = const LucideIconData(0xf270);
static const IconData scale = const LucideIconData(0xf271);
static const IconData scissors = const LucideIconData(0xf272);
static const IconData screenShare = const LucideIconData(0xf273);
static const IconData screenShareOff = const LucideIconData(0xf274);
static const IconData search = const LucideIconData(0xf275);
static const IconData send = const LucideIconData(0xf276);
static const IconData separatorHorizontal = const LucideIconData(0xf277);
static const IconData separatorVertical = const LucideIconData(0xf278);
static const IconData server = const LucideIconData(0xf279);
static const IconData serverCrash = const LucideIconData(0xf27a);
static const IconData serverOff = const LucideIconData(0xf27b);
static const IconData settings = const LucideIconData(0xf27c);
static const IconData share = const LucideIconData(0xf27d);
static const IconData share2 = const LucideIconData(0xf27e);
static const IconData sheet = const LucideIconData(0xf27f);
static const IconData shield = const LucideIconData(0xf280);
static const IconData shieldAlert = const LucideIconData(0xf281);
static const IconData shieldCheck = const LucideIconData(0xf282);
static const IconData shieldClose = const LucideIconData(0xf283);
static const IconData shieldOff = const LucideIconData(0xf284);
static const IconData shirt = const LucideIconData(0xf285);
static const IconData shoppingBag = const LucideIconData(0xf286);
static const IconData shoppingCart = const LucideIconData(0xf287);
static const IconData shovel = const LucideIconData(0xf288);
static const IconData shrink = const LucideIconData(0xf289);
static const IconData shuffle = const LucideIconData(0xf28a);
static const IconData sidebar = const LucideIconData(0xf28b);
static const IconData sidebarClose = const LucideIconData(0xf28c);
static const IconData sidebarOpen = const LucideIconData(0xf28d);
static const IconData sigma = const LucideIconData(0xf28e);
static const IconData skipBack = const LucideIconData(0xf28f);
static const IconData skipForward = const LucideIconData(0xf290);
static const IconData skull = const LucideIconData(0xf291);
static const IconData slack = const LucideIconData(0xf292);
static const IconData slash = const LucideIconData(0xf293);
static const IconData sliders = const LucideIconData(0xf294);
static const IconData smartphone = const LucideIconData(0xf295);
static const IconData smartphoneCharging = const LucideIconData(0xf296);
static const IconData smile = const LucideIconData(0xf297);
static const IconData snowflake = const LucideIconData(0xf298);
static const IconData sortAsc = const LucideIconData(0xf299);
static const IconData sortDesc = const LucideIconData(0xf29a);
static const IconData speaker = const LucideIconData(0xf29b);
static const IconData sprout = const LucideIconData(0xf29c);
static const IconData square = const LucideIconData(0xf29d);
static const IconData star = const LucideIconData(0xf29e);
static const IconData starHalf = const LucideIconData(0xf29f);
static const IconData stopCircle = const LucideIconData(0xf2a0);
static const IconData strikethrough = const LucideIconData(0xf2a1);
static const IconData sun = const LucideIconData(0xf2a2);
static const IconData sunrise = const LucideIconData(0xf2a3);
static const IconData sunset = const LucideIconData(0xf2a4);
static const IconData swissFranc = const LucideIconData(0xf2a5);
static const IconData switchCamera = const LucideIconData(0xf2a6);
static const IconData table = const LucideIconData(0xf2a7);
static const IconData tablet = const LucideIconData(0xf2a8);
static const IconData tag = const LucideIconData(0xf2a9);
static const IconData target = const LucideIconData(0xf2aa);
static const IconData tent = const LucideIconData(0xf2ab);
static const IconData terminal = const LucideIconData(0xf2ac);
static const IconData terminalSquare = const LucideIconData(0xf2ad);
static const IconData thermometer = const LucideIconData(0xf2ae);
static const IconData thermometerSnowflake = const LucideIconData(0xf2af);
static const IconData thermometerSun = const LucideIconData(0xf2b0);
static const IconData thumbsDown = const LucideIconData(0xf2b1);
static const IconData thumbsUp = const LucideIconData(0xf2b2);
static const IconData ticket = const LucideIconData(0xf2b3);
static const IconData timer = const LucideIconData(0xf2b4);
static const IconData toggleLeft = const LucideIconData(0xf2b5);
static const IconData toggleRight = const LucideIconData(0xf2b6);
static const IconData tornado = const LucideIconData(0xf2b7);
static const IconData trash = const LucideIconData(0xf2b8);
static const IconData trash2 = const LucideIconData(0xf2b9);
static const IconData trello = const LucideIconData(0xf2ba);
static const IconData trendingDown = const LucideIconData(0xf2bb);
static const IconData trendingUp = const LucideIconData(0xf2bc);
static const IconData triangle = const LucideIconData(0xf2bd);
static const IconData truck = const LucideIconData(0xf2be);
static const IconData tv = const LucideIconData(0xf2bf);
static const IconData tv2 = const LucideIconData(0xf2c0);
static const IconData twitch = const LucideIconData(0xf2c1);
static const IconData twitter = const LucideIconData(0xf2c2);
static const IconData type = const LucideIconData(0xf2c3);
static const IconData umbrella = const LucideIconData(0xf2c4);
static const IconData underline = const LucideIconData(0xf2c5);
static const IconData undo = const LucideIconData(0xf2c6);
static const IconData unlink = const LucideIconData(0xf2c7);
static const IconData unlink2 = const LucideIconData(0xf2c8);
static const IconData unlock = const LucideIconData(0xf2c9);
static const IconData upload = const LucideIconData(0xf2ca);
static const IconData uploadCloud = const LucideIconData(0xf2cb);
static const IconData user = const LucideIconData(0xf2cc);
static const IconData userCheck = const LucideIconData(0xf2cd);
static const IconData userMinus = const LucideIconData(0xf2ce);
static const IconData userPlus = const LucideIconData(0xf2cf);
static const IconData userX = const LucideIconData(0xf2d0);
static const IconData users = const LucideIconData(0xf2d1);
static const IconData vibrate = const LucideIconData(0xf2d2);
static const IconData video = const LucideIconData(0xf2d3);
static const IconData videoOff = const LucideIconData(0xf2d4);
static const IconData view = const LucideIconData(0xf2d5);
static const IconData voicemail = const LucideIconData(0xf2d6);
static const IconData volume = const LucideIconData(0xf2d7);
static const IconData volume1 = const LucideIconData(0xf2d8);
static const IconData volume2 = const LucideIconData(0xf2d9);
static const IconData volumeX = const LucideIconData(0xf2da);
static const IconData wallet = const LucideIconData(0xf2db);
static const IconData watch = const LucideIconData(0xf2dc);
static const IconData webcam = const LucideIconData(0xf2dd);
static const IconData wifi = const LucideIconData(0xf2de);
static const IconData wifiOff = const LucideIconData(0xf2df);
static const IconData wind = const LucideIconData(0xf2e0);
static const IconData wrench = const LucideIconData(0xf2e1);
static const IconData x = const LucideIconData(0xf2e2);
static const IconData xCircle = const LucideIconData(0xf2e3);
static const IconData xOctagon = const LucideIconData(0xf2e4);
static const IconData xSquare = const LucideIconData(0xf2e5);
static const IconData youtube = const LucideIconData(0xf2e6);
static const IconData zap = const LucideIconData(0xf2e7);
static const IconData zapOff = const LucideIconData(0xf2e8);
static const IconData zoomIn = const LucideIconData(0xf2e9);
static const IconData zoomOut = const LucideIconData(0xf2ea);
// Icons will be generated here..
// static const IconData {icon_name} = const LucideIconData({icon_hex});
// ...
}

View File

@@ -1,175 +0,0 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.1"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
html:
dependency: "direct dev"
description:
name: html
url: "https://pub.dartlang.org"
source: hosted
version: "0.15.0"
lint:
dependency: "direct dev"
description:
name: lint
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.0"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
recase:
dependency: "direct dev"
description:
name: recase
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.0"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
sdks:
dart: ">=2.13.0 <3.0.0"
flutter: ">=1.17.0"

View File

@@ -1,6 +1,6 @@
name: lucide_icons
description: A Lucide icon library package for Flutter applications.
version: 0.16.5
description: A Lucide icon library package for Flutter applications. Fork of Feather Icons, open for anyone to contribute icons.
version: 0.16.12
homepage: https://lucide.dev
repository: https://github.com/lucide-icons/lucide
@@ -23,4 +23,4 @@ flutter:
fonts:
- family: Lucide
fonts:
- asset: assets/Lucide.ttf
- asset: assets/lucide.ttf

View File

@@ -0,0 +1,147 @@
// Tests adapted from https://github.com/fluttercommunity/font_awesome_flutter/blob/master/test/fa_icon_test.dart
// Copyright 2014 The Flutter Authors. All rights reserved.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:lucide_icons/lucide_icons.dart';
void main() {
testWidgets('Can set opacity for an Icon', (WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: IconTheme(
data: IconThemeData(
color: Color(0xFF666666),
opacity: 0.5,
),
child: Icon(LucideIcons.bot),
),
),
);
final RichText text = tester.widget(find.byType(RichText));
expect(text.text.style!.color, const Color(0xFF666666).withOpacity(0.5));
});
testWidgets('Icon sizing - no theme, default size',
(WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Icon(LucideIcons.bot),
),
),
);
final RenderBox renderObject = tester.renderObject(find.byType(Icon));
expect(renderObject.size, equals(const Size.square(24.0)));
});
testWidgets('Icon sizing - no theme, explicit size',
(WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Icon(
LucideIcons.bot,
size: 96.0,
),
),
),
);
final RenderBox renderObject = tester.renderObject(find.byType(Icon));
expect(renderObject.size, equals(const Size.square(96.0)));
});
testWidgets('Icon sizing - sized theme', (WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: IconTheme(
data: IconThemeData(size: 36.0),
child: Icon(LucideIcons.bot),
),
),
),
);
final RenderBox renderObject = tester.renderObject(find.byType(Icon));
expect(renderObject.size, equals(const Size.square(36.0)));
});
testWidgets('Icon sizing - sized theme, explicit size',
(WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: IconTheme(
data: IconThemeData(size: 36.0),
child: Icon(
LucideIcons.bot,
size: 48.0,
),
),
),
),
);
final RenderBox renderObject = tester.renderObject(find.byType(Icon));
expect(renderObject.size, equals(const Size.square(48.0)));
});
testWidgets('Icon sizing - sizeless theme, default size',
(WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: IconTheme(
data: IconThemeData(),
child: Icon(LucideIcons.bot),
),
),
),
);
final RenderBox renderObject = tester.renderObject(find.byType(Icon));
expect(renderObject.size, equals(const Size.square(24.0)));
});
testWidgets("Changing semantic label from null doesn't rebuild tree ",
(WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Icon(LucideIcons.bot),
),
),
);
final Element richText1 = tester.element(find.byType(RichText));
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Icon(
LucideIcons.bot,
semanticLabel: 'a label',
),
),
),
);
final Element richText2 = tester.element(find.byType(RichText));
// Compare a leaf Element in the Icon subtree before and after changing the
// semanticLabel to make sure the subtree was not rebuilt.
expect(richText2, same(richText1));
});
}

View File

@@ -1,7 +1,7 @@
{
"name": "lucide-preact",
"description": "A Lucide icon library package for Preact applications",
"version": "0.16.5",
"version": "0.16.12",
"license": "ISC",
"homepage": "https://lucide.dev",
"bugs": "https://github.com/lucide-icons/lucide/issues",

View File

@@ -1,7 +1,7 @@
{
"name": "lucide-react",
"description": "A Lucide icon library package for React applications",
"version": "0.16.5",
"version": "0.16.12",
"license": "ISC",
"homepage": "https://lucide.dev",
"bugs": "https://github.com/lucide-icons/lucide/issues",

View File

@@ -1,10 +1,16 @@
import path from "path";
import {appendFile, readSvgDirectory, resetFile, toPascalCase, writeFile} from "../../../scripts/helpers";
import path from 'path';
import {
appendFile,
readSvgDirectory,
resetFile,
toPascalCase,
writeFile,
} from '../../../scripts/helpers';
const srcDirectory=path.join(__dirname, "../dist");
const srcDirectory = path.join(__dirname, '../dist');
// Declare type definitions
const typeDefinitions=`\
const typeDefinitions = `\
/// <reference types="react" />
import { SVGAttributes } from 'react'
@@ -15,6 +21,8 @@ export interface LucideProps extends Partial<React.SVGProps<SVGSVGElement>> {
size?: string | number
}
export declare const createReactComponent: (iconName: string, iconNode: any[]) => (props: LucideProps) => JSX.Element;
export type Icon = React.FC<LucideProps>;
// Generated icons

View File

@@ -1 +1,2 @@
export * from './icons';
export { default as createReactComponent } from './createReactComponent';

View File

@@ -1,6 +1,6 @@
{
"name": "lucide-vue-next",
"version": "0.16.5",
"version": "0.16.12",
"author": "Eric Fennis",
"description": "A Lucide icon library package for Vue 3 applications",
"license": "ISC",

View File

@@ -1,7 +1,6 @@
import path from 'path';
import { readSvgDirectory, resetFile, appendFile, toPascalCase } from '../../../scripts/helpers';
import defaultAttributes from '../src/defaultAttributes';
const TARGET_DIR = path.join(__dirname, '../dist');
const ICONS_DIR = path.resolve(__dirname, '../../../icons');
@@ -9,11 +8,13 @@ const TYPES_FILE_NAME = 'lucide-vue-next.d.ts';
// Generates header of d.ts file include some types and functions
const typeDefinitions = `\
import { Component } from 'vue';
import { SVGAttributes, VNode } from 'vue';
declare module 'lucide-vue-next'
// Create interface extending SVGAttributes
export interface SVGProps extends Partial<SVGElement> ${JSON.stringify(defaultAttributes, null, 2)}
export interface SVGProps extends Partial<SVGAttributes> {
size?: 24 | number
}
// Generated icons
`;
@@ -28,7 +29,7 @@ svgFiles.forEach(svgFile => {
const componentName = toPascalCase(nameSvg);
appendFile(
`export declare const ${componentName}: (props: SVGProps) => Component;\n`,
`export declare const ${componentName}: (props: SVGProps) => FunctionalComponent<SVGProps>;\n`,
TYPES_FILE_NAME,
TARGET_DIR,
);

View File

@@ -1,6 +1,6 @@
{
"name": "lucide-vue",
"version": "0.16.5",
"version": "0.16.12",
"author": "Eric Fennis",
"description": "A Lucide icon library package for Vue 2 applications",
"license": "ISC",

View File

@@ -1,7 +1,7 @@
{
"name": "lucide",
"description": "A Lucide icon library package for web and javascript applications.",
"version": "0.16.5",
"version": "0.16.12",
"license": "ISC",
"homepage": "https://lucide.dev",
"bugs": "https://github.com/lucide-icons/lucide/issues",

View File

@@ -10,9 +10,11 @@ const TYPES_FILE_NAME = 'lucide.d.ts';
// Generates header of d.ts file include some types and functions
const typeDefinitions = `\
declare module 'lucide'
export interface SVGProps extends Partial<SVGElement> ${JSON.stringify(defaultAttributes, null, 2)}
export declare type IconNode = readonly [tag: string, attrs:SVGProps, children?:IconNode];
export declare type IconNodeChild = readonly [string, object];
export declare type IconNode = readonly [tag: string, attrs: SVGProps, children?: IconNodeChild[]];
export declare type CustomAttrs = { [attr:string]: any }
export type Icons = { [key: string]: IconNode }

View File

@@ -1102,6 +1102,27 @@
"number",
"order"
],
"list-plus": [
"playlist",
"add",
"song",
"track",
"new"
],
"list-minus": [
"playlist",
"remove",
"song",
"subtract",
"remove",
"delete"
],
"list-x": [
"playlist",
"subtract",
"remove",
"delete"
],
"loader": [
"load",
"wait"
@@ -1988,6 +2009,9 @@
"group",
"people"
],
"verified": [
"check"
],
"video": [
"camera",
"movie",
@@ -2050,6 +2074,12 @@
"air",
"blow"
],
"wrap-text": [
"words",
"lines",
"break",
"paragraph"
],
"wrench": [
"tool",
"settings",

4815
yarn.lock

File diff suppressed because it is too large Load Diff