mirror of
https://github.com/lucide-icons/lucide.git
synced 2025-12-17 20:17:40 +01:00
Compare commits
463 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a33e90c65 | ||
|
|
062a64a078 | ||
|
|
95a1ea7255 | ||
|
|
a0a5bc8fc2 | ||
|
|
698eded89b | ||
|
|
a70b713572 | ||
|
|
34530ad805 | ||
|
|
f73aed151a | ||
|
|
2bd7748562 | ||
|
|
da8a6c5a1b | ||
|
|
5736028dfa | ||
|
|
45d2063340 | ||
|
|
f71d3ffd1d | ||
|
|
b8c3a5fa0b | ||
|
|
a4076db69b | ||
|
|
55cb681461 | ||
|
|
09d9bb747d | ||
|
|
42f9cdceca | ||
|
|
c652723b32 | ||
|
|
a44328d8be | ||
|
|
376568239f | ||
|
|
92d05b5fca | ||
|
|
27b5b7eaad | ||
|
|
4de1355e54 | ||
|
|
c8d94bf3e1 | ||
|
|
a128d1c3c1 | ||
|
|
e145cb05e2 | ||
|
|
759ff562fd | ||
|
|
ae2899a09e | ||
|
|
8b7ea73aa3 | ||
|
|
1bdeae5364 | ||
|
|
0e307087f6 | ||
|
|
a46114b3e7 | ||
|
|
fcafe0e7b7 | ||
|
|
5312982b8f | ||
|
|
3a13fab009 | ||
|
|
30a69ee670 | ||
|
|
5f442122ab | ||
|
|
e78d910a83 | ||
|
|
ccc8dc2b34 | ||
|
|
96bcca0e08 | ||
|
|
d95b14a70b | ||
|
|
a852a43ef4 | ||
|
|
4953a95e36 | ||
|
|
cad1b95b69 | ||
|
|
92f3fb0f90 | ||
|
|
6e8895d075 | ||
|
|
a1b2ce5b7b | ||
|
|
4a54e87e84 | ||
|
|
d8bdbff9c6 | ||
|
|
70cffa8dd2 | ||
|
|
8cff59627b | ||
|
|
b684a0083b | ||
|
|
9fb4b0b161 | ||
|
|
9ec40ae506 | ||
|
|
890514de6c | ||
|
|
9463b2e445 | ||
|
|
0221022e24 | ||
|
|
751f7cb1e3 | ||
|
|
4c90b84236 | ||
|
|
01be733532 | ||
|
|
4ffa38e013 | ||
|
|
0a38dccdae | ||
|
|
3391b5b717 | ||
|
|
5c145f4e72 | ||
|
|
74429a8e92 | ||
|
|
1e99499dc8 | ||
|
|
724a43e3f0 | ||
|
|
fb79059fca | ||
|
|
9a54838538 | ||
|
|
c7438c0c10 | ||
|
|
667ae303f8 | ||
|
|
dc1d17181f | ||
|
|
26abdb904d | ||
|
|
cf0264745e | ||
|
|
510a5ec3b9 | ||
|
|
e1bc19be4e | ||
|
|
062894e113 | ||
|
|
eaa99b35f6 | ||
|
|
7c22ccfab4 | ||
|
|
e0e171db81 | ||
|
|
3b11552e5e | ||
|
|
d8b455b614 | ||
|
|
79eecc89f6 | ||
|
|
b943430a08 | ||
|
|
cebb0ee84b | ||
|
|
210c56807e | ||
|
|
c2a8f31176 | ||
|
|
a3f70d5b8b | ||
|
|
c97c6ed9e4 | ||
|
|
e9d69c6948 | ||
|
|
270c935cd4 | ||
|
|
b7377d21eb | ||
|
|
7ccf155ad4 | ||
|
|
c696d1e907 | ||
|
|
a8cf24e75a | ||
|
|
4e2773bd2d | ||
|
|
7c8f898893 | ||
|
|
c3951d36c7 | ||
|
|
f958310d91 | ||
|
|
d00cbebcc4 | ||
|
|
3619dfa7f2 | ||
|
|
c844bc668f | ||
|
|
32dec05e0b | ||
|
|
5394d7fceb | ||
|
|
8dea4c7b7f | ||
|
|
b8a595275d | ||
|
|
a7b3ecde63 | ||
|
|
8bcfc225ce | ||
|
|
1d608db223 | ||
|
|
c1cb5d9bc2 | ||
|
|
66f51474cd | ||
|
|
af0b16bc10 | ||
|
|
46d6c3c119 | ||
|
|
d3b8510602 | ||
|
|
97e0f30627 | ||
|
|
24676ddc8e | ||
|
|
92689a3328 | ||
|
|
b578269ecb | ||
|
|
d041a2b02a | ||
|
|
0253326b17 | ||
|
|
275c2cbc69 | ||
|
|
4bd6a273db | ||
|
|
34155d48e7 | ||
|
|
82db590192 | ||
|
|
70be55b78f | ||
|
|
7163aeaa6b | ||
|
|
99cd76bb35 | ||
|
|
f5fb1ec263 | ||
|
|
6916aebee4 | ||
|
|
65d213264f | ||
|
|
ee77147aff | ||
|
|
3b7b74fe86 | ||
|
|
3a2f052ce9 | ||
|
|
cf34d61971 | ||
|
|
2814a63b8f | ||
|
|
4bcab462dc | ||
|
|
6c93bb97c7 | ||
|
|
3c1993c463 | ||
|
|
7a57c306c3 | ||
|
|
32637199f5 | ||
|
|
e490bc35b8 | ||
|
|
496058cc15 | ||
|
|
4ee46673af | ||
|
|
5a46f4b87c | ||
|
|
875e8a2d06 | ||
|
|
e006a171c1 | ||
|
|
606706e8e0 | ||
|
|
ffc03ea1f6 | ||
|
|
b2e685262b | ||
|
|
5bfc736b61 | ||
|
|
2ebf99f591 | ||
|
|
7a17a2f343 | ||
|
|
4b5d343791 | ||
|
|
b19b01d323 | ||
|
|
d2dc5bf75f | ||
|
|
9b93200567 | ||
|
|
a878596572 | ||
|
|
9d50c05937 | ||
|
|
6196c261d3 | ||
|
|
85cec0dea1 | ||
|
|
07039b7619 | ||
|
|
cf05bd766f | ||
|
|
f05855d1d1 | ||
|
|
6f39d3743a | ||
|
|
7ed206af4a | ||
|
|
95daa7c313 | ||
|
|
17ecb92946 | ||
|
|
9ef9921f04 | ||
|
|
ac08bb92c1 | ||
|
|
53109037ec | ||
|
|
66de90d63e | ||
|
|
f3c7e44a3d | ||
|
|
3823993c39 | ||
|
|
36c53f956a | ||
|
|
58c652908a | ||
|
|
f4d887339e | ||
|
|
bde11234ea | ||
|
|
3449097f77 | ||
|
|
aec41eae39 | ||
|
|
3da3cbc63f | ||
|
|
3fc3122054 | ||
|
|
871de752e7 | ||
|
|
25d7b55459 | ||
|
|
4d8a8091b6 | ||
|
|
a17c1aafbd | ||
|
|
d1d6eec36e | ||
|
|
abec311bc9 | ||
|
|
3df9be04a8 | ||
|
|
016c9d1fac | ||
|
|
17f9509f71 | ||
|
|
b6c7434e92 | ||
|
|
47aa3c2664 | ||
|
|
e50b03f316 | ||
|
|
0065b5952b | ||
|
|
b35b586eda | ||
|
|
8b57fab71b | ||
|
|
badd34374d | ||
|
|
902431199c | ||
|
|
bdbb4834b0 | ||
|
|
07fc4da6fa | ||
|
|
e1815242cf | ||
|
|
d104ad5c8a | ||
|
|
69989c5ae5 | ||
|
|
9e996ef63c | ||
|
|
6ec9cc3dcf | ||
|
|
01fa96ced3 | ||
|
|
481b27cc49 | ||
|
|
c5df7e73c6 | ||
|
|
428088436d | ||
|
|
eec2c97595 | ||
|
|
f0529b9ef7 | ||
|
|
0c216b41c5 | ||
|
|
ac892e5476 | ||
|
|
38f62a571c | ||
|
|
507750d0a7 | ||
|
|
33a0ed9539 | ||
|
|
37cb860ebe | ||
|
|
bd74ac880e | ||
|
|
e81b76f445 | ||
|
|
c50c0e435b | ||
|
|
afd2db296c | ||
|
|
175b2cd483 | ||
|
|
716c5baea0 | ||
|
|
890474889a | ||
|
|
e596cd2bad | ||
|
|
d4641a4641 | ||
|
|
3e3409cee2 | ||
|
|
477f2b2aff | ||
|
|
000ff56278 | ||
|
|
7117220943 | ||
|
|
f820da257d | ||
|
|
de629f0fcc | ||
|
|
8f7e9b3cde | ||
|
|
4e79f147cf | ||
|
|
3482cd0949 | ||
|
|
701f2a1a41 | ||
|
|
79f5c6e584 | ||
|
|
02fddd3aac | ||
|
|
7816ed88f6 | ||
|
|
9c2d57b0dc | ||
|
|
6d9a0c3d63 | ||
|
|
6f647c58bf | ||
|
|
41375d5b05 | ||
|
|
11ce2b6ff3 | ||
|
|
cc7881e759 | ||
|
|
bf530d39d3 | ||
|
|
71e8df6354 | ||
|
|
cafd2a838b | ||
|
|
e16f368502 | ||
|
|
d38509a03d | ||
|
|
6550e22874 | ||
|
|
22193420c7 | ||
|
|
70827d4571 | ||
|
|
7d980f6cc1 | ||
|
|
67131489c8 | ||
|
|
ebf03a5434 | ||
|
|
8fda42c719 | ||
|
|
b17627b82d | ||
|
|
84ec1620a8 | ||
|
|
a87ae2a92b | ||
|
|
f35f45c7b3 | ||
|
|
c9a418dfc4 | ||
|
|
70be608a58 | ||
|
|
db311ab023 | ||
|
|
cac81636fb | ||
|
|
4b225a2e80 | ||
|
|
8aac1c7ba6 | ||
|
|
d513a2b9df | ||
|
|
204a418643 | ||
|
|
36039d8bdc | ||
|
|
49bd49b843 | ||
|
|
4679ff791d | ||
|
|
bfab755958 | ||
|
|
63aa17a001 | ||
|
|
db6194369d | ||
|
|
29c952fdaf | ||
|
|
637e285c52 | ||
|
|
d6ee5d963c | ||
|
|
97d02ec6e5 | ||
|
|
f5be205fc9 | ||
|
|
f2e0da9bb1 | ||
|
|
2ca852fc7d | ||
|
|
a64215bb25 | ||
|
|
6d975609c4 | ||
|
|
13b9c1fadb | ||
|
|
dcf396f1e3 | ||
|
|
debf9b77c1 | ||
|
|
d30f3fe0c5 | ||
|
|
7d0f9996e6 | ||
|
|
c263c8baee | ||
|
|
c61207c0ac | ||
|
|
ec5327b870 | ||
|
|
61d3c6f452 | ||
|
|
d777895135 | ||
|
|
846a74ef50 | ||
|
|
3901a12d78 | ||
|
|
f9c49d9973 | ||
|
|
08b04f84b7 | ||
|
|
f3a97ed59e | ||
|
|
01663fb90b | ||
|
|
97aec42fb2 | ||
|
|
05eaf17ef9 | ||
|
|
e4d3a74434 | ||
|
|
de6b172e0a | ||
|
|
348628329d | ||
|
|
38d5093b1d | ||
|
|
3014d0aa32 | ||
|
|
a418010baa | ||
|
|
329d75a2c1 | ||
|
|
2482416aef | ||
|
|
11d7b48d70 | ||
|
|
5cbf9363cf | ||
|
|
92531a8a86 | ||
|
|
c67655d402 | ||
|
|
edc614bf43 | ||
|
|
ded24ab61f | ||
|
|
b626e91d7c | ||
|
|
a68ea8c33e | ||
|
|
4fd815a46c | ||
|
|
0e180515a3 | ||
|
|
5dbae5df45 | ||
|
|
bcad75bddd | ||
|
|
78a0640832 | ||
|
|
05ea32948c | ||
|
|
2e11931d2b | ||
|
|
689b3e1d83 | ||
|
|
8ec672bd86 | ||
|
|
c096bf2325 | ||
|
|
a796cb105d | ||
|
|
e4ac2cc4e9 | ||
|
|
2ee208652f | ||
|
|
d0826259d1 | ||
|
|
3acbfb428b | ||
|
|
250bd20199 | ||
|
|
221e213292 | ||
|
|
1e48aecbfe | ||
|
|
7a6dc5b2f7 | ||
|
|
7f6999fee7 | ||
|
|
08c1bc68da | ||
|
|
930260aab5 | ||
|
|
96473f7f7d | ||
|
|
f620c85e3b | ||
|
|
f4a8f3d0d8 | ||
|
|
36725eeed9 | ||
|
|
ee7ee203e6 | ||
|
|
7a26dddbcb | ||
|
|
408c683a13 | ||
|
|
546cf61a2e | ||
|
|
a7496aa454 | ||
|
|
93cfd3d27d | ||
|
|
76ce22ef14 | ||
|
|
873997b48e | ||
|
|
03276eee9d | ||
|
|
cf5aa0534b | ||
|
|
cccf89e7bb | ||
|
|
2d4676160b | ||
|
|
6346d80ee7 | ||
|
|
e983ccf974 | ||
|
|
f0fe196872 | ||
|
|
85eaa5fc50 | ||
|
|
6a7732077a | ||
|
|
c1c0f99d65 | ||
|
|
ee2bfaff0d | ||
|
|
9370449d7e | ||
|
|
244a5a396e | ||
|
|
2396a53bad | ||
|
|
07a78731a5 | ||
|
|
4e2449dc9f | ||
|
|
f02067ea55 | ||
|
|
57a72cbb38 | ||
|
|
0baf1a49ef | ||
|
|
0879262bdb | ||
|
|
9a41d931e9 | ||
|
|
7c111a53e1 | ||
|
|
7209ed3fcd | ||
|
|
e85dffa9b4 | ||
|
|
0c3d6cd097 | ||
|
|
72c25a9936 | ||
|
|
5226c326f8 | ||
|
|
de2e3036c0 | ||
|
|
8adeb025a6 | ||
|
|
22ffb58649 | ||
|
|
278309fe55 | ||
|
|
bcbae1e406 | ||
|
|
1173134099 | ||
|
|
894993478f | ||
|
|
36f84a74f6 | ||
|
|
1479a9dbd8 | ||
|
|
2485f6117a | ||
|
|
0bbaaa8abd | ||
|
|
a82af02687 | ||
|
|
a5be1b4101 | ||
|
|
639c0e8d85 | ||
|
|
b863445492 | ||
|
|
8c4a41035b | ||
|
|
4a55ae4b91 | ||
|
|
30f683a192 | ||
|
|
25e0aaf33c | ||
|
|
3cd84c8adf | ||
|
|
096ce92866 | ||
|
|
57abe654b1 | ||
|
|
852da97d46 | ||
|
|
ba86ca5ef0 | ||
|
|
f2e325264f | ||
|
|
de366a1cb0 | ||
|
|
5f5cec5b58 | ||
|
|
2ccd5b7422 | ||
|
|
e38137822d | ||
|
|
a9fef9f6b0 | ||
|
|
f646d84559 | ||
|
|
6f6ffa2478 | ||
|
|
76326cb289 | ||
|
|
13a3f565b6 | ||
|
|
b0f2e084d8 | ||
|
|
fc78d27cc3 | ||
|
|
9b0d0edb61 | ||
|
|
6a5f8d3755 | ||
|
|
35c96ab61f | ||
|
|
8fd8007c96 | ||
|
|
621cf6b290 | ||
|
|
a5ce1df506 | ||
|
|
c784dd09c7 | ||
|
|
0f11acdd7f | ||
|
|
2149645895 | ||
|
|
fa6ed02297 | ||
|
|
4a2c6ed8b0 | ||
|
|
f67dfab128 | ||
|
|
c3b9cff578 | ||
|
|
9ba4f8c359 | ||
|
|
dd5a5b16f6 | ||
|
|
a1f9a95322 | ||
|
|
7572d2d6c8 | ||
|
|
58370d63dc | ||
|
|
6552a4cca1 | ||
|
|
dace5a9f9c | ||
|
|
90f32d38a2 | ||
|
|
619b7040da | ||
|
|
04ada85c0f | ||
|
|
17ccaeea75 | ||
|
|
692faadd91 | ||
|
|
89a8274246 | ||
|
|
26987c6eda | ||
|
|
bf8db289a3 | ||
|
|
50f0eaec4b | ||
|
|
dbe35c4f69 | ||
|
|
c3056b9ce6 | ||
|
|
b016ea08f8 | ||
|
|
8e041c3c17 | ||
|
|
e3d2525994 | ||
|
|
e846b725f6 | ||
|
|
b924c0a70b | ||
|
|
0d6e89332e | ||
|
|
6ecf908ded | ||
|
|
f623ac6362 | ||
|
|
e3644e1419 | ||
|
|
84e09058b2 | ||
|
|
3e4bde1d39 | ||
|
|
164854c636 | ||
|
|
2d1214fc37 | ||
|
|
d528fb728a | ||
|
|
53d7b772ef | ||
|
|
c73fbb6159 |
@@ -34,6 +34,7 @@ module.exports = {
|
|||||||
parserOptions: {
|
parserOptions: {
|
||||||
tsconfigRootDir: __dirname,
|
tsconfigRootDir: __dirname,
|
||||||
project: ['./site/tsconfig.json', './packages/*/tsconfig.json'],
|
project: ['./site/tsconfig.json', './packages/*/tsconfig.json'],
|
||||||
ecmaVersion: 2020,
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
open_collective: lucide-icons
|
||||||
49
.github/ISSUE_TEMPLATE/01_icon_request.yml
vendored
Normal file
49
.github/ISSUE_TEMPLATE/01_icon_request.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
name: Icon request
|
||||||
|
description: Suggest a new icon for this project
|
||||||
|
labels: ['🙌 icon request']
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Before submitting an icon request check if it has already been requested. If there is an open request, please add a 👍.
|
||||||
|
|
||||||
|
**Important note**: No new brand logos are allowed, see https://github.com/lucide-icons/lucide/issues/670.
|
||||||
|
Existing brand icons will also be phased out. For brand icons, consider using https://simpleicons.org, which offers purpose-built SVGs that are also on a 24×24px grid.
|
||||||
|
- type: input
|
||||||
|
id: name
|
||||||
|
attributes:
|
||||||
|
label: Icon name
|
||||||
|
description: What should this icon depict? For multiple icons, provide a comma-separated list.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: use-cases
|
||||||
|
attributes:
|
||||||
|
label: Use cases
|
||||||
|
description: Why do you need this icon? Include at least two real-life use cases per requested icon, avoiding generic descriptions like "it's a car icon".
|
||||||
|
placeholder: e.g. I need a star icon to use in my rating system.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: design-ideas
|
||||||
|
attributes:
|
||||||
|
label: Design ideas
|
||||||
|
description: What should this icon look like? Provide simple, minimalistic icon examples from other sets or your own drafts to help us visualize your request.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
description: Please review the following checklist before submitting your request.
|
||||||
|
options:
|
||||||
|
- label: I have searched if someone has submitted a similar issue before and there weren't any. (Please make sure to also search closed issues, as this issue might already have been resolved.)
|
||||||
|
required: true
|
||||||
|
- label: I have searched existing icons to make sure it does not already exist and I didn't find any.
|
||||||
|
required: true
|
||||||
|
- label: I am not requesting a brand logo and the art is not protected by copyright.
|
||||||
|
required: true
|
||||||
|
- label: I am not requesting an icon that includes religious, political imagery or hate symbols.
|
||||||
|
required: true
|
||||||
|
- label: I have provided appropriate use cases for the icon(s) requested.
|
||||||
|
required: true
|
||||||
90
.github/ISSUE_TEMPLATE/02_bug_report.yml
vendored
Normal file
90
.github/ISSUE_TEMPLATE/02_bug_report.yml
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a report to help us improve
|
||||||
|
labels: ['🐛 bug']
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Before reporting an issue, please search to see if someone has filed a similar issue before. If there is already an open issue, please add a 👍 and/or leave a comment with additional information.
|
||||||
|
- type: checkboxes
|
||||||
|
id: packages
|
||||||
|
attributes:
|
||||||
|
label: Package
|
||||||
|
description: Which Lucide packages are affected? You may select more than one.
|
||||||
|
options:
|
||||||
|
- label: lucide
|
||||||
|
- label: lucide-angular
|
||||||
|
- label: lucide-flutter
|
||||||
|
- label: lucide-preact
|
||||||
|
- label: lucide-react
|
||||||
|
- label: lucide-react-native
|
||||||
|
- label: lucide-solid
|
||||||
|
- label: lucide-svelte
|
||||||
|
- label: lucide-vue
|
||||||
|
- label: lucide-vue-next
|
||||||
|
- label: Figma plugin
|
||||||
|
- label: source/main
|
||||||
|
- label: other/not relevant
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Version
|
||||||
|
description: What version of Lucide are you running?
|
||||||
|
placeholder: e.g. 0.289.1
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: browsers
|
||||||
|
attributes:
|
||||||
|
label: Browser
|
||||||
|
description: In which browser(s) are you experiencing the issue? You may select more than one.
|
||||||
|
options:
|
||||||
|
- label: Chrome/Chromium
|
||||||
|
- label: Firefox
|
||||||
|
- label: Safari
|
||||||
|
- label: Edge
|
||||||
|
- label: iOS Safari
|
||||||
|
- label: Opera
|
||||||
|
- label: Other/not relevant
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: checkboxes
|
||||||
|
id: operating-systems
|
||||||
|
attributes:
|
||||||
|
label: Operating system
|
||||||
|
description: In which operating systems a you experiencing the issue? You may select more than one.
|
||||||
|
options:
|
||||||
|
- label: Windows
|
||||||
|
- label: Linux
|
||||||
|
- label: macOS
|
||||||
|
- label: Other/not relevant
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: Try to describe in detail the problem you're running into and provide additional context about your working environment if necessary.
|
||||||
|
placeholder: e.g. When I do X, Y happens instead of Z
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: steps-to-reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: Please provide a detailed guide on how this issue can be reproduced or a live example with a working reproduction on Codesandbox, JSFiddle or similar.
|
||||||
|
placeholder: |
|
||||||
|
1. Import `check` icon
|
||||||
|
2. Add to a React component/view
|
||||||
|
3. Run the react app
|
||||||
|
4. Notice that the `check` isn't rendering correctly which seems a encoding problem
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
description: Please review the following checklist before submitting your issue.
|
||||||
|
options:
|
||||||
|
- label: I have searched if someone has submitted a similar issue before and there weren't any. (Please make sure to also search closed issues, as this issue might already have been resolved.)
|
||||||
|
required: true
|
||||||
62
.github/ISSUE_TEMPLATE/03_bug_report_site.yml
vendored
Normal file
62
.github/ISSUE_TEMPLATE/03_bug_report_site.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
name: lucide.dev bug report
|
||||||
|
description: Help us improve the Lucide site
|
||||||
|
labels: ['🐛 bug', '🌍 site']
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Before reporting an issue, please search to see if someone has filed a similar issue before. If there is already an open issue, please add a 👍 and/or leave a comment with additional information.
|
||||||
|
- type: checkboxes
|
||||||
|
id: browsers
|
||||||
|
attributes:
|
||||||
|
label: Browser
|
||||||
|
description: In which browser(s) are you experiencing the issue? You may select more than one.
|
||||||
|
options:
|
||||||
|
- label: Chrome/Chromium
|
||||||
|
- label: Firefox
|
||||||
|
- label: Safari
|
||||||
|
- label: Edge
|
||||||
|
- label: iOS Safari
|
||||||
|
- label: Opera
|
||||||
|
- label: Other/not relevant
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: checkboxes
|
||||||
|
id: operating-systems
|
||||||
|
attributes:
|
||||||
|
label: Operating system
|
||||||
|
description: In which operating systems are you experiencing the issue? You may select more than one.
|
||||||
|
options:
|
||||||
|
- label: Windows
|
||||||
|
- label: Linux
|
||||||
|
- label: macOS
|
||||||
|
- label: Other/not relevant
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: Try to describe in detail the problem you're running into and provide additional context about your working environment if necessary.
|
||||||
|
placeholder: e.g. When I do X, Y happens instead of Z
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: stepsToReproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: Please provide a detailed guide on how this issue can be reproduced.
|
||||||
|
placeholder: |
|
||||||
|
1. I click on an icon
|
||||||
|
2. I click on `Copy SVG` in the drawer
|
||||||
|
3. I paste from the clipboard
|
||||||
|
4. A base64 encoded data URI is inserted.
|
||||||
|
...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
description: Please review the following checklist before submitting your issue.
|
||||||
|
options:
|
||||||
|
- label: I have searched if someone has submitted a similar issue before and there weren't any. (Please make sure to also search closed issues, as this issue might already have been resolved.)
|
||||||
|
required: true
|
||||||
53
.github/ISSUE_TEMPLATE/04_feature_request.yml
vendored
Normal file
53
.github/ISSUE_TEMPLATE/04_feature_request.yml
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Share with us your ideas on how Lucide could be improved upon.
|
||||||
|
labels: ['💡 idea']
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Before submitting a new feature request, please search to see if someone has filed a similar request before. If there is already an open issue, please add a 👍 and/or leave a comment with additional information.
|
||||||
|
- type: checkboxes
|
||||||
|
id: packages
|
||||||
|
attributes:
|
||||||
|
label: Package
|
||||||
|
description: Which Lucide project do you wish this feature were added to? You may select more than one.
|
||||||
|
options:
|
||||||
|
- label: lucide
|
||||||
|
- label: lucide-angular
|
||||||
|
- label: lucide-flutter
|
||||||
|
- label: lucide-preact
|
||||||
|
- label: lucide-react
|
||||||
|
- label: lucide-react-native
|
||||||
|
- label: lucide-solid
|
||||||
|
- label: lucide-svelte
|
||||||
|
- label: lucide-vue
|
||||||
|
- label: lucide-vue-next
|
||||||
|
- label: Figma plugin
|
||||||
|
- label: all JS packages
|
||||||
|
- label: site
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: Try to describe in detail the feature you wish existed.
|
||||||
|
placeholder: e.g. I want to be able to set extra CSS classes on icon components.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: use-cases
|
||||||
|
attributes:
|
||||||
|
label: Use cases
|
||||||
|
description: Why do you need this feature? Provide real-life use cases as to why this feature will be useful for others.
|
||||||
|
placeholder: e.g. I could use the extra classes to add animation or global custom styling to some icons.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
description: Please check the following items before submitting your issue.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues to make sure this bug has not already been reported.
|
||||||
|
required: true
|
||||||
68
.github/ISSUE_TEMPLATE/bug_report.md
vendored
68
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,68 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
labels: "🐛 bug"
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Before reporting an issue, please search to see if someone has filed a similar issue before. If there is already an open issue, please add a 👍 and/or leave a comment with additional information.
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
* Version:
|
|
||||||
* Are you running from source/main:
|
|
||||||
* Are you using a released build:
|
|
||||||
* Operating system:
|
|
||||||
* Bits:
|
|
||||||
|
|
||||||
## Step to reproduce
|
|
||||||
|
|
||||||
*(Type here)*
|
|
||||||
|
|
||||||
### Actual behavior
|
|
||||||
|
|
||||||
## Any message or error
|
|
||||||
|
|
||||||
*(Type here)*
|
|
||||||
|
|
||||||
## Resources
|
|
||||||
|
|
||||||
* Links
|
|
||||||
* Screenshots
|
|
||||||
|
|
||||||
|
|
||||||
Here is what a great bug report would look like:
|
|
||||||
|
|
||||||
```
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Version: Release v3.1.0
|
|
||||||
Running from: Import using webpack
|
|
||||||
Operating system: Mac OSX
|
|
||||||
Bits: 64 bits
|
|
||||||
|
|
||||||
## Step to reproduce
|
|
||||||
|
|
||||||
- Import `check` icon
|
|
||||||
- Add to a React component/view
|
|
||||||
- Run the react app
|
|
||||||
- Notice that the `check` isn't rendering correctly which seems a encoding problem
|
|
||||||
|
|
||||||
### Actual behavior:
|
|
||||||
|
|
||||||
- Import `check` icon
|
|
||||||
- Add to a React component/view
|
|
||||||
- Run the react app
|
|
||||||
- Check is displayed with correct encoding (e.g UTF-8)
|
|
||||||
|
|
||||||
## Any message or error
|
|
||||||
|
|
||||||
No console output
|
|
||||||
...
|
|
||||||
|
|
||||||
## Resources
|
|
||||||
|
|
||||||
No resources
|
|
||||||
...
|
|
||||||
```
|
|
||||||
18
.github/ISSUE_TEMPLATE/icon_request.md
vendored
18
.github/ISSUE_TEMPLATE/icon_request.md
vendored
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
name: Icon request
|
|
||||||
about: Suggest an new icon for this project
|
|
||||||
labels: "🙌 icon request"
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Before creating an icon request, please search to see if someone has requested the icon already. If there is an open request, please add a 👍.
|
|
||||||
A note about brand logos and related material : We follow the decision from Feather Icons (https://github.com/feathericons/feather/issues/763) to deprecate icons relating to brands.
|
|
||||||
You will find some in the set, but we won't add any new ones. https://simpleicons.org has 24x24 SVG icons for this purpose.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Icon Request
|
|
||||||
|
|
||||||
* Icon name:
|
|
||||||
* Use case:
|
|
||||||
* _Screenshots_ of similar icons:
|
|
||||||
15
.github/PULL_REQUEST_TEMPLATE/new-icon.md
vendored
15
.github/PULL_REQUEST_TEMPLATE/new-icon.md
vendored
@@ -1,15 +0,0 @@
|
|||||||
---
|
|
||||||
name: New icon
|
|
||||||
about: Add a new icon to the library
|
|
||||||
labels: "🎨 <icon"
|
|
||||||
---
|
|
||||||
|
|
||||||
<!-- Thanks for submitting an icon! Please make sure you read the icon design guide
|
|
||||||
at https://github.com/lucide-icons/lucide/blob/main/docs/ICON_DESIGN_GUIDE.md beforehand,
|
|
||||||
and please fill everything below. -->
|
|
||||||
|
|
||||||
- **Name of the icon** : <!-- `icon` -->
|
|
||||||
- **Tags (alternative names for this icon)** (add them in tags.json) :
|
|
||||||
- **What is the purpose of this icon?** : <!-- Shows that one can click it to... / Is used to denote or label... -->
|
|
||||||
- **100% scale preview** : <!-- upload an image -->
|
|
||||||
- **Have you considered alternative possibilities** for its naming or design? :
|
|
||||||
44
.github/actions/build-and-test.yml
vendored
Normal file
44
.github/actions/build-and-test.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: "Build and Test"
|
||||||
|
description: "Builds and test a package"
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
name:
|
||||||
|
description: “Name of the package”
|
||||||
|
required: true
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- uses: pnpm/action-setup@v2.0.1
|
||||||
|
name: Install pnpm
|
||||||
|
id: pnpm-install
|
||||||
|
with:
|
||||||
|
version: 7
|
||||||
|
run_install: false
|
||||||
|
|
||||||
|
- name: Get pnpm store directory
|
||||||
|
id: pnpm-cache
|
||||||
|
run: |
|
||||||
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- uses: actions/cache@v3
|
||||||
|
name: Setup pnpm cache
|
||||||
|
with:
|
||||||
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install --filter lucide-preact
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm --filter lucide-preact build
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: pnpm --filter lucide-preact test
|
||||||
41
.github/actions/check-icons.yml
vendored
Normal file
41
.github/actions/check-icons.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: "Check icons"
|
||||||
|
description: "Cross-checks icon and category references in JSON descriptors"
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
name:
|
||||||
|
description: “Name of the package”
|
||||||
|
required: true
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- uses: pnpm/action-setup@v2.0.1
|
||||||
|
name: Install pnpm
|
||||||
|
id: pnpm-install
|
||||||
|
with:
|
||||||
|
version: 7
|
||||||
|
run_install: false
|
||||||
|
|
||||||
|
- name: Get pnpm store directory
|
||||||
|
id: pnpm-cache
|
||||||
|
run: |
|
||||||
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- uses: actions/cache@v3
|
||||||
|
name: Setup pnpm cache
|
||||||
|
with:
|
||||||
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install --filter .
|
||||||
|
|
||||||
|
- name: Check icons and categories
|
||||||
|
run: pnpm checkIcons
|
||||||
62
.github/labeler.yml
vendored
Normal file
62
.github/labeler.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# For changed dependencies
|
||||||
|
📦 dependencies:
|
||||||
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
|
# For changes in documentation
|
||||||
|
📖 documentation:
|
||||||
|
- docs/*.md
|
||||||
|
- docs/**/*.md
|
||||||
|
|
||||||
|
# For changes in the site, but not markdown files
|
||||||
|
🌍 site:
|
||||||
|
- 'docs/**'
|
||||||
|
|
||||||
|
# For changes in the metadata
|
||||||
|
🫧 metadata:
|
||||||
|
- 'icons/*.json'
|
||||||
|
- categories/*
|
||||||
|
|
||||||
|
# For changes or added icons
|
||||||
|
🎨 icon:
|
||||||
|
- 'icons/*.svg'
|
||||||
|
|
||||||
|
# For changes in the lucide package
|
||||||
|
🧳 lucide package:
|
||||||
|
- 'packages/lucide/*'
|
||||||
|
|
||||||
|
# For changes in the lucide React package
|
||||||
|
⚛️ react package:
|
||||||
|
- 'packages/lucide-react/*'
|
||||||
|
|
||||||
|
# For changes in the lucide React Native package
|
||||||
|
⚛️ react native package:
|
||||||
|
- 'packages/lucide-react-native/*'
|
||||||
|
|
||||||
|
# For changes in the lucide vue packages
|
||||||
|
💎 vue package:
|
||||||
|
- 'packages/lucide-vue/*'
|
||||||
|
- 'packages/lucide-vue-next/*'
|
||||||
|
|
||||||
|
# For changes in the lucide angular package
|
||||||
|
🅰️ angular package:
|
||||||
|
- 'packages/lucide-angular/*'
|
||||||
|
|
||||||
|
# For changes in the lucide preact package
|
||||||
|
⚛️ preact package:
|
||||||
|
- 'packages/lucide-preact/*'
|
||||||
|
|
||||||
|
# For changes in the lucide svelte package
|
||||||
|
🧣 svelte package:
|
||||||
|
- 'packages/lucide-svelte/*'
|
||||||
|
|
||||||
|
# For changes in the lucide solid package
|
||||||
|
🪝 solid package:
|
||||||
|
- 'packages/lucide-solid/*'
|
||||||
|
|
||||||
|
# For changes in the lucide static package
|
||||||
|
🪨 static package:
|
||||||
|
- 'packages/lucide-static/*'
|
||||||
|
|
||||||
|
# For changes in the lucide flutter package
|
||||||
|
🏹 flutter package:
|
||||||
|
- 'packages/lucide-flutter/*'
|
||||||
55
.github/pull_request_template.md
vendored
Normal file
55
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<!-- Thank you for contributing! -->
|
||||||
|
|
||||||
|
<!-- Insert `closes #issueNumber` here if merging this PR will resolve an existing issue -->
|
||||||
|
|
||||||
|
## What is the purpose of this pull request?
|
||||||
|
<!-- Please choose one of the following, and put an "x" next to it. -->
|
||||||
|
- [ ] New Icon
|
||||||
|
- [ ] Bug fix
|
||||||
|
- [ ] New Feature
|
||||||
|
- [ ] Documentation update
|
||||||
|
- [ ] Other:
|
||||||
|
|
||||||
|
### Description
|
||||||
|
<!-- Please insert your description here and provide info about the "what" this PR is contribution -->
|
||||||
|
|
||||||
|
### Icon use case <!-- ONLY for new icons, remove this part if not icon PR -->
|
||||||
|
<!-- What is the purpose of this icon? For each icon added, please insert at least two real life use cases (the more the better). Text like "it's a car icon" is not accepted. -->
|
||||||
|
|
||||||
|
### Alternative icon designs <!-- ONLY for new icons, remove this part if not icon PR -->
|
||||||
|
<!-- If you have any alternative icon designs, please attach them here. -->
|
||||||
|
|
||||||
|
## Icon Design Checklist <!-- ONLY for new icons, remove this part if not icon PR -->
|
||||||
|
|
||||||
|
### Concept <!-- ONLY for new icons -->
|
||||||
|
<!-- All of these requirements must be fulfilled. -->
|
||||||
|
- [ ] I have provided valid use cases for each icon.
|
||||||
|
- [ ] I have not added any a brand or logo icon.
|
||||||
|
- [ ] I have not used any hate symbols.
|
||||||
|
- [ ] I have not included any religious or political imagery.
|
||||||
|
|
||||||
|
### Author, credits & license<!-- ONLY for new icons. -->
|
||||||
|
<!-- Please choose one of the following, and put an "x" next to it. -->
|
||||||
|
- [ ] The icons are solely my own creation.
|
||||||
|
- [ ] The icons were originally created in #<issueNumber> by @<githubUser>
|
||||||
|
- [ ] I've based them on the following Lucide icons: <!-- provide the list of icons -->
|
||||||
|
- [ ] I've based them on the following design: <!-- provide source URL and license permitting use -->
|
||||||
|
|
||||||
|
### Naming <!-- ONLY for new icons -->
|
||||||
|
<!-- All of these requirements must be fulfilled. -->
|
||||||
|
- [ ] I've read and followed the [naming conventions](https://lucide.dev/guide/design/icon-design-guide#naming-conventions)
|
||||||
|
- [ ] I've named icons by what they are rather than their use case.
|
||||||
|
- [ ] I've provided meta JSON files in `icons/[iconName].json`.
|
||||||
|
|
||||||
|
### Design <!-- ONLY for new icons -->
|
||||||
|
<!-- All of these requirements must be fulfilled. -->
|
||||||
|
- [ ] I've read and followed the [icon design guidelines](https://lucide.dev/guide/design/icon-design-guide)
|
||||||
|
- [ ] I've made sure that the icons look sharp on low DPI displays.
|
||||||
|
- [ ] I've made sure that the icons look consistent with the icon set in size, optical volume and density.
|
||||||
|
- [ ] I've made sure that the icons are visually centered.
|
||||||
|
- [ ] I've correctly optimized all icons to two points of precision.
|
||||||
|
|
||||||
|
## Before Submitting <!-- For every PR! -->
|
||||||
|
<!-- All of these requirements must be fulfilled. -->
|
||||||
|
- [ ] I've read the [Contribution Guidelines](https://github.com/lucide-icons/lucide/blob/main/CONTRIBUTING.md).
|
||||||
|
- [ ] I've checked if there was an existing PR that solves the same issue.
|
||||||
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
@@ -5,13 +5,14 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
- icons/**
|
- icons/**/*.svg
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-release:
|
create-release:
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
VERSION: ${{ steps.new-version.outputs.NEW_VERSION }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
@@ -29,12 +30,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
@@ -47,7 +48,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Get latest tag
|
- name: Get latest tag
|
||||||
id: latest-tag
|
id: latest-tag
|
||||||
run: echo "::set-output name=LATEST_TAG::$(git describe --tags `git rev-list --tags --max-count=1`)"
|
run: echo "LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
@@ -57,17 +58,18 @@ jobs:
|
|||||||
|
|
||||||
- name: Create new version
|
- name: Create new version
|
||||||
id: new-version
|
id: new-version
|
||||||
run: echo "::set-output name=NEW_VERSION::$(.github/workflows/version-up.sh --minor)"
|
run: echo "NEW_VERSION=$(.github/workflows/version-up.sh --minor)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Create change log
|
- name: Create change log
|
||||||
id: change-log
|
id: change-log
|
||||||
run: |
|
run: |
|
||||||
CHANGE_LOG=$(pnpm run generate:changelog --old-tag=${{ steps.latest-tag.outputs.LATEST_TAG }})
|
CHANGE_LOG=$(pnpm run generate:changelog --old-tag=${{ steps.latest-tag.outputs.LATEST_TAG }})
|
||||||
CHANGE_LOG="${CHANGE_LOG//'%'/'%25'}"
|
CHANGE_LOG=$(tail -n +5 <<< $CHANGE_LOG)
|
||||||
CHANGE_LOG="${CHANGE_LOG//$'\n'/'%0A'}"
|
|
||||||
CHANGE_LOG="${CHANGE_LOG//$'\r'/'%0D'}"
|
|
||||||
echo $CHANGE_LOG
|
echo $CHANGE_LOG
|
||||||
echo "::set-output name=CHANGE_LOG::$CHANGE_LOG"
|
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
|
||||||
|
echo "CHANGE_LOG<<$EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "$CHANGE_LOG" >> $GITHUB_OUTPUT
|
||||||
|
echo "$EOF" >> $GITHUB_OUTPUT
|
||||||
env:
|
env:
|
||||||
GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
@@ -76,11 +78,17 @@ jobs:
|
|||||||
echo '${{ steps.new-version.outputs.NEW_VERSION }}'
|
echo '${{ steps.new-version.outputs.NEW_VERSION }}'
|
||||||
echo '${{ steps.change-log.outputs.CHANGE_LOG }}'
|
echo '${{ steps.change-log.outputs.CHANGE_LOG }}'
|
||||||
|
|
||||||
- name: Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.CREATE_RELEASE_TOKEN }}
|
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.new-version.outputs.NEW_VERSION }}
|
tag_name: ${{ steps.new-version.outputs.NEW_VERSION }}
|
||||||
name: New icons ${{ steps.new-version.outputs.NEW_VERSION }}
|
name: New icons ${{ steps.new-version.outputs.NEW_VERSION }}
|
||||||
body: ${{ steps.change-log.outputs.CHANGE_LOG }}
|
body: ${{ steps.change-log.outputs.CHANGE_LOG }}
|
||||||
|
|
||||||
|
start-release:
|
||||||
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
|
needs: create-release
|
||||||
|
uses: './.github/workflows/release.yml'
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
version: ${{ needs.create-release.outputs.VERSION }}
|
||||||
|
|||||||
12
.github/workflows/labeler.yml
vendored
Normal file
12
.github/workflows/labeler.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
name: "Pull Request Labeler"
|
||||||
|
on:
|
||||||
|
- pull_request_target
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
triage:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/labeler@v4
|
||||||
9
.github/workflows/lucide-angular.yml
vendored
9
.github/workflows/lucide-angular.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-angular/**
|
- packages/lucide-angular/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-angular/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
22
.github/workflows/lucide-font.yml
vendored
22
.github/workflows/lucide-font.yml
vendored
@@ -4,16 +4,12 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- icons/**
|
- icons/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-font/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- icons/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lucide-font:
|
lucide-font:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ericfennis/lucide-font:latest
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v3.4.1
|
- uses: actions/setup-node@v3.4.1
|
||||||
@@ -30,15 +26,15 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-lucide-font-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-lucide-font-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --filter outline-svg
|
run: pnpm install --filter outline-svg
|
||||||
@@ -46,11 +42,11 @@ jobs:
|
|||||||
- name: Outline svg Icons
|
- name: Outline svg Icons
|
||||||
run: pnpm build:outline-icons
|
run: pnpm build:outline-icons
|
||||||
|
|
||||||
- name: Create directory
|
- name: Install dependencies
|
||||||
run: mkdir lucide-font
|
run: pnpm install --filter build-font
|
||||||
|
|
||||||
- name: Build font
|
- name: Create font in ./lucide-font
|
||||||
run: fontcustom compile "./outlined" -h -n "lucide" -o ./lucide-font -F
|
run: pnpm build:font
|
||||||
|
|
||||||
- name: "Upload to Artifacts"
|
- name: "Upload to Artifacts"
|
||||||
uses: actions/upload-artifact@v1
|
uses: actions/upload-artifact@v1
|
||||||
|
|||||||
9
.github/workflows/lucide-preact.yml
vendored
9
.github/workflows/lucide-preact.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-preact/**
|
- packages/lucide-preact/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-preact/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide-react-native.yml
vendored
9
.github/workflows/lucide-react-native.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-react-native/**
|
- packages/lucide-react-native/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-react-native/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
10
.github/workflows/lucide-react.yml
vendored
10
.github/workflows/lucide-react.yml
vendored
@@ -4,10 +4,8 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-react/**
|
- packages/lucide-react/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
- scripts/generateNextJSAliases.mjs
|
||||||
paths:
|
|
||||||
- packages/lucide-react/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +27,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide-solid.yml
vendored
9
.github/workflows/lucide-solid.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-solid/**
|
- packages/lucide-solid/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-solid/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide-static.yml
vendored
9
.github/workflows/lucide-static.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-static/**
|
- packages/lucide-static/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-static/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide-svelte.yml
vendored
9
.github/workflows/lucide-svelte.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-svelte/**
|
- packages/lucide-svelte/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-svelte/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide-vue-next.yml
vendored
9
.github/workflows/lucide-vue-next.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-vue-next/**
|
- packages/lucide-vue-next/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-vue-next/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide-vue.yml
vendored
9
.github/workflows/lucide-vue.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-vue/**
|
- packages/lucide-vue/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-vue/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
9
.github/workflows/lucide.yml
vendored
9
.github/workflows/lucide.yml
vendored
@@ -4,10 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide/**
|
- packages/lucide/**
|
||||||
- pnpm-lock.yaml
|
- tools/build-icons/**
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/lucide/**
|
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -29,12 +26,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|||||||
158
.github/workflows/pull-request.yml
vendored
Normal file
158
.github/workflows/pull-request.yml
vendored
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
name: Add Changed Icons comment
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
paths:
|
||||||
|
- 'icons/*.svg'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
add-changed-icons-comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@v35
|
||||||
|
with:
|
||||||
|
files: icons/*.svg
|
||||||
|
- name: Generate 24px dpi preview
|
||||||
|
id: generate-24px-dpi-preview
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/dpi/24/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Generate cohesion check random
|
||||||
|
id: generate-cohesion-check-random
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in $(printf "%s\\n" icons/*.svg | shuf | head -n$(awk -F' ' '{print NF}' <<< '${{ steps.changed-files.outputs.all_changed_files }}')); do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/stroke-width/2/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Generate cohesion check squares
|
||||||
|
id: generate-cohesion-check-squares
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in $(printf "%s\\n" icons/*square*.svg | shuf | head -n$(awk -F' ' '{print NF}' <<< '${{ steps.changed-files.outputs.all_changed_files }}')); do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/stroke-width/2/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Generate 1px stroke-width
|
||||||
|
id: generate-1px-stroke-width
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/stroke-width/1/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Generate 2px stroke-width
|
||||||
|
id: generate-2px-stroke-width
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/stroke-width/2/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Generate 3px stroke-width
|
||||||
|
id: generate-3px-stroke-width
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/stroke-width/3/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Generate X-rays
|
||||||
|
id: generate-x-rays
|
||||||
|
run: |
|
||||||
|
delimiter="$(openssl rand -hex 8)"
|
||||||
|
echo "body<<$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
|
||||||
|
cat "$file" | # get file content
|
||||||
|
tr '\n' ' ' | # remove line breaks
|
||||||
|
sed -e 's/<svg[^>]*>/<svg>/g' | # remove attributes from svg element
|
||||||
|
base64 -w 0 | # encode svg
|
||||||
|
sed "s|.*|<img width=\"400\" title=\"$file\" alt=\"$file\" src=\"https://lucide.dev/api/gh-icon/$(basename ${file//\.svg/})/&.svg\"/> |"
|
||||||
|
done | tr '\n' ' ' >> $GITHUB_OUTPUT
|
||||||
|
echo >> $GITHUB_OUTPUT
|
||||||
|
echo "$delimiter" >> $GITHUB_OUTPUT
|
||||||
|
- name: Find Comment
|
||||||
|
uses: peter-evans/find-comment@v2
|
||||||
|
id: fc
|
||||||
|
with:
|
||||||
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
|
comment-author: 'github-actions[bot]'
|
||||||
|
body-includes: Added or changed icons
|
||||||
|
- name: Create or update comment
|
||||||
|
uses: peter-evans/create-or-update-comment@v2
|
||||||
|
with:
|
||||||
|
comment-id: ${{ steps.fc.outputs.comment-id }}
|
||||||
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
|
body: |
|
||||||
|
### Added or changed icons
|
||||||
|
${{ steps.generate-2px-stroke-width.outputs.body }}<br/>
|
||||||
|
<details>
|
||||||
|
<summary>Preview cohesion</summary>
|
||||||
|
${{ steps.generate-cohesion-check-squares.outputs.body }}<br/>
|
||||||
|
${{ steps.generate-2px-stroke-width.outputs.body }}<br/>
|
||||||
|
${{ steps.generate-cohesion-check-random.outputs.body }}<br/>
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>Preview stroke widths</summary>
|
||||||
|
${{ steps.generate-1px-stroke-width.outputs.body }}<br/>
|
||||||
|
${{ steps.generate-2px-stroke-width.outputs.body }}<br/>
|
||||||
|
${{ steps.generate-3px-stroke-width.outputs.body }}<br/>
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>DPI Preview (24px)</summary>
|
||||||
|
${{ steps.generate-24px-dpi-preview.outputs.body }}<br/>
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>Icon X-rays</summary>
|
||||||
|
${{ steps.generate-x-rays.outputs.body }}
|
||||||
|
</details>
|
||||||
|
edit-mode: replace
|
||||||
636
.github/workflows/release.yml
vendored
636
.github/workflows/release.yml
vendored
@@ -5,6 +5,13 @@ on:
|
|||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- 'v*'
|
||||||
|
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
description: Version
|
||||||
|
type: string
|
||||||
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
@@ -12,8 +19,8 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pre-build:
|
pre-release:
|
||||||
if: github.repository == 'lucide-icons/lucide' && contains('["locness3","ericfennis", "johnletey", "karsa-mistmere"]', github.actor)
|
if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere"]', github.actor)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
VERSION: ${{ steps.get_version.outputs.VERSION }}
|
VERSION: ${{ steps.get_version.outputs.VERSION }}
|
||||||
@@ -23,19 +30,32 @@ jobs:
|
|||||||
id: get_version
|
id: get_version
|
||||||
run: |
|
run: |
|
||||||
echo $VERSION_REF
|
echo $VERSION_REF
|
||||||
echo ::set-output name=VERSION::${VERSION_REF/refs\/tags\/\v}
|
echo "VERSION=${VERSION_REF/refs\/tags\/\v}" >> $GITHUB_OUTPUT
|
||||||
env:
|
env:
|
||||||
VERSION_REF: ${{ github.event.inputs.version || github.ref }}
|
VERSION_REF: ${{ inputs.version || github.event.inputs.version || github.ref }}
|
||||||
|
|
||||||
lucide:
|
release:
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: pre-build
|
needs: pre-release
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
package: [
|
||||||
|
'lucide',
|
||||||
|
'lucide-react',
|
||||||
|
'lucide-react-native',
|
||||||
|
'lucide-vue',
|
||||||
|
'lucide-vue-next',
|
||||||
|
'lucide-angular',
|
||||||
|
'lucide-preact',
|
||||||
|
'lucide-solid',
|
||||||
|
'lucide-svelte',
|
||||||
|
]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 18
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
- uses: pnpm/action-setup@v2.0.1
|
||||||
name: Install pnpm
|
name: Install pnpm
|
||||||
@@ -47,484 +67,38 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Set Auth Token
|
- name: Set Auth Token
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
run: npm config set //registry.npmjs.org/:_authToken ${{ inputs.NPM_TOKEN || secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
- name: Set new version
|
- name: Set new version
|
||||||
run: pnpm --filter lucide version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
run: pnpm --filter ${{ matrix.package }} version --new-version ${{ needs.pre-release.outputs.VERSION }} --no-git-tag-version
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide build
|
run: pnpm --filter ${{ matrix.package }} build
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide test
|
run: pnpm --filter ${{ matrix.package }} test
|
||||||
|
|
||||||
- name: Publish
|
- name: Publish
|
||||||
run: pnpm --filter lucide publish --no-git-checks
|
run: pnpm --filter ${{ matrix.package }} publish --no-git-checks --ignore-scripts
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-package-json
|
|
||||||
path: packages/lucide/package.json
|
|
||||||
|
|
||||||
lucide-react:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set package.json version lucide
|
|
||||||
run: pnpm --filter lucide-react version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-react build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-react test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-react publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-react-package-json
|
|
||||||
path: packages/lucide-react/package.json
|
|
||||||
|
|
||||||
lucide-react-native:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set package.json version lucide
|
|
||||||
run: pnpm --filter lucide-react-native version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-react-native build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-react-native test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-react-native publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-react-native-package-json
|
|
||||||
path: packages/lucide-react-native/package.json
|
|
||||||
|
|
||||||
lucide-vue:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set new version
|
|
||||||
run: pnpm --filter lucide-vue version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-vue build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-vue test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-vue publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-vue-package-json
|
|
||||||
path: packages/lucide-vue/package.json
|
|
||||||
|
|
||||||
lucide-vue-next:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set new version
|
|
||||||
run: pnpm --filter lucide-vue-next version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-vue-next build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-vue-next test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-vue-next publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-vue-next-package-json
|
|
||||||
path: packages/lucide-vue-next/package.json
|
|
||||||
|
|
||||||
lucide-angular:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set package.json version lucide
|
|
||||||
run: pnpm --filter lucide-angular version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-angular build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-angular test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-angular publish --no-git-checks --ignore-scripts
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-angular-package-json
|
|
||||||
path: packages/lucide-angular/package.json
|
|
||||||
|
|
||||||
lucide-preact:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set package.json version lucide
|
|
||||||
run: pnpm --filter lucide-preact version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-preact build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-preact test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-preact publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-preact-package-json
|
|
||||||
path: packages/lucide-preact/package.json
|
|
||||||
|
|
||||||
lucide-solid:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set package.json version lucide
|
|
||||||
run: pnpm --filter lucide-solid version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-solid build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-solid test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-solid publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-solid-package-json
|
|
||||||
path: packages/lucide-solid/package.json
|
|
||||||
|
|
||||||
lucide-svelte:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: pre-build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2.0.1
|
|
||||||
name: Install pnpm
|
|
||||||
id: pnpm-install
|
|
||||||
with:
|
|
||||||
version: 7
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Get pnpm store directory
|
|
||||||
id: pnpm-cache
|
|
||||||
run: |
|
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
name: Setup pnpm cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pnpm-store-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Set Auth Token
|
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set package.json version lucide
|
|
||||||
run: pnpm --filter lucide-svelte version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter lucide-svelte build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-svelte test
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: pnpm --filter lucide-svelte publish --no-git-checks
|
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-svelte-package-json
|
|
||||||
path: packages/lucide-svelte/package.json
|
|
||||||
|
|
||||||
lucide-static:
|
lucide-static:
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [pre-build, lucide-font]
|
needs: [pre-release, lucide-font]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/download-artifact@v2
|
- uses: actions/download-artifact@v2
|
||||||
@@ -543,24 +117,24 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Set Auth Token
|
- name: Set Auth Token
|
||||||
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
- name: Set new version
|
- name: Set new version
|
||||||
run: pnpm --filter lucide-static version --new-version ${{ needs.pre-build.outputs.VERSION }} --no-git-tag-version
|
run: pnpm --filter lucide-static version --new-version ${{ needs.pre-release.outputs.VERSION }} --no-git-tag-version
|
||||||
|
|
||||||
- name: Move Font
|
- name: Move Font
|
||||||
run: cp -r lucide-font packages/lucide-static/font
|
run: cp -r lucide-font packages/lucide-static/font
|
||||||
@@ -571,16 +145,10 @@ jobs:
|
|||||||
- name: Publish
|
- name: Publish
|
||||||
run: pnpm --filter lucide-static publish --no-git-checks
|
run: pnpm --filter lucide-static publish --no-git-checks
|
||||||
|
|
||||||
- name: Upload package.json
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-static-package-json
|
|
||||||
path: packages/lucide-static/package.json
|
|
||||||
|
|
||||||
lucide-font:
|
lucide-font:
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: pre-build
|
needs: pre-release
|
||||||
container: ericfennis/lucide-font:latest
|
container: ericfennis/lucide-font:latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
@@ -598,12 +166,12 @@ jobs:
|
|||||||
- name: Get pnpm store directory
|
- name: Get pnpm store directory
|
||||||
id: pnpm-cache
|
id: pnpm-cache
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
name: Setup pnpm cache
|
name: Setup pnpm cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pnpm-store-
|
${{ runner.os }}-pnpm-store-
|
||||||
@@ -626,130 +194,26 @@ jobs:
|
|||||||
name: lucide-font
|
name: lucide-font
|
||||||
path: lucide-font
|
path: lucide-font
|
||||||
|
|
||||||
lucide-flutter:
|
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [pre-build, lucide-font]
|
|
||||||
container:
|
|
||||||
image: cirrusci/flutter:latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/download-artifact@v2
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: ~/.pub-cache
|
|
||||||
key: ${{ runner.os }}-pub-${{ hashFiles('~/.pub-cache') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pub-
|
|
||||||
|
|
||||||
- name: Setup credentials
|
|
||||||
run: |
|
|
||||||
mkdir -p ~/.pub-cache
|
|
||||||
cat <<EOF > ~/.pub-cache/credentials.json
|
|
||||||
{
|
|
||||||
"accessToken": "${{ secrets.GOOGLE_OAUTH_ACCESS_TOKEN }}",
|
|
||||||
"refreshToken": "${{ secrets.GOOGLE_OAUTH_REFRESH_TOKEN }}",
|
|
||||||
"idToken": "${{ secrets.GOOGLE_OAUTH_ID_TOKEN }}",
|
|
||||||
"tokenEndpoint":"https://accounts.google.com/o/oauth2/token",
|
|
||||||
"scopes": [ "openid", "https://www.googleapis.com/auth/userinfo.email" ],
|
|
||||||
"expiration": 1629835569218
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
- name: Get packages
|
|
||||||
run: flutter pub get
|
|
||||||
working-directory: packages/lucide-flutter
|
|
||||||
|
|
||||||
- name: List lucide-font folder
|
|
||||||
run: ls lucide-font
|
|
||||||
|
|
||||||
- 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 assets/lucide-preview.html
|
|
||||||
flutter format .
|
|
||||||
working-directory: packages/lucide-flutter
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: flutter test
|
|
||||||
working-directory: packages/lucide-flutter
|
|
||||||
|
|
||||||
- name: Copy License
|
|
||||||
run: cp ../../LICENSE ./LICENSE
|
|
||||||
working-directory: packages/lucide-flutter
|
|
||||||
|
|
||||||
- name: Update yaml
|
|
||||||
run: sed -E 's/(version:)[^\n]*/\1 ${{ needs.pre-build.outputs.VERSION }}/;' pubspec.yaml > pubspec && mv pubspec pubspec.yaml
|
|
||||||
working-directory: packages/lucide-flutter
|
|
||||||
|
|
||||||
- name: Flutter publish
|
|
||||||
run: flutter pub publish -f
|
|
||||||
working-directory: packages/lucide-flutter
|
|
||||||
|
|
||||||
- name: Upload pubspec.yaml
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: lucide-flutter-pubspec-yaml
|
|
||||||
path: packages/lucide-flutter/pubspec.yaml
|
|
||||||
|
|
||||||
post-release:
|
post-release:
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs: [
|
||||||
[
|
pre-release,
|
||||||
pre-build,
|
|
||||||
lucide,
|
|
||||||
lucide-react,
|
|
||||||
lucide-react-native,
|
|
||||||
lucide-vue,
|
|
||||||
lucide-vue-next,
|
|
||||||
lucide-angular,
|
|
||||||
lucide-svelte,
|
|
||||||
lucide-preact,
|
|
||||||
lucide-flutter,
|
|
||||||
lucide-font,
|
lucide-font,
|
||||||
]
|
]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/download-artifact@v2
|
- uses: actions/download-artifact@v2
|
||||||
|
|
||||||
- name: Commit package files
|
|
||||||
run: |
|
|
||||||
mv lucide-package-json/package.json packages/lucide/package.json
|
|
||||||
mv lucide-react-package-json/package.json packages/lucide-react/package.json
|
|
||||||
mv lucide-react-native-package-json/package.json packages/lucide-react-native/package.json
|
|
||||||
mv lucide-vue-package-json/package.json packages/lucide-vue/package.json
|
|
||||||
mv lucide-preact-package-json/package.json packages/lucide-preact/package.json
|
|
||||||
mv lucide-svelte-package-json/package.json packages/lucide-svelte/package.json
|
|
||||||
mv lucide-vue-next-package-json/package.json packages/lucide-vue-next/package.json
|
|
||||||
mv lucide-angular-package-json/package.json packages/lucide-angular/package.json
|
|
||||||
mv lucide-flutter-pubspec-yaml/pubspec.yaml packages/lucide-flutter/pubspec.yaml
|
|
||||||
|
|
||||||
- name: Commit package.jsons
|
|
||||||
run: |
|
|
||||||
git add packages/*/package.json packages/lucide-flutter/pubspec.yaml
|
|
||||||
git -c user.name="Lucide Bot" -c user.email="lucide-bot@users.noreply.github.com" \
|
|
||||||
commit -m ":package: Bump lucide package versions to ${{ needs.pre-build.outputs.VERSION }}" --no-verify --quiet
|
|
||||||
git remote set-url --push origin https://lucide-bot:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY.git
|
|
||||||
git push origin HEAD:main
|
|
||||||
|
|
||||||
- name: Zip font and icons
|
- name: Zip font and icons
|
||||||
run: |
|
run: |
|
||||||
zip -r lucide-font-${{ needs.pre-build.outputs.VERSION }}.zip lucide-font
|
zip -r lucide-font-${{ needs.pre-release.outputs.VERSION }}.zip lucide-font
|
||||||
zip -r lucide-icons-${{ needs.pre-build.outputs.VERSION }}.zip icons
|
zip -r lucide-icons-${{ needs.pre-release.outputs.VERSION }}.zip icons
|
||||||
|
|
||||||
- name: Release zip and fonts
|
- name: Release zip and fonts
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.CREATE_RELEASE_TOKEN }}
|
|
||||||
with:
|
with:
|
||||||
tag_name: v${{ needs.pre-build.outputs.VERSION }}
|
tag_name: ${{ needs.pre-release.outputs.VERSION }}
|
||||||
files: |
|
files: |
|
||||||
lucide-font-${{ needs.pre-build.outputs.VERSION }}.zip
|
lucide-font-${{ needs.pre-release.outputs.VERSION }}.zip
|
||||||
lucide-icons-${{ needs.pre-build.outputs.VERSION }}.zip
|
lucide-icons-${{ needs.pre-release.outputs.VERSION }}.zip
|
||||||
|
|||||||
22
.gitignore
vendored
22
.gitignore
vendored
@@ -15,4 +15,26 @@ stats
|
|||||||
outlined
|
outlined
|
||||||
packages/**/src/icons/*.js
|
packages/**/src/icons/*.js
|
||||||
packages/**/src/icons/*.ts
|
packages/**/src/icons/*.ts
|
||||||
|
packages/**/src/icons/*.tsx
|
||||||
|
packages/**/src/aliases.ts
|
||||||
|
packages/**/src/dynamicIconImports.ts
|
||||||
|
packages/**/dynamicIconImports.js
|
||||||
|
packages/**/dynamicIconImports.d.ts
|
||||||
|
packages/**/dynamicIconImports.js.map
|
||||||
packages/**/LICENSE
|
packages/**/LICENSE
|
||||||
|
categories.json
|
||||||
|
tags.json
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# docs
|
||||||
|
docs/.vitepress/cache
|
||||||
|
docs/.vitepress/dist
|
||||||
|
docs/.vitepress/.temp
|
||||||
|
docs/.vitepress/data/iconNodes
|
||||||
|
docs/.vitepress/data/iconMetaData.ts
|
||||||
|
docs/.vitepress/data/releaseMetaData.json
|
||||||
|
docs/.vitepress/data/releaseMetaData
|
||||||
|
docs/.vitepress/data/iconDetails
|
||||||
|
docs/.vitepress/data/relatedIcons.json
|
||||||
|
docs/.vercel
|
||||||
|
docs/.nitro
|
||||||
|
|||||||
5
.husky/pre-commit
Executable file
5
.husky/pre-commit
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
pnpm lint-staged
|
||||||
|
pnpm checkIcons
|
||||||
15
.vscode/launch.json
vendored
Normal file
15
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "pwa-chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch Chrome against localhost",
|
||||||
|
"url": "http://localhost:8080",
|
||||||
|
"webRoot": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
7
.vscode/settings.json
vendored
Normal file
7
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"cSpell.words": [
|
||||||
|
"devs",
|
||||||
|
"preact",
|
||||||
|
"Preact"
|
||||||
|
]
|
||||||
|
}
|
||||||
95
.vscode/svg.code-snippets
vendored
Normal file
95
.vscode/svg.code-snippets
vendored
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"Lucide SVG": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "Base SVG with Lucide attributes.",
|
||||||
|
"prefix": [
|
||||||
|
"svg",
|
||||||
|
"lucide"
|
||||||
|
],
|
||||||
|
"body": [
|
||||||
|
"<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\"",
|
||||||
|
">",
|
||||||
|
" $0",
|
||||||
|
"</svg>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Rectangle": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG `rect`angle, with Lucide defaults.",
|
||||||
|
"prefix": [
|
||||||
|
"rect",
|
||||||
|
"<rect"
|
||||||
|
],
|
||||||
|
"body": "<rect width=\"${1:20}\" height=\"${2:12}\" x=\"${3:2}\" y=\"${4:6}\" rx=\"${5|2,1|}\"/>"
|
||||||
|
},
|
||||||
|
"Square": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG square `rect`angle, with Lucide defaults.",
|
||||||
|
"prefix": [
|
||||||
|
"square",
|
||||||
|
"rect",
|
||||||
|
"<rect",
|
||||||
|
"tile"
|
||||||
|
],
|
||||||
|
"body": "<rect width=\"${1:18}\" height=\"$1\" x=\"${2:3}\" y=\"${3:$2}\" rx=\"${4|2,1|}\" />"
|
||||||
|
},
|
||||||
|
"Circle": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG `circle`, with Lucide defaults.",
|
||||||
|
"prefix": [
|
||||||
|
"circle",
|
||||||
|
"<circle"
|
||||||
|
],
|
||||||
|
"body": "<circle cx=\"${2:12}\" cy=\"${3:$2}\" r=\"${1|10,2,.5|}\" />"
|
||||||
|
},
|
||||||
|
"Ellipse": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG `ellipse`.",
|
||||||
|
"prefix": [
|
||||||
|
"ellipse",
|
||||||
|
"<ellipse"
|
||||||
|
],
|
||||||
|
"body": "<ellipse cx=\"${3:12}\" cy=\"${4:$3}\" rx=\"${1:10}\" ry=\"${2:$1}\" />"
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG custom `path`.",
|
||||||
|
"prefix": [
|
||||||
|
"path",
|
||||||
|
"<path",
|
||||||
|
"polyline",
|
||||||
|
"<polyline",
|
||||||
|
"polygon",
|
||||||
|
"<polygon"
|
||||||
|
],
|
||||||
|
"body": "<path d=\"${1|M,m|}$0\" />"
|
||||||
|
},
|
||||||
|
"Line": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG `path`, preffered to `line` in Lucide.",
|
||||||
|
"prefix": [
|
||||||
|
"line",
|
||||||
|
"<line",
|
||||||
|
"minus"
|
||||||
|
],
|
||||||
|
"body": "<path d=\"M${3:5} ${4:12}${1|h,v|}${2:14}\" />"
|
||||||
|
},
|
||||||
|
"Dot": {
|
||||||
|
"scope": "xml",
|
||||||
|
"description": "SVG small dot, within the Lucide guidelines.",
|
||||||
|
"prefix": [
|
||||||
|
"dot",
|
||||||
|
"."
|
||||||
|
],
|
||||||
|
"body": "<path d=\"M ${1:12} ${2:$1}h.01\" />"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,28 +25,21 @@ Guidelines for pull requests:
|
|||||||
|
|
||||||
Please make sure you follow the icon guidelines, that should be followed to keep quality and consistency when making icons for Lucide.
|
Please make sure you follow the icon guidelines, that should be followed to keep quality and consistency when making icons for Lucide.
|
||||||
|
|
||||||
Read it here: [ICON_GUIDELINES](docs/ICON_DESIGN_GUIDE.md).
|
Read it here: [ICON_GUIDELINES](https://lucide.dev/docs/icon-design-guide).
|
||||||
|
|
||||||
### Templates
|
### Editor guides
|
||||||
|
|
||||||
Here you can find templates and instructions on how to implement the guidelines with different programs.
|
Here you can find instructions on how to implement the guidelines with different vector graphics editors:
|
||||||
|
|
||||||
#### Adobe Illustrator
|
#### [Adobe Illustrator Guide](https://lucide.dev/docs/illustrator-guide)
|
||||||
|
|
||||||
`Template`: You can find a template for Adobe Illustrator under `/docs/templates/illustrator-template.ai`.
|
You can also [download an Adobe Illustrator template](https://lucide.dev/templates/illustrator-template.ai).
|
||||||
`Instructions`: You can find the [Illustrator Guide](/docs/ILLUSTRATOR_GUIDE.md) and how to work with the template in `/docs/ILLUSTRATOR_GUIDE.md`.
|
|
||||||
|
|
||||||
#### Inkscape
|
#### [Inkscape Guide](https://lucide.dev/docs/inkscape-guide)
|
||||||
|
|
||||||
`Template`: None
|
#### [Figma Guide](https://lucide.dev/docs/figma-guide)
|
||||||
`Instructions`: You can find the [Inkscape Guide](/docs/INKSCAPE_GUIDE.md) and how to set up Inkscape under `/docs/INKSCAPE_GUIDE.md`.
|
|
||||||
|
|
||||||
#### Figma
|
### Submitting Multiple Icons
|
||||||
|
|
||||||
`Template`: None
|
|
||||||
`Instructions`: You can find the [Figma Guide](/docs/FIGMA_GUIDE.md) and how to set up Figma under `/docs/FIGMA_GUIDE.md`.
|
|
||||||
|
|
||||||
#### Submitting Multiple Icons
|
|
||||||
|
|
||||||
If you want submit multiple icons, please separate the icons and group them. That makes reviewing the icons easier and keep the thread clean and scoped.
|
If you want submit multiple icons, please separate the icons and group them. That makes reviewing the icons easier and keep the thread clean and scoped.
|
||||||
So don't submit multiple icons in one PR that have noting to do with each other.
|
So don't submit multiple icons in one PR that have noting to do with each other.
|
||||||
@@ -66,20 +59,21 @@ If you are a designer who wants to contribute to Lucide but you don't know what
|
|||||||
## Development
|
## Development
|
||||||
|
|
||||||
You will need minimum version of [Nodejs 16.4+](https://nodejs.org)
|
You will need minimum version of [Nodejs 16.4+](https://nodejs.org)
|
||||||
For packagemanagement you will need [yarn v1](https://yarnpkg.com/getting-started/install).
|
For package management you will need [PNPM](https://pnpm.io/installation).
|
||||||
For flutter package development, you need [Flutter 1.17+](https://docs.flutter.dev/get-started/install).
|
For flutter package development, you need [Flutter 1.17+](https://docs.flutter.dev/get-started/install).
|
||||||
|
|
||||||
After cloning the project you need to run:
|
After cloning the project you need to run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
yarn # Install dependencies, including the workspace packages
|
pnpm install # Install dependencies, including the workspace packages
|
||||||
```
|
```
|
||||||
|
|
||||||
### Packages -> PNPM Workspaces
|
### Packages -> PNPM Workspaces
|
||||||
|
|
||||||
To distribute different packages we use PNPM workspaces. Before you start make sure you are familiar with this concept. The concept of working in workspaces is created by Yarn, they have a well written introduction: [yarn workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces).
|
To distribute different packages we use PNPM workspaces. Before you start make sure you are familiar with this concept. The concept of working in workspaces is created by Yarn, they have a well written introduction: [yarn workspaces](https://classic.yarnpkg.com/lang/enhttps://lucide.dev/docs/workspaces).
|
||||||
|
|
||||||
The configured directory for workspaces is the [packages](./packages) directory, located in the root directory. There you will find all the current packages from lucide.
|
The configured directory for workspaces is the [packages](./packages) directory, located in the root directory. There you will find all the current packages from lucide.
|
||||||
|
There are more workspaces defined, see [`pnpm-workspace.yaml`](./pnpm-workspace.yaml).
|
||||||
|
|
||||||
> Note: One package is not managed by pnpm: **lucide-flutter**, this package is written in Dart and used pub for publishing.
|
> Note: One package is not managed by pnpm: **lucide-flutter**, this package is written in Dart and used pub for publishing.
|
||||||
|
|
||||||
@@ -178,11 +172,11 @@ Includes usefully scripts to automate certain jobs. Big part of the scripts is t
|
|||||||
|
|
||||||
### site
|
### site
|
||||||
|
|
||||||
The lucide.dev website using [Nextjs](https://nextjs.org).
|
The lucide.dev website is using [vitepress](https://vitepress.dev/) to generate the static website. The markdown files are located in the docs directory.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The documentation files are located in the [docs](./docs) directory. All these markdown files will be loaded in the build of the lucide.dev website.
|
The documentation files are located in the [docs](https://github.com/lucide-icons/lucide/tree/main/docs) directory. All these markdown files will be loaded in the build of the lucide.dev website.
|
||||||
|
|
||||||
Feel free to write, adjust or add new markdown files to improve our documentation.
|
Feel free to write, adjust or add new markdown files to improve our documentation.
|
||||||
|
|
||||||
|
|||||||
20
README.md
20
README.md
@@ -39,6 +39,7 @@ Lucide is trying to expand the icon set as much as possible while staying faithf
|
|||||||
- [Svelte](#svelte)
|
- [Svelte](#svelte)
|
||||||
- [Solid](#solid)
|
- [Solid](#solid)
|
||||||
- [Hyva](#hyva)
|
- [Hyva](#hyva)
|
||||||
|
- [Eleventy](#eleventy)
|
||||||
- [Contributing](#contributing)
|
- [Contributing](#contributing)
|
||||||
- [Community](#community)
|
- [Community](#community)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
@@ -165,8 +166,8 @@ For more details, see the [documentation](https://github.com/lucide-icons/lucide
|
|||||||
### Static (svg sprite, font, icons ..)
|
### Static (svg sprite, font, icons ..)
|
||||||
|
|
||||||
Assets:
|
Assets:
|
||||||
[Font Files](https://github.com/lucide-icons/lucide/releases/tag/latest)
|
[Font Files](https://github.com/lucide-icons/lucide/releases/latest)
|
||||||
[SVG Files](https://github.com/lucide-icons/lucide/releases/tag/latest)
|
[SVG Files](https://github.com/lucide-icons/lucide/releases/latest)
|
||||||
[SVG Sprite](https://cdn.jsdelivr.net/npm/lucide-static@latest/sprite.svg)
|
[SVG Sprite](https://cdn.jsdelivr.net/npm/lucide-static@latest/sprite.svg)
|
||||||
|
|
||||||
NPM package
|
NPM package
|
||||||
@@ -251,6 +252,16 @@ composer require siteation/magento2-hyva-icons-lucide
|
|||||||
|
|
||||||
For more details, see the [documentation](https://github.com/Siteation/magento2-hyva-icons-lucide/blob/main/README.md).
|
For more details, see the [documentation](https://github.com/Siteation/magento2-hyva-icons-lucide/blob/main/README.md).
|
||||||
|
|
||||||
|
### Eleventy
|
||||||
|
|
||||||
|
Using this plugin, Eleventy projects can incorporate Lucide icons. it makes it simple to use Lucide icons into your themes via shortcodes, improving your website's overall usability and visual appeal.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install @grimlink/eleventy-plugin-lucide-icons
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/GrimLink/eleventy-plugin-lucide-icons/blob/main/README.md).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
For more info on how to contribute please see the [contribution guidelines](https://github.com/lucide-icons/lucide/blob/main/CONTRIBUTING.md).
|
For more info on how to contribute please see the [contribution guidelines](https://github.com/lucide-icons/lucide/blob/main/CONTRIBUTING.md).
|
||||||
@@ -274,6 +285,9 @@ Thank you to all the people who contributed to Lucide!
|
|||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
|
|
||||||
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
|
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
|
||||||
<img src="./site/public/vercel.svg" alt="Powered by Vercel" width="200" />
|
<img src="docs/public/vercel.svg" alt="Powered by Vercel" width="200" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a href="https://www.digitalocean.com/?refcode=b0877a2caebd&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="docs/public/digitalocean.svg" width="200" alt="DigitalOcean Referral Badge" /></a>
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: ['@babel/env'],
|
|
||||||
// babelrcRoots: ['.', './packages/*'],
|
|
||||||
env: {
|
|
||||||
test: {
|
|
||||||
presets: ['@babel/env'],
|
|
||||||
plugins: ['@babel/plugin-transform-runtime'],
|
|
||||||
},
|
|
||||||
dev: {
|
|
||||||
plugins: [
|
|
||||||
[
|
|
||||||
'transform-inline-environment-variables',
|
|
||||||
{
|
|
||||||
include: ['NODE_ENV'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"arrows": [],
|
|
||||||
"brands": [],
|
|
||||||
"code": [],
|
|
||||||
"connectivity": ["airplay"],
|
|
||||||
"cursors": [],
|
|
||||||
"development": [],
|
|
||||||
"devices": ["alarm-clock"],
|
|
||||||
"file-system": [],
|
|
||||||
"layout": [],
|
|
||||||
"maths": ["activity"],
|
|
||||||
"multimedia": [],
|
|
||||||
"notifications": ["alert-circle", "alert-octagon", "alert-triangle"],
|
|
||||||
"nature": [],
|
|
||||||
"shopping": [],
|
|
||||||
"shapes": [],
|
|
||||||
"sports": [],
|
|
||||||
"text-edit": ["align-center","align-right","align-left","align-justify" ]
|
|
||||||
}
|
|
||||||
5
categories/accessibility.json
Normal file
5
categories/accessibility.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Accessibility",
|
||||||
|
"icon": "accessibility"
|
||||||
|
}
|
||||||
5
categories/account.json
Normal file
5
categories/account.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Accounts & access",
|
||||||
|
"icon": "user"
|
||||||
|
}
|
||||||
5
categories/animals.json
Normal file
5
categories/animals.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Animals",
|
||||||
|
"icon": "dog"
|
||||||
|
}
|
||||||
5
categories/arrows.json
Normal file
5
categories/arrows.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Arrows",
|
||||||
|
"icon": "arrow-left-right"
|
||||||
|
}
|
||||||
5
categories/brands.json
Normal file
5
categories/brands.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Brands",
|
||||||
|
"icon": "facebook"
|
||||||
|
}
|
||||||
5
categories/buildings.json
Normal file
5
categories/buildings.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Buildings",
|
||||||
|
"icon": "building"
|
||||||
|
}
|
||||||
5
categories/charts.json
Normal file
5
categories/charts.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Charts",
|
||||||
|
"icon": "pie-chart"
|
||||||
|
}
|
||||||
5
categories/communication.json
Normal file
5
categories/communication.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Communication",
|
||||||
|
"icon": "message-circle"
|
||||||
|
}
|
||||||
5
categories/connectivity.json
Normal file
5
categories/connectivity.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Connectivity",
|
||||||
|
"icon": "wifi"
|
||||||
|
}
|
||||||
5
categories/currency.json
Normal file
5
categories/currency.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Currency",
|
||||||
|
"icon": "dollar-sign"
|
||||||
|
}
|
||||||
5
categories/cursors.json
Normal file
5
categories/cursors.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Cursors",
|
||||||
|
"icon": "mouse-pointer-2"
|
||||||
|
}
|
||||||
5
categories/design.json
Normal file
5
categories/design.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Design",
|
||||||
|
"icon": "palette"
|
||||||
|
}
|
||||||
5
categories/development.json
Normal file
5
categories/development.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Coding & development",
|
||||||
|
"icon": "code-2"
|
||||||
|
}
|
||||||
5
categories/devices.json
Normal file
5
categories/devices.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Devices",
|
||||||
|
"icon": "smartphone"
|
||||||
|
}
|
||||||
5
categories/emoji.json
Normal file
5
categories/emoji.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Emoji",
|
||||||
|
"icon": "smile"
|
||||||
|
}
|
||||||
5
categories/files.json
Normal file
5
categories/files.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "File icons",
|
||||||
|
"icon": "layout"
|
||||||
|
}
|
||||||
5
categories/food-beverage.json
Normal file
5
categories/food-beverage.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Food & beverage",
|
||||||
|
"icon": "coffee"
|
||||||
|
}
|
||||||
5
categories/furniture.json
Normal file
5
categories/furniture.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Furniture",
|
||||||
|
"icon": "rocking-chair"
|
||||||
|
}
|
||||||
5
categories/gaming.json
Normal file
5
categories/gaming.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Gaming",
|
||||||
|
"icon": "gamepad-2"
|
||||||
|
}
|
||||||
5
categories/home.json
Normal file
5
categories/home.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Home",
|
||||||
|
"icon": "home"
|
||||||
|
}
|
||||||
5
categories/layout.json
Normal file
5
categories/layout.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Layout",
|
||||||
|
"icon": "layout"
|
||||||
|
}
|
||||||
5
categories/mail.json
Normal file
5
categories/mail.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Mail",
|
||||||
|
"icon": "mail"
|
||||||
|
}
|
||||||
5
categories/maps.json
Normal file
5
categories/maps.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Maps",
|
||||||
|
"icon": "map"
|
||||||
|
}
|
||||||
5
categories/maths.json
Normal file
5
categories/maths.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Maths",
|
||||||
|
"icon": "divide"
|
||||||
|
}
|
||||||
5
categories/medical.json
Normal file
5
categories/medical.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Medical",
|
||||||
|
"icon": "heart"
|
||||||
|
}
|
||||||
5
categories/money.json
Normal file
5
categories/money.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Money",
|
||||||
|
"icon": "piggy-bank"
|
||||||
|
}
|
||||||
5
categories/multimedia.json
Normal file
5
categories/multimedia.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Multimedia",
|
||||||
|
"icon": "play-circle"
|
||||||
|
}
|
||||||
5
categories/nature.json
Normal file
5
categories/nature.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Nature",
|
||||||
|
"icon": "sprout"
|
||||||
|
}
|
||||||
5
categories/navigation.json
Normal file
5
categories/navigation.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Navigation",
|
||||||
|
"icon": "compass"
|
||||||
|
}
|
||||||
5
categories/notifications.json
Normal file
5
categories/notifications.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Notifications",
|
||||||
|
"icon": "alert-triangle"
|
||||||
|
}
|
||||||
5
categories/people.json
Normal file
5
categories/people.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "People",
|
||||||
|
"icon": "person-standing"
|
||||||
|
}
|
||||||
5
categories/photography.json
Normal file
5
categories/photography.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Photography",
|
||||||
|
"icon": "camera"
|
||||||
|
}
|
||||||
5
categories/science.json
Normal file
5
categories/science.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Science",
|
||||||
|
"icon": "flask-conical"
|
||||||
|
}
|
||||||
5
categories/seasons.json
Normal file
5
categories/seasons.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Seasons",
|
||||||
|
"icon": "leaf"
|
||||||
|
}
|
||||||
5
categories/security.json
Normal file
5
categories/security.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Security",
|
||||||
|
"icon": "shield"
|
||||||
|
}
|
||||||
5
categories/shapes.json
Normal file
5
categories/shapes.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Shapes",
|
||||||
|
"icon": "triangle"
|
||||||
|
}
|
||||||
5
categories/shopping.json
Normal file
5
categories/shopping.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Shopping",
|
||||||
|
"icon": "shopping-bag"
|
||||||
|
}
|
||||||
5
categories/social.json
Normal file
5
categories/social.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Social",
|
||||||
|
"icon": "thumbs-up"
|
||||||
|
}
|
||||||
5
categories/sports.json
Normal file
5
categories/sports.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Sports",
|
||||||
|
"icon": "type"
|
||||||
|
}
|
||||||
5
categories/sustainability.json
Normal file
5
categories/sustainability.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Sustainability",
|
||||||
|
"icon": "recycle"
|
||||||
|
}
|
||||||
5
categories/text.json
Normal file
5
categories/text.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Text formatting",
|
||||||
|
"icon": "type"
|
||||||
|
}
|
||||||
5
categories/time.json
Normal file
5
categories/time.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Time & calendar",
|
||||||
|
"icon": "calendar"
|
||||||
|
}
|
||||||
5
categories/tools.json
Normal file
5
categories/tools.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Tools",
|
||||||
|
"icon": "hammer"
|
||||||
|
}
|
||||||
5
categories/transportation.json
Normal file
5
categories/transportation.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Transportation",
|
||||||
|
"icon": "train-front"
|
||||||
|
}
|
||||||
5
categories/travel.json
Normal file
5
categories/travel.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Travel",
|
||||||
|
"icon": "backpack"
|
||||||
|
}
|
||||||
5
categories/weather.json
Normal file
5
categories/weather.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Weather",
|
||||||
|
"icon": "cloud-sun"
|
||||||
|
}
|
||||||
34
category.schema.json
Normal file
34
category.schema.json
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://lucide.dev/category.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"$vocabulary": {
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/core": true,
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/applicator": true,
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/validation": true,
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/meta-data": true,
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
|
||||||
|
"https://json-schema.org/draft/2020-12/vocab/content": true
|
||||||
|
},
|
||||||
|
"title": "Lucide Icons category schema",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"title": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"weight": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"title",
|
||||||
|
"icon"
|
||||||
|
],
|
||||||
|
"description": "A JSON Schema for categories defined by Lucide Icons."
|
||||||
|
}
|
||||||
11
docs/.vitepress/api/categories/index.get.ts
Normal file
11
docs/.vitepress/api/categories/index.get.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { eventHandler, setResponseHeader } from 'h3'
|
||||||
|
import iconMetaData from '../../data/iconMetaData'
|
||||||
|
|
||||||
|
export default eventHandler((event) => {
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400')
|
||||||
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
|
return Object.fromEntries(
|
||||||
|
Object.entries(iconMetaData).map(([name, { categories }]) => [ name, categories ])
|
||||||
|
)
|
||||||
|
})
|
||||||
41
docs/.vitepress/api/gh-icon/[...data].get.ts
Normal file
41
docs/.vitepress/api/gh-icon/[...data].get.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { eventHandler, setResponseHeader, defaultContentType } from 'h3'
|
||||||
|
import { renderToString, renderToStaticMarkup } from 'react-dom/server'
|
||||||
|
import { createElement } from 'react'
|
||||||
|
import SvgPreview from '../../lib/SvgPreview/index.tsx';
|
||||||
|
import iconNodes from '../../data/iconNodes'
|
||||||
|
import createLucideIcon from 'lucide-react/src/createLucideIcon'
|
||||||
|
import Backdrop from '../../lib/SvgPreview/Backdrop.tsx';
|
||||||
|
|
||||||
|
export default eventHandler((event) => {
|
||||||
|
const { params } = event.context
|
||||||
|
|
||||||
|
const [name, svgData] = params.data.split('/');
|
||||||
|
const data = svgData.slice(0, -4);
|
||||||
|
|
||||||
|
const src = Buffer.from(data, 'base64').toString('utf8');
|
||||||
|
|
||||||
|
const children = []
|
||||||
|
|
||||||
|
if (name in iconNodes) {
|
||||||
|
const iconNode = iconNodes[name]
|
||||||
|
|
||||||
|
const LucideIcon = createLucideIcon(name, iconNode)
|
||||||
|
const svg = renderToStaticMarkup(createElement(LucideIcon))
|
||||||
|
const backdropString = svg.replace(/<svg[^>]*>|<\/svg>/g, '');
|
||||||
|
|
||||||
|
children.push(createElement(Backdrop, { backdropString, src }))
|
||||||
|
}
|
||||||
|
|
||||||
|
const svg = Buffer.from(
|
||||||
|
// We can't use jsx here, is not supported here by nitro.
|
||||||
|
renderToString(createElement(SvgPreview, {src, showGrid: true}, children)).replace(
|
||||||
|
/>/,
|
||||||
|
'><style>@media screen and (prefers-color-scheme: dark) { svg { stroke: #fff } }</style>'
|
||||||
|
)
|
||||||
|
).toString('utf8');
|
||||||
|
|
||||||
|
defaultContentType(event, 'image/svg+xml')
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000')
|
||||||
|
|
||||||
|
return svg
|
||||||
|
})
|
||||||
73
docs/.vitepress/api/gh-icon/dpi/[...data].get.ts
Normal file
73
docs/.vitepress/api/gh-icon/dpi/[...data].get.ts
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
import { eventHandler, setResponseHeader, defaultContentType } from 'h3';
|
||||||
|
import { Resvg, initWasm } from '@resvg/resvg-wasm';
|
||||||
|
import wasm from './loadWasm';
|
||||||
|
|
||||||
|
var initializedResvg = initWasm(wasm);
|
||||||
|
|
||||||
|
export default eventHandler(async (event) => {
|
||||||
|
const { params = {} } = event.context;
|
||||||
|
await initializedResvg;
|
||||||
|
|
||||||
|
const imageSize = 96;
|
||||||
|
const [iconSizeString, svgData] = params.data.split('/');
|
||||||
|
const iconSize = parseInt(iconSizeString, 10);
|
||||||
|
const data = svgData.slice(0, -4);
|
||||||
|
|
||||||
|
const src = Buffer.from(data, 'base64').toString('utf8');
|
||||||
|
const svg = (src.includes('<svg') ? src : `<svg>${src}</svg>`)
|
||||||
|
.replace(/(\r\n|\n|\r)/gm, '')
|
||||||
|
.replace(
|
||||||
|
/<svg[^>]*/,
|
||||||
|
`<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="${iconSize}"
|
||||||
|
height="${iconSize}"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="#fff"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
`
|
||||||
|
);
|
||||||
|
|
||||||
|
const resvg = new Resvg(svg, { background: '#000' });
|
||||||
|
const pngData = resvg.render();
|
||||||
|
const pngBuffer = Buffer.from(pngData.asPng());
|
||||||
|
|
||||||
|
defaultContentType(event, 'image/svg+xml');
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000');
|
||||||
|
|
||||||
|
return `
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="${imageSize}" height="${imageSize}" viewBox="0 0 ${imageSize} ${imageSize}">
|
||||||
|
<style>
|
||||||
|
@media screen and (prefers-color-scheme: light) {
|
||||||
|
#fallback-background { fill: transparent; }
|
||||||
|
}
|
||||||
|
@media screen and (prefers-color-scheme: dark) {
|
||||||
|
#fallback-background { fill: transparent; }
|
||||||
|
rect { fill: #fff; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<mask id="mask">
|
||||||
|
<image
|
||||||
|
width="${imageSize}"
|
||||||
|
height="${imageSize}"
|
||||||
|
href="data:image/png;base64,${pngBuffer.toString('base64')}"
|
||||||
|
image-rendering="pixelated"
|
||||||
|
/>
|
||||||
|
</mask>
|
||||||
|
<rect
|
||||||
|
id="fallback-background"
|
||||||
|
width="${imageSize}"
|
||||||
|
height="${imageSize}" ry="${imageSize / 24}"
|
||||||
|
fill="#fff"
|
||||||
|
/>
|
||||||
|
<rect
|
||||||
|
width="${imageSize}"
|
||||||
|
height="${imageSize}"
|
||||||
|
fill="#000"
|
||||||
|
mask="url(#mask)"
|
||||||
|
/>
|
||||||
|
</svg>`;
|
||||||
|
});
|
||||||
15
docs/.vitepress/api/gh-icon/dpi/loadWasm.ts
Normal file
15
docs/.vitepress/api/gh-icon/dpi/loadWasm.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import fs from 'fs';
|
||||||
|
import module from 'node:module';
|
||||||
|
/* WASM_IMPORT */
|
||||||
|
|
||||||
|
let wasm;
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV === 'development') {
|
||||||
|
const require = module.createRequire(import.meta.url);
|
||||||
|
|
||||||
|
wasm = fs.readFileSync(require.resolve('@resvg/resvg-wasm/index_bg.wasm'));
|
||||||
|
} else {
|
||||||
|
wasm = resvg_wasm;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default wasm;
|
||||||
44
docs/.vitepress/api/gh-icon/stroke-width/[...data].get.ts
Normal file
44
docs/.vitepress/api/gh-icon/stroke-width/[...data].get.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { eventHandler, setResponseHeader, defaultContentType } from 'h3'
|
||||||
|
import { renderToString } from 'react-dom/server'
|
||||||
|
import { createElement } from 'react'
|
||||||
|
import SvgPreview from '../../../lib/SvgPreview/index.tsx';
|
||||||
|
import createLucideIcon, { IconNode } from 'lucide-react/src/createLucideIcon'
|
||||||
|
import { parseSync } from 'svgson';
|
||||||
|
|
||||||
|
export default eventHandler((event) => {
|
||||||
|
const { params } = event.context
|
||||||
|
|
||||||
|
const [strokeWidth, svgData] = params.data.split('/');
|
||||||
|
const data = svgData.slice(0, -4);
|
||||||
|
|
||||||
|
const src = Buffer.from(data, 'base64').toString('utf8');
|
||||||
|
|
||||||
|
const Icon = createLucideIcon(
|
||||||
|
'icon',
|
||||||
|
parseSync(src.includes('<svg') ? src : `<svg>${src}</svg>`).children.map(
|
||||||
|
({ name, attributes }) => [name, attributes]
|
||||||
|
) as IconNode
|
||||||
|
);
|
||||||
|
|
||||||
|
const svg = Buffer.from(
|
||||||
|
// We can't use jsx here, is not supported here by nitro.
|
||||||
|
renderToString(createElement(Icon, { strokeWidth }))
|
||||||
|
.replace(/fill\="none"/, 'fill="#fff"')
|
||||||
|
.replace(
|
||||||
|
/>/,
|
||||||
|
`><style>
|
||||||
|
@media screen and (prefers-color-scheme: light) {
|
||||||
|
svg { fill: transparent !important; }
|
||||||
|
}
|
||||||
|
@media screen and (prefers-color-scheme: dark) {
|
||||||
|
svg { stroke: #fff; fill: transparent !important; }
|
||||||
|
}
|
||||||
|
</style>`
|
||||||
|
)
|
||||||
|
).toString('utf8');
|
||||||
|
|
||||||
|
defaultContentType(event, 'image/svg+xml')
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000')
|
||||||
|
|
||||||
|
return svg
|
||||||
|
})
|
||||||
30
docs/.vitepress/api/icon-nodes/index.get.ts
Normal file
30
docs/.vitepress/api/icon-nodes/index.get.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { eventHandler, getQuery, setResponseHeader } from 'h3'
|
||||||
|
import iconNodes from '../../data/iconNodes'
|
||||||
|
import { IconNodeWithKeys } from '../../theme/types'
|
||||||
|
|
||||||
|
export default eventHandler((event) => {
|
||||||
|
const query = getQuery(event)
|
||||||
|
|
||||||
|
const withUniqueKeys = query.withUniqueKeys === 'true'
|
||||||
|
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400')
|
||||||
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
|
if (withUniqueKeys) {
|
||||||
|
return iconNodes
|
||||||
|
}
|
||||||
|
|
||||||
|
return Object.entries(iconNodes).reduce((acc, [name, iconNode]) => {
|
||||||
|
if (withUniqueKeys) {
|
||||||
|
return [name, iconNode]
|
||||||
|
}
|
||||||
|
|
||||||
|
const newIconNode = (iconNode as IconNodeWithKeys).map(([name, { key, ...attrs}]) => {
|
||||||
|
return [name, attrs]
|
||||||
|
})
|
||||||
|
|
||||||
|
acc[name] = newIconNode
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
})
|
||||||
45
docs/.vitepress/api/icons/[iconName].get.ts
Normal file
45
docs/.vitepress/api/icons/[iconName].get.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import { eventHandler, getQuery, setResponseHeader, createError } from 'h3'
|
||||||
|
import iconNodes from '../../data/iconNodes'
|
||||||
|
import createLucideIcon from 'lucide-react/src/createLucideIcon'
|
||||||
|
import { renderToString } from 'react-dom/server'
|
||||||
|
import { createElement } from 'react'
|
||||||
|
|
||||||
|
export default eventHandler((event) => {
|
||||||
|
const { params } = event.context
|
||||||
|
|
||||||
|
const iconNode = iconNodes[params.iconName]
|
||||||
|
|
||||||
|
if (iconNode == null) {
|
||||||
|
const error = createError({
|
||||||
|
statusCode: 404,
|
||||||
|
message: `Icon "${params.iconName}" not found`,
|
||||||
|
})
|
||||||
|
|
||||||
|
return sendError(event, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const width = getQuery(event).width || undefined
|
||||||
|
const height = getQuery(event).height || undefined
|
||||||
|
const color = getQuery(event).color || undefined
|
||||||
|
const strokeWidth = getQuery(event).strokeWidth || undefined
|
||||||
|
|
||||||
|
const LucideIcon = createLucideIcon(params.iconName, iconNode)
|
||||||
|
|
||||||
|
const svg = Buffer.from(
|
||||||
|
renderToString(
|
||||||
|
createElement(LucideIcon, {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
color: color ? `#${color}` : undefined,
|
||||||
|
strokeWidth,
|
||||||
|
}
|
||||||
|
))
|
||||||
|
).toString('utf8');
|
||||||
|
|
||||||
|
defaultContentType(event, 'image/svg+xml')
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000')
|
||||||
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
|
return svg
|
||||||
|
|
||||||
|
})
|
||||||
11
docs/.vitepress/api/tags/index.get.ts
Normal file
11
docs/.vitepress/api/tags/index.get.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { eventHandler, setResponseHeader } from 'h3'
|
||||||
|
import iconMetaData from '../../data/iconMetaData'
|
||||||
|
|
||||||
|
export default eventHandler((event) => {
|
||||||
|
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400')
|
||||||
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
|
return Object.fromEntries(
|
||||||
|
Object.entries(iconMetaData).map(([name, { tags }]) => [ name, tags ])
|
||||||
|
)
|
||||||
|
})
|
||||||
3
docs/.vitepress/api/test.ts
Normal file
3
docs/.vitepress/api/test.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default eventHandler(() => {
|
||||||
|
return { nitro: 'Is Awesome! asda' }
|
||||||
|
})
|
||||||
125
docs/.vitepress/config.ts
Normal file
125
docs/.vitepress/config.ts
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
import { defineConfig } from 'vitepress'
|
||||||
|
import sidebar from './sidebar';
|
||||||
|
|
||||||
|
const title = "Lucide";
|
||||||
|
const socialTitle = "Lucide Icons";
|
||||||
|
const description = "Beautiful & consistent icon toolkit made by the community."
|
||||||
|
|
||||||
|
// https://vitepress.dev/reference/site-config
|
||||||
|
export default defineConfig({
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
cleanUrls: true,
|
||||||
|
outDir: '.vercel/output/static',
|
||||||
|
srcExclude: ['**/README.md'],
|
||||||
|
vite: {
|
||||||
|
resolve: {
|
||||||
|
alias: [
|
||||||
|
{
|
||||||
|
find: /^.*\/VPIconAlignLeft\.vue$/,
|
||||||
|
replacement: fileURLToPath(
|
||||||
|
new URL('./theme/components/overrides/VPIconAlignLeft.vue', import.meta.url)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
find: /^.*\/VPFooter\.vue$/,
|
||||||
|
replacement: fileURLToPath(
|
||||||
|
new URL('./theme/components/overrides/VPFooter.vue', import.meta.url)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
head: [
|
||||||
|
[ 'script', {
|
||||||
|
src: 'https://analytics.lucide.dev/js/script.js',
|
||||||
|
'data-domain': 'lucide.dev',
|
||||||
|
defer: ''
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:locale",
|
||||||
|
content:"en_US"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:type",
|
||||||
|
content:"website"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:site_name",
|
||||||
|
content: title,
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:title",
|
||||||
|
content: socialTitle,
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:description",
|
||||||
|
content: description
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:url",
|
||||||
|
content:"https://lucide.dev"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:image",
|
||||||
|
content: "https://lucide.dev/og.png"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:image:width",
|
||||||
|
content:"1200"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:image:height",
|
||||||
|
content:"630"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"og:image:type",
|
||||||
|
content:"image/png"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"twitter:card",
|
||||||
|
content:"summary_large_image"
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"twitter:title",
|
||||||
|
content: socialTitle,
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"twitter:description",
|
||||||
|
content: description
|
||||||
|
}],
|
||||||
|
[ 'meta', {
|
||||||
|
property:"twitter:image",
|
||||||
|
content:"https://lucide.dev/og.png"
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
themeConfig: {
|
||||||
|
// https://vitepress.dev/reference/default-theme-config
|
||||||
|
logo: {
|
||||||
|
light: '/logo.light.svg',
|
||||||
|
dark: '/logo.dark.svg'
|
||||||
|
},
|
||||||
|
nav: [
|
||||||
|
{ text: 'Icons', link: '/icons/' },
|
||||||
|
{ text: 'Guide', link: '/guide/' },
|
||||||
|
{ text: 'Packages', link: '/packages' },
|
||||||
|
{ text: 'License', link: '/license' },
|
||||||
|
],
|
||||||
|
sidebar,
|
||||||
|
socialLinks: [
|
||||||
|
{ icon: 'github', link: 'https://github.com/lucide-icons/lucide' },
|
||||||
|
{ icon: 'discord', link: 'https://discord.gg/EH6nSts' }
|
||||||
|
],
|
||||||
|
footer: {
|
||||||
|
message: 'Released under the ISC License.',
|
||||||
|
copyright: `Copyright © ${new Date().getFullYear()} Lucide Contributors`
|
||||||
|
},
|
||||||
|
editLink: {
|
||||||
|
pattern: 'https://github.com/lucide-icons/lucide/edit/main/docs/:path'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
sitemap: {
|
||||||
|
hostname: 'https://lucide.dev/'
|
||||||
|
}
|
||||||
|
})
|
||||||
80
docs/.vitepress/data/packageData.thirdParty.json
Normal file
80
docs/.vitepress/data/packageData.thirdParty.json
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "blade-lucide-icons",
|
||||||
|
"description": "Implementation of Lucide icon's using blade-icons for Laravel based projects.",
|
||||||
|
"icon": "/framework-logos/laravel.svg",
|
||||||
|
"shields": [
|
||||||
|
{
|
||||||
|
"alt": "Latest Stable Version",
|
||||||
|
"src": "https://img.shields.io/packagist/v/mallardduck/blade-lucide-icons",
|
||||||
|
"href": "https://packagist.org/packages/mallardduck/blade-lucide-icons"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"alt": "Total Downloads",
|
||||||
|
"src": "https://img.shields.io/packagist/dt/mallardduck/blade-lucide-icons",
|
||||||
|
"href": "https://packagist.org/packages/mallardduck/blade-lucide-icons"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "https://github.com/mallardduck/blade-lucide-icons",
|
||||||
|
"documentation": "https://github.com/mallardduck/blade-lucide-icons/blob/main/README.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hyva-lucide-icons",
|
||||||
|
"description": "Implementation of Lucide icon's using Hyvä's svg php viewmodal to render icons for Magento 2 Hyva theme based projects.",
|
||||||
|
"icon": "/framework-logos/hyva.svg",
|
||||||
|
"iconDark": "/framework-logos/hyva-dark.svg",
|
||||||
|
"shields": [
|
||||||
|
{
|
||||||
|
"alt": "Latest Stable Version",
|
||||||
|
"src": "https://img.shields.io/packagist/v/siteation/magento2-hyva-icons-lucide",
|
||||||
|
"href": "https://packagist.org/packages/siteation/magento2-hyva-icons-lucide"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"alt": "Total Downloads",
|
||||||
|
"src": "https://img.shields.io/packagist/dt/siteation/magento2-hyva-icons-lucide",
|
||||||
|
"href": "https://packagist.org/packages/siteation/magento2-hyva-icons-lucide"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "https://github.com/siteation/magento2-hyva-icons-lucide",
|
||||||
|
"documentation": "https://github.com/siteation/magento2-hyva-icons-lucide/blob/main/README.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "eleventy-lucide-icons",
|
||||||
|
"description": "Using this plugin, Eleventy projects can incorporate Lucide icons. it makes it simple to use Lucide icons into your themes via shortcodes, improving your website's overall usability and visual appeal.",
|
||||||
|
"icon": "/framework-logos/11ty.svg",
|
||||||
|
"iconClass": "package-icon-invert",
|
||||||
|
"shields": [
|
||||||
|
{
|
||||||
|
"alt": "Latest Stable Version",
|
||||||
|
"src": "https://img.shields.io/npm/v/@grimlink/eleventy-plugin-lucide-icons",
|
||||||
|
"href": "https://www.npmjs.com/package/@grimlink/eleventy-plugin-lucide-icons"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"alt": "Total Downloads",
|
||||||
|
"src": "https://img.shields.io/npm/dw/@grimlink/eleventy-plugin-lucide-icons",
|
||||||
|
"href": "https://www.npmjs.com/package/@grimlink/eleventy-plugin-lucide-icons"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "https://github.com/GrimLink/eleventy-plugin-lucide-icons",
|
||||||
|
"documentation": "https://github.com/GrimLink/eleventy-plugin-lucide-icons/blob/main/README.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nuxt-lucide-icons",
|
||||||
|
"description": "Using this module, Nuxt projects can incorporate Lucide icons. It is fully configurable and supports auto imports and tree-shaking.",
|
||||||
|
"icon": "/framework-logos/nuxt.svg",
|
||||||
|
"shields": [
|
||||||
|
{
|
||||||
|
"alt": "Latest Stable Version",
|
||||||
|
"src": "https://img.shields.io/npm/v/nuxt-lucide-icons",
|
||||||
|
"href": "https://www.npmjs.com/package/nuxt-lucide-icons"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"alt": "Total Downloads",
|
||||||
|
"src": "https://img.shields.io/npm/dw/nuxt-lucide-icons",
|
||||||
|
"href": "https://www.npmjs.com/package/nuxt-lucide-icons"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "https://github.com/swisnl/nuxt-lucide-icons",
|
||||||
|
"documentation": "https://github.com/swisnl/nuxt-lucide-icons/blob/main/README.md"
|
||||||
|
}
|
||||||
|
]
|
||||||
71
docs/.vitepress/lib/SvgPreview/Backdrop.tsx
Normal file
71
docs/.vitepress/lib/SvgPreview/Backdrop.tsx
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
interface BackdropProps {
|
||||||
|
src: string
|
||||||
|
backdropString: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const Backdrop = ({ src, backdropString }: BackdropProps): JSX.Element => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<defs xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<pattern
|
||||||
|
id="pattern"
|
||||||
|
width=".1"
|
||||||
|
height=".1"
|
||||||
|
patternUnits="userSpaceOnUse"
|
||||||
|
patternTransform="rotate(45 50 50)"
|
||||||
|
>
|
||||||
|
<line stroke="red" strokeWidth={0.1} y2={1} />
|
||||||
|
<line stroke="red" strokeWidth={0.1} y2={1} />
|
||||||
|
</pattern>
|
||||||
|
</defs>
|
||||||
|
<mask id="svg-preview-backdrop-mask-outline" maskUnits="userSpaceOnUse">
|
||||||
|
<g stroke="#fff" dangerouslySetInnerHTML={{ __html: backdropString }} />
|
||||||
|
<g dangerouslySetInnerHTML={{ __html: src }} strokeWidth={2.05} />
|
||||||
|
</mask>
|
||||||
|
<mask id="svg-preview-backdrop-mask-fill" maskUnits="userSpaceOnUse">
|
||||||
|
<g stroke="#fff" dangerouslySetInnerHTML={{ __html: backdropString }} />
|
||||||
|
<g dangerouslySetInnerHTML={{ __html: src }} strokeWidth={2.05} />
|
||||||
|
<g strokeWidth={1.75} dangerouslySetInnerHTML={{ __html: backdropString }} />
|
||||||
|
</mask>
|
||||||
|
<g
|
||||||
|
strokeWidth={2.25}
|
||||||
|
stroke="url(#pattern)"
|
||||||
|
mask={'url(#svg-preview-backdrop-mask-outline)'}
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="url(#pattern)"
|
||||||
|
opacity={0.5}
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="url(#pattern)"
|
||||||
|
stroke="none"
|
||||||
|
mask={'url(#svg-preview-backdrop-mask-fill)'}
|
||||||
|
/>
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="red"
|
||||||
|
opacity={0.5}
|
||||||
|
stroke="none"
|
||||||
|
mask={'url(#svg-preview-backdrop-mask-fill)'}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default Backdrop;
|
||||||
271
docs/.vitepress/lib/SvgPreview/index.tsx
Normal file
271
docs/.vitepress/lib/SvgPreview/index.tsx
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { PathProps, Path } from './types';
|
||||||
|
import { getPaths, assert } from './utils';
|
||||||
|
|
||||||
|
const Grid = ({
|
||||||
|
radius,
|
||||||
|
fill = '#fff',
|
||||||
|
...props
|
||||||
|
}: {
|
||||||
|
strokeWidth: number;
|
||||||
|
radius: number;
|
||||||
|
} & PathProps<'stroke', 'strokeWidth'>) => (
|
||||||
|
<g className="svg-preview-grid-group" strokeLinecap="butt" {...props}>
|
||||||
|
<rect
|
||||||
|
className="svg-preview-grid-rect"
|
||||||
|
width={24 - props.strokeWidth}
|
||||||
|
height={24 - props.strokeWidth}
|
||||||
|
x={props.strokeWidth / 2}
|
||||||
|
y={props.strokeWidth / 2}
|
||||||
|
rx={radius}
|
||||||
|
fill={fill}
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d={
|
||||||
|
props.d ||
|
||||||
|
new Array(Math.floor(24 - 1))
|
||||||
|
.fill(null)
|
||||||
|
.flatMap((_, i) => [
|
||||||
|
`M${props.strokeWidth} ${i + 1}h${24 - props.strokeWidth * 2}`,
|
||||||
|
`M${i + 1} ${props.strokeWidth}v${24 - props.strokeWidth * 2}`,
|
||||||
|
])
|
||||||
|
.join('')
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
);
|
||||||
|
|
||||||
|
const Shadow = ({
|
||||||
|
radius,
|
||||||
|
paths,
|
||||||
|
...props
|
||||||
|
}: {
|
||||||
|
radius: number;
|
||||||
|
paths: Path[];
|
||||||
|
} & PathProps<'stroke' | 'strokeWidth' | 'strokeOpacity', 'd'>) => {
|
||||||
|
const groupedPaths = Object.entries(
|
||||||
|
paths.reduce((groups, val) => {
|
||||||
|
const key = val.c.id;
|
||||||
|
groups[key] = [...(groups[key] || []), val];
|
||||||
|
return groups;
|
||||||
|
}, {} as Record<number, Path[]>)
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<g className="svg-preview-shadow-mask-group" {...props}>
|
||||||
|
{groupedPaths.map(([id, paths]) => (
|
||||||
|
<mask
|
||||||
|
id={`svg-preview-shadow-mask-${id}`}
|
||||||
|
maskUnits="userSpaceOnUse"
|
||||||
|
strokeOpacity="1"
|
||||||
|
strokeWidth={props.strokeWidth}
|
||||||
|
stroke="#000"
|
||||||
|
>
|
||||||
|
<rect x={0} y={0} width={24} height={24} fill="#fff" stroke="none" rx={radius} />
|
||||||
|
<path
|
||||||
|
d={paths
|
||||||
|
.flatMap(({ prev, next }) => [
|
||||||
|
`M${prev.x} ${prev.y}h.01`,
|
||||||
|
`M${next.x} ${next.y}h.01`,
|
||||||
|
])
|
||||||
|
.filter((val, idx, arr) => arr.indexOf(val) === idx)
|
||||||
|
.join('')}
|
||||||
|
/>
|
||||||
|
</mask>
|
||||||
|
))}
|
||||||
|
</g>
|
||||||
|
<g className="svg-preview-shadow-group" {...props}>
|
||||||
|
{paths.map(({ d, c: { id } }, i) => (
|
||||||
|
<path key={i} mask={`url(#svg-preview-shadow-mask-${id})`} d={d} />
|
||||||
|
))}
|
||||||
|
<path
|
||||||
|
d={paths
|
||||||
|
.flatMap(({ prev, next }) => [`M${prev.x} ${prev.y}h.01`, `M${next.x} ${next.y}h.01`])
|
||||||
|
.filter((val, idx, arr) => arr.indexOf(val) === idx)
|
||||||
|
.join('')}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ColoredPath = ({
|
||||||
|
colors,
|
||||||
|
paths,
|
||||||
|
...props
|
||||||
|
}: { paths: Path[]; colors: string[] } & PathProps<never, 'd' | 'stroke'>) => (
|
||||||
|
<g className="svg-preview-colored-path-group" {...props}>
|
||||||
|
{paths.map(({ d, c }, i) => (
|
||||||
|
<path key={i} d={d} stroke={colors[(c.name === 'path' ? i : c.id) % colors.length]} />
|
||||||
|
))}
|
||||||
|
</g>
|
||||||
|
);
|
||||||
|
|
||||||
|
const ControlPath = ({
|
||||||
|
paths,
|
||||||
|
radius,
|
||||||
|
pointSize,
|
||||||
|
...props
|
||||||
|
}: { pointSize: number; paths: Path[]; radius: number } & PathProps<
|
||||||
|
'stroke' | 'strokeWidth',
|
||||||
|
'd'
|
||||||
|
>) => {
|
||||||
|
const controlPaths = paths.map((path, i) => {
|
||||||
|
const element = paths.filter((p) => p.c.id === path.c.id);
|
||||||
|
const lastElement = element.at(-1)?.next;
|
||||||
|
assert(lastElement);
|
||||||
|
const isClosed = element[0].prev.x === lastElement.x && element[0].prev.y === lastElement.y;
|
||||||
|
const showMarker = !['rect', 'circle', 'ellipse'].includes(path.c.name);
|
||||||
|
return {
|
||||||
|
...path,
|
||||||
|
showMarker,
|
||||||
|
startMarker: showMarker && path.isStart && !isClosed,
|
||||||
|
endMarker: showMarker && paths[i + 1]?.isStart !== false && !isClosed,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<g
|
||||||
|
className="svg-preview-control-path-marker-mask-group"
|
||||||
|
strokeWidth={pointSize}
|
||||||
|
stroke="#000"
|
||||||
|
>
|
||||||
|
{controlPaths.map(({ prev, next, showMarker }, i) => {
|
||||||
|
return (
|
||||||
|
showMarker && (
|
||||||
|
<mask
|
||||||
|
id={`svg-preview-control-path-marker-mask-${i}`}
|
||||||
|
key={i}
|
||||||
|
maskUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<rect x="0" y="0" width="24" height="24" fill="#fff" stroke="none" rx={radius} />
|
||||||
|
<path d={`M${prev.x} ${prev.y}h.01`} />
|
||||||
|
<path d={`M${next.x} ${next.y}h.01`} />
|
||||||
|
</mask>
|
||||||
|
)
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</g>
|
||||||
|
<g className="svg-preview-control-path-group" {...props}>
|
||||||
|
{controlPaths.map(({ d, showMarker }, i) => (
|
||||||
|
<path
|
||||||
|
key={i}
|
||||||
|
mask={showMarker ? `url(#svg-preview-control-path-marker-mask-${i})` : undefined}
|
||||||
|
d={d}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</g>
|
||||||
|
<g className="svg-preview-control-path-marker-group" {...props}>
|
||||||
|
<path
|
||||||
|
d={controlPaths
|
||||||
|
.flatMap(({ prev, next, showMarker }) =>
|
||||||
|
showMarker ? [`M${prev.x} ${prev.y}h.01`, `M${next.x} ${next.y}h.01`] : []
|
||||||
|
)
|
||||||
|
.join('')}
|
||||||
|
/>
|
||||||
|
{controlPaths.map(({ d, prev, next, startMarker, endMarker }, i) => (
|
||||||
|
<React.Fragment key={i}>
|
||||||
|
{startMarker && <circle cx={prev.x} cy={prev.y} r={pointSize / 2} />}
|
||||||
|
{endMarker && <circle cx={next.x} cy={next.y} r={pointSize / 2} />}
|
||||||
|
</React.Fragment>
|
||||||
|
))}
|
||||||
|
</g>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Radii = ({
|
||||||
|
paths,
|
||||||
|
...props
|
||||||
|
}: { paths: Path[] } & PathProps<
|
||||||
|
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
|
||||||
|
any
|
||||||
|
>) => {
|
||||||
|
return (
|
||||||
|
<g className="svg-preview-radii-group" {...props}>
|
||||||
|
{paths
|
||||||
|
.filter(({ circle }) => circle)
|
||||||
|
.map(({ c, prev, next, circle: { x, y, r } }) =>
|
||||||
|
c.name === 'circle' ? (
|
||||||
|
<path d={`M${x} ${y}h.01`} />
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<path d={`M${prev.x} ${prev.y} ${x} ${y} ${next.x} ${next.y}`} />
|
||||||
|
<circle cy={y} cx={x} r={r} />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</g>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const SvgPreview = React.forwardRef<
|
||||||
|
SVGSVGElement,
|
||||||
|
{
|
||||||
|
src: string | ReturnType<typeof getPaths>;
|
||||||
|
showGrid?: boolean;
|
||||||
|
} & React.SVGProps<SVGSVGElement>
|
||||||
|
>(({ src, children, showGrid = false, ...props }, ref) => {
|
||||||
|
const paths = typeof src === 'string' ? getPaths(src) : src;
|
||||||
|
|
||||||
|
const darkModeCss = `@media screen and (prefers-color-scheme: light) {
|
||||||
|
.svg-preview-grid-rect { fill: none }
|
||||||
|
}
|
||||||
|
@media screen and (prefers-color-scheme: dark) {
|
||||||
|
.svg-preview-grid-rect { fill: none }
|
||||||
|
.svg
|
||||||
|
.svg-preview-grid-group,
|
||||||
|
.svg-preview-radii-group,
|
||||||
|
.svg-preview-shadow-mask-group,
|
||||||
|
.svg-preview-shadow-group {
|
||||||
|
stroke: #fff;
|
||||||
|
}
|
||||||
|
}`;
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
ref={ref}
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width={24}
|
||||||
|
height={24}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth={2}
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<style>{darkModeCss}</style>
|
||||||
|
{showGrid && <Grid strokeWidth={0.1} stroke="#777" strokeOpacity={0.3} radius={1} />}
|
||||||
|
<Shadow paths={paths} strokeWidth={4} stroke="#777" radius={1} strokeOpacity={0.15} />
|
||||||
|
<ColoredPath
|
||||||
|
paths={paths}
|
||||||
|
colors={[
|
||||||
|
'#1982c4',
|
||||||
|
'#4267AC',
|
||||||
|
'#6a4c93',
|
||||||
|
'#B55379',
|
||||||
|
'#FF595E',
|
||||||
|
'#FF7655',
|
||||||
|
'#ff924c',
|
||||||
|
'#FFAE43',
|
||||||
|
'#ffca3a',
|
||||||
|
'#C5CA30',
|
||||||
|
'#8ac926',
|
||||||
|
'#52A675',
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<Radii
|
||||||
|
paths={paths}
|
||||||
|
strokeWidth={0.12}
|
||||||
|
strokeDasharray="0 0.25 0.25"
|
||||||
|
stroke="#777"
|
||||||
|
strokeOpacity={0.3}
|
||||||
|
/>
|
||||||
|
<ControlPath radius={1} paths={paths} pointSize={1} stroke="#fff" strokeWidth={0.125} />
|
||||||
|
{children}
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default SvgPreview;
|
||||||
22
docs/.vitepress/lib/SvgPreview/types.ts
Normal file
22
docs/.vitepress/lib/SvgPreview/types.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { SVGProps } from 'react';
|
||||||
|
import { getCommands } from './utils';
|
||||||
|
|
||||||
|
export type Point = { x: number; y: number };
|
||||||
|
|
||||||
|
export type Path = {
|
||||||
|
d: string;
|
||||||
|
prev: Point;
|
||||||
|
next: Point;
|
||||||
|
isStart: boolean;
|
||||||
|
circle: { x: number; y: number; r: number };
|
||||||
|
c: ReturnType<typeof getCommands>[number];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type PathProps<
|
||||||
|
RequiredProps extends keyof SVGProps<SVGPathElement | SVGRectElement | SVGCircleElement>,
|
||||||
|
NeverProps extends keyof SVGProps<SVGPathElement | SVGRectElement | SVGCircleElement>
|
||||||
|
> = Required<Pick<React.SVGProps<SVGElement & SVGRectElement & SVGCircleElement>, RequiredProps>> &
|
||||||
|
Omit<
|
||||||
|
React.SVGProps<SVGPathElement & SVGRectElement & SVGCircleElement>,
|
||||||
|
RequiredProps & NeverProps
|
||||||
|
>;
|
||||||
286
docs/.vitepress/lib/SvgPreview/utils.ts
Normal file
286
docs/.vitepress/lib/SvgPreview/utils.ts
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
import { INode, parseSync } from 'svgson';
|
||||||
|
import toPath from 'element-to-path';
|
||||||
|
import { SVGPathData, encodeSVGPath } from 'svg-pathdata';
|
||||||
|
import { Path, Point } from './types';
|
||||||
|
|
||||||
|
function assertNever(x: never): never {
|
||||||
|
throw new Error('Unknown type: ' + x['type']);
|
||||||
|
}
|
||||||
|
export function assert(value: unknown): asserts value {
|
||||||
|
if (value === undefined) {
|
||||||
|
throw new Error('value must be defined');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const convertToPathNode = (node: INode): { d: string; name: typeof node.name } => {
|
||||||
|
if (node.name === 'path') {
|
||||||
|
return { d: node.attributes.d, name: node.name };
|
||||||
|
}
|
||||||
|
if (node.name === 'circle') {
|
||||||
|
const cx = parseFloat(node.attributes.cx);
|
||||||
|
const cy = parseFloat(node.attributes.cy);
|
||||||
|
const r = parseFloat(node.attributes.r);
|
||||||
|
return {
|
||||||
|
d: [
|
||||||
|
`M ${cx} ${cy - r}`,
|
||||||
|
`a ${r} ${r} 0 0 1 ${r} ${r}`,
|
||||||
|
`a ${r} ${r} 0 0 1 ${0 - r} ${r}`,
|
||||||
|
`a ${r} ${r} 0 0 1 ${0 - r} ${0 - r}`,
|
||||||
|
`a ${r} ${r} 0 0 1 ${r} ${0 - r}`,
|
||||||
|
].join(''),
|
||||||
|
name: node.name,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { d: toPath(node).replace(/z$/i, ''), name: node.name };
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractNodes = (node: INode): INode[] => {
|
||||||
|
if (['rect', 'circle', 'ellipse', 'polygon', 'polyline', 'line', 'path'].includes(node.name)) {
|
||||||
|
return [node];
|
||||||
|
} else if (node.children && Array.isArray(node.children)) {
|
||||||
|
return node.children.flatMap(extractNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getNodes = (src: string) =>
|
||||||
|
extractNodes(parseSync(src.includes('<svg') ? src : `<svg>${src}</svg>`));
|
||||||
|
|
||||||
|
export const getCommands = (src: string) =>
|
||||||
|
getNodes(src)
|
||||||
|
.map(convertToPathNode)
|
||||||
|
.flatMap(({ d, name }, idx) =>
|
||||||
|
new SVGPathData(d).toAbs().commands.map((c, cIdx) => ({ ...c, id: idx, idx: cIdx, name }))
|
||||||
|
);
|
||||||
|
|
||||||
|
export const getPaths = (src: string) => {
|
||||||
|
const commands = getCommands(src.includes('<svg') ? src : `<svg>${src}</svg>`);
|
||||||
|
const paths: Path[] = [];
|
||||||
|
let prev: Point | undefined = undefined;
|
||||||
|
let start: Point | undefined = undefined;
|
||||||
|
const addPath = (
|
||||||
|
c: typeof commands[number],
|
||||||
|
next: Point,
|
||||||
|
d?: string,
|
||||||
|
circle?: Path['circle']
|
||||||
|
) => {
|
||||||
|
assert(prev);
|
||||||
|
paths.push({
|
||||||
|
c,
|
||||||
|
d: d || `M ${prev.x} ${prev.y} L ${next.x} ${next.y}`,
|
||||||
|
prev,
|
||||||
|
next,
|
||||||
|
circle,
|
||||||
|
isStart: start === prev,
|
||||||
|
});
|
||||||
|
prev = next;
|
||||||
|
};
|
||||||
|
let prevCP: Point | undefined = undefined;
|
||||||
|
for (let i = 0; i < commands.length; i++) {
|
||||||
|
const previousCommand = commands[i - 1];
|
||||||
|
const c = commands[i];
|
||||||
|
switch (c.type) {
|
||||||
|
case SVGPathData.MOVE_TO: {
|
||||||
|
prev = c;
|
||||||
|
start = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.LINE_TO: {
|
||||||
|
assert(prev);
|
||||||
|
addPath(c, c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.HORIZ_LINE_TO: {
|
||||||
|
assert(prev);
|
||||||
|
addPath(c, { x: c.x, y: prev.y });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.VERT_LINE_TO: {
|
||||||
|
assert(prev);
|
||||||
|
addPath(c, { x: prev.x, y: c.y });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.CLOSE_PATH: {
|
||||||
|
assert(prev);
|
||||||
|
assert(start);
|
||||||
|
addPath(c, start);
|
||||||
|
start = undefined;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.CURVE_TO: {
|
||||||
|
assert(prev);
|
||||||
|
addPath(c, c, `M ${prev.x} ${prev.y} ${encodeSVGPath(c)}`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.SMOOTH_CURVE_TO: {
|
||||||
|
assert(prev);
|
||||||
|
assert(previousCommand);
|
||||||
|
const reflectedCp1 = {
|
||||||
|
x:
|
||||||
|
previousCommand &&
|
||||||
|
(previousCommand.type === SVGPathData.SMOOTH_CURVE_TO ||
|
||||||
|
previousCommand.type === SVGPathData.CURVE_TO)
|
||||||
|
? previousCommand.relative
|
||||||
|
? previousCommand.x2 - previousCommand.x
|
||||||
|
: previousCommand.x2 - prev.x
|
||||||
|
: 0,
|
||||||
|
y:
|
||||||
|
previousCommand &&
|
||||||
|
(previousCommand.type === SVGPathData.SMOOTH_CURVE_TO ||
|
||||||
|
previousCommand.type === SVGPathData.CURVE_TO)
|
||||||
|
? previousCommand.relative
|
||||||
|
? previousCommand.y2 - previousCommand.y
|
||||||
|
: previousCommand.y2 - prev.y
|
||||||
|
: 0,
|
||||||
|
};
|
||||||
|
addPath(
|
||||||
|
c,
|
||||||
|
c,
|
||||||
|
`M ${prev.x} ${prev.y} ${encodeSVGPath({
|
||||||
|
type: SVGPathData.CURVE_TO,
|
||||||
|
relative: false,
|
||||||
|
x: c.x,
|
||||||
|
y: c.y,
|
||||||
|
x1: prev.x - reflectedCp1.x,
|
||||||
|
y1: prev.y - reflectedCp1.y,
|
||||||
|
x2: c.x2,
|
||||||
|
y2: c.y2,
|
||||||
|
})}`
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.QUAD_TO: {
|
||||||
|
assert(prev);
|
||||||
|
addPath(c, c, `M ${prev.x} ${prev.y} ${encodeSVGPath(c)}`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.SMOOTH_QUAD_TO: {
|
||||||
|
assert(prev);
|
||||||
|
const backTrackCP = (
|
||||||
|
index: number,
|
||||||
|
currentPoint: { x: number; y: number }
|
||||||
|
): { x: number; y: number } => {
|
||||||
|
const previousCommand = commands[index - 1];
|
||||||
|
if (!previousCommand) {
|
||||||
|
return currentPoint;
|
||||||
|
}
|
||||||
|
if (previousCommand.type === SVGPathData.QUAD_TO) {
|
||||||
|
return {
|
||||||
|
x: previousCommand.relative
|
||||||
|
? currentPoint.x - (previousCommand.x1 - previousCommand.x)
|
||||||
|
: currentPoint.x - (previousCommand.x1 - currentPoint.x),
|
||||||
|
y: previousCommand.relative
|
||||||
|
? currentPoint.y - (previousCommand.y1 - previousCommand.y)
|
||||||
|
: currentPoint.y - (previousCommand.y1 - currentPoint.y),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (previousCommand.type === SVGPathData.SMOOTH_QUAD_TO) {
|
||||||
|
if (!prevCP) {
|
||||||
|
return currentPoint;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
x: currentPoint.x - (prevCP.x - currentPoint.x),
|
||||||
|
y: currentPoint.y - (prevCP.y - currentPoint.y),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return currentPoint;
|
||||||
|
};
|
||||||
|
prevCP = backTrackCP(i, prev);
|
||||||
|
addPath(
|
||||||
|
c,
|
||||||
|
c,
|
||||||
|
`M ${prev.x} ${prev.y} ${encodeSVGPath({
|
||||||
|
type: SVGPathData.QUAD_TO,
|
||||||
|
relative: false,
|
||||||
|
x: c.x,
|
||||||
|
y: c.y,
|
||||||
|
x1: prevCP.x,
|
||||||
|
y1: prevCP.y,
|
||||||
|
})}`
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SVGPathData.ARC: {
|
||||||
|
assert(prev);
|
||||||
|
const center = arcEllipseCenter(
|
||||||
|
prev.x,
|
||||||
|
prev.y,
|
||||||
|
c.rX,
|
||||||
|
c.rY,
|
||||||
|
c.xRot,
|
||||||
|
c.lArcFlag,
|
||||||
|
c.sweepFlag,
|
||||||
|
c.x,
|
||||||
|
c.y
|
||||||
|
);
|
||||||
|
addPath(
|
||||||
|
c,
|
||||||
|
c,
|
||||||
|
`M ${prev.x} ${prev.y} A${c.rX} ${c.rY} ${c.xRot} ${c.lArcFlag} ${c.sweepFlag} ${c.x} ${c.y}`,
|
||||||
|
c.rX === c.rY ? { ...center, r: c.rX } : undefined
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
assertNever(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const arcEllipseCenter = (
|
||||||
|
x1: number,
|
||||||
|
y1: number,
|
||||||
|
rx: number,
|
||||||
|
ry: number,
|
||||||
|
a: number,
|
||||||
|
fa: number,
|
||||||
|
fs: number,
|
||||||
|
x2: number,
|
||||||
|
y2: number
|
||||||
|
) => {
|
||||||
|
const phi = (a * Math.PI) / 180;
|
||||||
|
|
||||||
|
const M = [
|
||||||
|
[Math.cos(phi), Math.sin(phi)],
|
||||||
|
[-Math.sin(phi), Math.cos(phi)],
|
||||||
|
];
|
||||||
|
const V = [(x1 - x2) / 2, (y1 - y2) / 2];
|
||||||
|
|
||||||
|
const [x1p, y1p] = [M[0][0] * V[0] + M[0][1] * V[1], M[1][0] * V[0] + M[1][1] * V[1]];
|
||||||
|
|
||||||
|
rx = Math.abs(rx);
|
||||||
|
ry = Math.abs(ry);
|
||||||
|
|
||||||
|
const lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);
|
||||||
|
if (lambda > 1) {
|
||||||
|
rx = Math.sqrt(lambda) * rx;
|
||||||
|
ry = Math.sqrt(lambda) * ry;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sign = fa === fs ? -1 : 1;
|
||||||
|
|
||||||
|
const co =
|
||||||
|
sign *
|
||||||
|
Math.sqrt(
|
||||||
|
Math.max(rx * rx * ry * ry - rx * rx * y1p * y1p - ry * ry * x1p * x1p, 0) /
|
||||||
|
(rx * rx * y1p * y1p + ry * ry * x1p * x1p)
|
||||||
|
);
|
||||||
|
|
||||||
|
const V2 = [(rx * y1p) / ry, (-ry * x1p) / rx];
|
||||||
|
const Cp = [V2[0] * co, V2[1] * co];
|
||||||
|
|
||||||
|
const M2 = [
|
||||||
|
[Math.cos(phi), -Math.sin(phi)],
|
||||||
|
[Math.sin(phi), Math.cos(phi)],
|
||||||
|
];
|
||||||
|
const V3 = [(x1 + x2) / 2, (y1 + y2) / 2];
|
||||||
|
const C = [
|
||||||
|
M2[0][0] * Cp[0] + M2[0][1] * Cp[1] + V3[0],
|
||||||
|
M2[1][0] * Cp[0] + M2[1][1] * Cp[1] + V3[1],
|
||||||
|
];
|
||||||
|
|
||||||
|
return { x: C[0], y: C[1] };
|
||||||
|
};
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user