Compare commits

...

147 Commits

Author SHA1 Message Date
Eric Fennis
224b4e60c2 Init setup commit lint 2024-07-22 13:46:09 +02:00
Karsa
f2f685bd65 meta(icons): adds extra tags to utensils icons (#2192)
* fix(icons): adds extra tags to utensils icons

* feat(icons): add aliases to utensils

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-22 09:44:25 +02:00
Karsa
18d18361e8 feat(icons): fix chart naming scheme, lucide-ize appearance, et cetera (#2219)
* feat(icons): fix chart naming scheme, lucide-ize appearance, add some extra variants that were implied but missing

* feat(icons): fix missing SVG code

* feat(icons): fix linting issue

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-22 09:43:12 +02:00
Andreas Sas
45c3c00d1d feat(icons): added dam icon (#2233)
* Added icons/dam.svg

* Added icons/dam.json

* Update icons/dam.json

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

* Update icons/dam.json

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

* Update icons/dam.svg

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

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-07-22 09:31:59 +02:00
Jakob Guddas
45bc8c08da fix(icons): closed gaps in dog icon (#2249)
* Updated icons/dog.svg

* Updated icons/dog.json

* Updated icons/dog.svg
2024-07-22 09:31:30 +02:00
Jakob Guddas
6676cdd513 fix(icons): changed key-square icon (#2277)
* Updated icons/key-square.svg

* Updated icons/key-square.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-22 09:29:38 +02:00
Karsa
eb93f112bd feat(icons): also replace element on changes to other properties, do not use icon from changes, but from current state (#2316) 2024-07-22 09:29:16 +02:00
Benji Grant
54a58881da feat(icons): add letter-text icon (#2252)
* feat(icons): add drop-cap icon

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

* fix(icons): round the top of the `drop-cap` icon

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

* fix(icons): Fix `drop-cap` icon

* fix(icons): rename `drop-cap` icon to `letter-text`

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-20 19:52:04 +02:00
Jakob Guddas
568d0b2fa3 feat: added green positive addition to gh-icon route (#2322)
* feat: added green positive addition to gh-icon route

* Update docs/.vitepress/api/gh-icon/[...data].get.ts
2024-07-20 19:42:52 +02:00
Jakob Guddas
2d1be858c8 fix(icons): removed plug-zap-2 (#2129)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-19 13:00:27 +02:00
Jerome Cabugwason
fa6ddf923f feat(icons): added philippine-peso icon (#2231)
* Added icons/philippine-peso.svg

* Added icons/philippine-peso.json

* Updated icons/philippine-peso.svg

* Updated icons/philippine-peso.svg

* Update philippine-peso.json

added author

* Update philippine-peso.json

reordered author

* Update icons/philippine-peso.svg

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

* Updated icons/philippine-peso.svg

* Updated icons/philippine-peso.json

* Updated icons/philippine-peso.svg

* Updated icons/philippine-peso.svg

* add contributor in `philippine-peso.json`

* Updated icons/philippine-peso.svg

* Update icons/philippine-peso.svg

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

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-07-19 11:06:24 +02:00
Jakob Guddas
658b94e65a fix(icons): arcified ribbon icon (#2271)
* Updated icons/ribbon.svg

* Updated icons/ribbon.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-19 11:06:01 +02:00
Jakob Guddas
137ab5c885 refactor(icons): changed calendar-minus icon (#2265)
* Updated icons/calendar-minus.svg

* Updated icons/calendar-minus.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-19 10:52:02 +02:00
Karsa
83284d842a feat(icons): clarification on naming overlapping elements (#2304) 2024-07-19 10:42:49 +02:00
Karsa
8993b0b174 feat(icons): add rounding to eye icons (#2317)
* feat(icons): add rounding to eye icons

* Update icons/eye-off.svg

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

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-07-19 10:40:42 +02:00
Jakob Guddas
1b2b66f1f3 refactor(icons): changed image-plus icon (#2321)
* Updated icons/image-plus.svg

* Updated icons/image-plus.json

* Updated icons/image-plus.json
2024-07-19 10:38:27 +02:00
Jakob Guddas
0186afc0e6 fix(icons): changed drafting-compass icon (#2266)
* Updated icons/drafting-compass.svg

* Updated icons/drafting-compass.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-12 09:04:40 +02:00
Karsa
36c68bd901 feat(icons): added monitor-cog icon (#2310)
* [github] Added issue template forms

* [github] yaml => yml

* Syntax fixes

* Further syntax fixes

* Sort issue templates

* Update 02_bug_report.yml

* Added icons/monitor-cog.svg

* Added icons/monitor-cog.json

---------

Co-authored-by: Karsa <karsa@karsa.org>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-12 09:04:27 +02:00
Jakob Guddas
e8abed3fa7 Updated icons/church.svg (#2273)
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-09 21:31:58 +02:00
Naiyer Asif
b4af645560 docs(contrib): add guide to design icons with Affinity Designer (#2262)
* docs(contrib): add guide to design icons with Affinity Designer

* feat(contrib): add Affinity Designer guide to contribution guidelines
2024-07-09 21:25:16 +02:00
Eric Fennis
8f65b7e6f4 build: Update deps lucide-svelte and lucide-static 2024-07-09 21:23:43 +02:00
Jakob Guddas
3c3e3508ec fix(icons): arcified delete icon (#2279)
* Updated icons/delete.svg

* Updated icons/delete.svg

* Updated icons/delete.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-09 20:40:08 +02:00
Karsa
01e5fd74e6 feat(icons): added type-outline icon (#2206)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-07-09 20:02:31 +02:00
Karsa
7c62c7c662 feat(icons): added clock/calendar-arrow-up/down icons (#2307)
* feat(icons): added clock/calendar-arrow-up/down icons

* feat(icons): add some extra tags to sort icons
2024-07-09 15:50:42 +02:00
Karsa
e92d5e2d40 feat(icons): added user-pen and user-round-pen (#2303) 2024-07-09 14:48:03 +02:00
Janghyeon
3975020fd2 fix: Correct GitHub link in the footer (#2306) 2024-07-09 14:45:40 +02:00
Jakob Guddas
43dfe362b6 feat(icons): added folder-code icon (#2276)
* Added icons/folder-code.svg

* Added icons/folder-code.json
2024-07-09 10:05:31 +02:00
David Boclé
58524b25ee fix(site): Fix svelte code examples (#2298) 2024-07-08 15:54:25 +02:00
Guan-Bo Yang
34805df73f feat(icons): added list-check icon (#2291)
* Added icons/list-check.svg

* Added icons/list-check.json

* Update icons/list-check.json

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

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-08 15:52:37 +02:00
Virt
7cb867782d feat(icons): add wifi strength icons (#2157) 2024-07-08 09:35:26 +02:00
Vexkiddy
63deb3e4f9 feat(icons): added scan-qr-code icon (#2247)
* Created 'scan-qrcode'

* Rename scan-qrcode to scan-qrcode.svg

* added scan-qrcode.json

* Update icons/scan-qrcode.svg

* Rename scan-qrcode.json to scan-qr-code.json

* Rename scan-qrcode.svg to scan-qr-code.svg

* Update icons/scan-qr-code.json

* Update icons/scan-qr-code.json

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

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-07 22:12:54 +02:00
Jakob Guddas
4dcc340301 fix(icons): arcified octagon-* icons (#2280)
* Updated icons/octagon.svg

* Updated icons/octagon.json

* Updated icons/octagon-alert.svg

* Updated icons/octagon-alert.json

* Updated icons/octagon-pause.svg

* Updated icons/octagon-x.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-07 22:00:03 +02:00
Jakob Guddas
8bd401fa8c fix(icons): arcified book-* icons (#2274)
* Updated icons/book.svg

* Updated icons/book-a.svg

* Updated icons/book-audio.svg

* Updated icons/book-check.svg

* Updated icons/book-copy.svg

* Updated icons/book-marked.svg

* Updated icons/book-text.svg

* Updated icons/book-type.svg

* Updated icons/book-headphones.svg

* Updated icons/book-heart.svg

* Updated icons/book-dashed.svg

* Updated icons/book-dashed.json

* Updated icons/book-down.svg

* Updated icons/book-image.svg

* Updated icons/book-image.json

* Updated icons/book-key.svg

* Updated icons/book-lock.svg

* Updated icons/book-minus.svg

* Updated icons/book-plus.svg

* Updated icons/book-up.svg

* Added icons/book-up-double-arrow.svg

* Added icons/book-up-double-arrow.json

* Delete icons/book-up-double-arrow.json

* Delete icons/book-up-double-arrow.svg

* Update book-up-2.svg

* Updated icons/book-user.svg

* Updated icons/book-x.svg

* Updated icons/book-copy.svg

* Updated icons/book-copy.json

* Update book-dashed.json

* Updated icons/book-copy.svg

* Updated icons/book-copy.json

* Updated icons/key-square.svg

* Updated icons/key-square.json

* Updated icons/key-square.svg

* Updated icons/key-square.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-07 21:59:44 +02:00
Jakob Guddas
338fc70f6d fix(icons): fixed *-power icons (#2285)
* Updated icons/square-power.svg

* Updated icons/square-power.json

* Updated icons/circle-power.svg

* Updated icons/circle-power.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-07 21:58:15 +02:00
Jakob Guddas
7ca1fabc12 fix(icons): changed key-round icon (#2278)
* Updated icons/key-round.svg

* Updated icons/key-round.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-07 21:57:17 +02:00
Eric Fennis
0d2c6c457e refactor(scripts): Fix linting errors 2024-07-07 21:32:32 +02:00
Karsa
2539470978 chore(icons): improve pixel perfection and curvature of signature (#2293)
* chore(icons): improve pixel perfection and curvature of signature

* chore(icons): restore original curve so that the icon remains less altered
2024-07-07 21:24:50 +02:00
Karsa
12b412aa87 fix(tools): rename shuffle => shuffleArray (#2284) 2024-07-03 22:52:32 +02:00
Jakob Guddas
c8b00be37e feat(icons): added printer-check icon (#2258)
* Added icons/printer-check.svg

* Added icons/printer-check.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-07-01 21:55:47 +02:00
Eric Fennis
291b11fbd1 ci(linter): Fix path default attrs 2024-07-01 21:51:48 +02:00
Eric Fennis
4635141dfa chore: Update lockfile 2024-07-01 21:33:32 +02:00
Eric Fennis
c761ec7b5e ci(pull-request): Fix workflows attempt #7 2024-07-01 21:28:11 +02:00
Eric Fennis
bbd877a3ba ci(pull-request): Fix workflows attempt #6 2024-07-01 18:04:31 +02:00
Eric Fennis
e830fb16e0 ci(pull-request): Fix workflows attempt #5 2024-07-01 17:33:21 +02:00
Eric Fennis
7625cab264 ci(pull-request): Fix workflows attempt #4 2024-07-01 17:30:08 +02:00
Eric Fennis
7726b7e7ff ci(pull-request): Fix workflows attempt #3 2024-07-01 17:23:47 +02:00
Eric Fennis
bca0eeaf09 ci(pull-request): Fix workflows attempt #2 2024-07-01 17:20:58 +02:00
Eric Fennis
8125a21a7e ci(pull-request): Fix GH workflow 2024-07-01 17:15:54 +02:00
Eric Fennis
077242cfa0 refactor(scripts): Cleaning up scripts (#2092)
* cleanup scripts

* Move helpers to package

* Fixes scripts

* Fix scripts

* Formatting

* Fix helpers import paths

* Remove lucide-figma

* Rename helpers package

* Fix build

* formatting

* Adjust main build-icons file

* Add export casing

* Adds `exportModuleNameCasing` fro lab project

* format files

* Bump package version @lucide/build-icons

* Revert changes in icons

* Revert changes in PR yml

* Fix lint issues

* Fix site build

* fix lint errors

* Attempt fix linting

* Fix lint errors
2024-06-28 11:24:37 +02:00
Eric Fennis
ce79418c66 fix lab code examples (#2263) 2024-06-28 10:25:27 +02:00
Andreas Sas
80350b2cb1 feat(icons): added logs icon (#2257)
* Added icons/logs.svg

* Added icons/logs.json
2024-06-28 10:23:27 +02:00
Jakob Guddas
172f397019 fix(icons): optimized cloud-moon-rain icon (#2250)
* Updated icons/cloud-moon-rain.svg

* Updated icons/cloud-moon-rain.svg
2024-06-28 10:11:28 +02:00
Andreas Sas
a463d8a5c7 feat(icons): added save-off icon (#2260)
* Added icons/save-off.svg

* Added icons/save-off.json
2024-06-28 08:53:58 +02:00
Andreas Sas
fbd5225aad feat(icons): added signature icon (#2248)
* Added icons/signature.svg

* Added icons/signature.json

* Update icons/signature.json

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

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-26 10:31:44 +02:00
Eric Fennis
acd4a879f2 Add support for react 19 (#2254) 2024-06-26 09:19:41 +02:00
Eric Fennis
e11fa135a0 docs(icons): External Lucide icons like from lab on lucide.dev (#2194)
* Add section title

* Add external libs list in sidebar

* Make external lib work

* Adds external lib to detail view

* fix lint issues

* Update to https
2024-06-25 09:56:55 +02:00
Jakob Guddas
f980863f6c fix(icons): changed cloud-moon icon (#2251)
* Updated icons/cloud-moon.svg

* Updated icons/cloud-moon.svg
2024-06-25 09:52:32 +02:00
Jakob Guddas
07230a442f fix: changed home category icon from home to house (#2243) 2024-06-22 22:19:55 +02:00
Jakob Guddas
a34919f0af fix: fixed check uniqueness of aliases action (#2242) 2024-06-22 22:19:43 +02:00
Jakob Guddas
f4d451de80 fix(icons): redesigned house icon (#2116)
* Updated icons/home.svg

* Updated icons/home.json

* Updated icons/home.svg

* Updated icons/home.svg

* Updated icons/home.json

* Updated icons/home.svg

* Updated icons/home.json

* Updated icons/home.json

* fix(icons): renamed home to house

* feat(icons): update tags

---------

Co-authored-by: Karsa <contact@karsa.org>
2024-06-21 12:52:28 +02:00
Jakob Guddas
1e887bc30f feat(icons): added house-plug icon (#2123)
* Added icons/home-plug.svg

* Added icons/home-plug.json

* Update icons/home-plug.json

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

* Updated icons/home-plug.json

* fix(icons): renamed home-plug to house-plug

* fix(icons): remove alias

* feat(icons): update tags

---------

Co-authored-by: Karsa <contact@karsa.org>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-21 12:51:55 +02:00
Karsa
1442b9a35b feat(icons): added house-plus icon (#2221)
* feat(icons): add house-plus icon

* feat(icons): update categories

* feat(icons): add jguddas to house-plus as co-author
2024-06-21 12:50:20 +02:00
Jakob Guddas
41fd856578 feat(ci): check uniqueness of aliases (#2223) 2024-06-21 12:30:05 +02:00
Eric Fennis
621b60b19d fix(site): Aliases redirect (#2235)
* fix: Aliases redirect

* Fix lint errors

* Apply feedback
2024-06-20 16:13:38 +02:00
Karsa
b77e372f3e feat(icons): add additional rounding to sofa and armchair icons (#2228) 2024-06-20 09:51:49 +02:00
Karsa
d4891a7307 feat(docs): added accessibility guide (#2122)
* feat(docs): added a11y guide

* feat(docs): add further resources

* feat(docs): add more resources & note on aria label usage

* feat(docs): update illustration button labels

* feat(docs): fix misaligned overlay in icon button alttext illustration

* fix(docs): deprecate the use of aria label on illustrations and elaborate on not using it.

* feat(docs/a11y): added code examples & rephrased aria-label resource

* feat(docs/a11y): fix typos

* Update docs/guide/advanced/accessibility.md

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

* Apply suggestions from code review

Reformat headers, add RadixUI example.

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

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-06-17 16:12:24 +02:00
Jakob Guddas
199987276b feat(icons): redesigned mic-vocal icon (#2198)
* Updated icons/mic-vocal.svg

* Updated icons/mic-vocal.json
2024-06-14 12:48:41 +02:00
Jakob Guddas
5647b34594 feat: narrowed type for categories in icon.schema.json (#2126) 2024-06-14 12:47:46 +02:00
Jakob Guddas
439e463430 fix(icons): arcified guitar icon (#2133)
* Updated icons/guitar.svg

* Updated icons/guitar.json

* Updated icons/guitar.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-14 12:24:51 +02:00
Jakob Guddas
22921304a7 Updated icons/pin-off.svg (#2211) 2024-06-14 12:16:06 +02:00
Jakob Guddas
220abb1510 Updated icons/pin.svg (#2210) 2024-06-14 12:15:29 +02:00
Jakob Guddas
91ce9221e8 fix(icons): rebuild quote icon (#2212)
* Updated icons/quote.svg

* Updated icons/quote.json

* Updated icons/quote.svg

* Update icons/quote.svg

* Updated icons/quote.json
2024-06-14 12:12:17 +02:00
Garrett Pauls
904d74fe4a fix(lucide-svelte): update IconProps to include all properties of Icon component (#2182)
* fix(lucide-svelte): update IconProps to include all properties of Icon component

* fix(lucide-svelte): removed custom Icon type that conflicted with Icon component type

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-12 10:49:21 +02:00
Jakob Guddas
f507644488 fix(icons): added round corner to file-archive icon (#2132)
* Updated icons/file-archive.svg

* Updated icons/file-archive.json
2024-06-10 16:25:08 +02:00
Karsa
501b65a7a1 fix(icons): remove edit-2 alias from pen-off (#2209)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-10 16:14:36 +02:00
Jakob Guddas
14862fb0dc fix(icons): changed file-cog icon to match other -cog icons (#2184)
* Updated icons/file-cog.svg

* Updated icons/file-cog.json
2024-06-10 16:07:33 +02:00
Karsa
2963369c8d feat(icons): add pen-off pencil-off, update pen icons w/ rounding (#2186) 2024-06-10 16:04:12 +02:00
Karsa
1e20d5087a fix(icons): fixes/removes zero long path segments (#2205)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-10 13:16:03 +02:00
Karsa
4b312b369f fix(scripts): fixes writeIconRelatedIcons.mjs (#2190)
* fix(scripts): fixes writeIconRelatedIcons.mjs

* fix(scripts): fixes linting

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-07 10:10:17 +02:00
Karsa
afbef743de fix(site): fixes open collective logo in light mode (#2189)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-06 19:54:50 +02:00
Alexandre Philibert
864fdeca84 feat(icons): added calendar-cog icon (#2176)
* feat(icons): added calendar-cog icon

* feat(icons): cleanup calendar-cog icon

* feat(icons): fix indentation of calendar-cog icon

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-06 16:27:01 +02:00
Karsa
541add925c fix(icons): fixes duplicate tv-2 alias (#2188)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-06 16:26:09 +02:00
Karsa
2e7df30267 fix(icons): fix mismatched lines in dna & dna-off (#2187)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-06 15:08:32 +02:00
Viktor
0a578c8803 meta(icons): Added "liquid" tag to Droplet icon (#2152)
Co-authored-by: Karsa <contact@karsa.org>
2024-06-06 13:17:22 +02:00
Karsa
b227caee98 feat(icons): added tv-minimal-play (#2128)
* feat(icons): add tv-minimal-play icon, rename tv-2 to tv-minimal

* feat(icons/tv-minimal-play): add more tags

* feat(icons): add deprecation reason to tv-2 alias

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-06-06 13:16:25 +02:00
Jakob Guddas
72b74fbdb4 fix(icons): added round corners to signpost icon (#2002)
* Updated icons/signpost.svg

* Updated icons/signpost.svg

* Updated icons/signpost.json
2024-06-06 11:08:10 +02:00
Jakob Guddas
01d36ad363 fix(icons): added rounding to sigma icon (#2149)
* Updated icons/sigma.svg

* Update icons/sigma.svg

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

---------

Co-authored-by: Karsa <contact@karsa.org>
2024-06-06 11:06:56 +02:00
Karsa
548cb9cdf5 feat(icons): added biceps-flexed icon (#2127) 2024-06-06 11:06:19 +02:00
Jakob Guddas
79430da42e fix(icons): arcified tractor icon (#2112)
* Updated icons/tractor.svg

* Updated icons/tractor.json

* Updated icons/tractor.svg

* Updated icons/tractor.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-06 11:02:31 +02:00
Karsa
0620843f4c fix(icons): added rounding to paintbrush (#2147)
* fix(icons): arcified paintbrush

* Update icons/paintbrush.svg

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

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-06-06 10:59:42 +02:00
Quill Zhou
34d063302a Add copy component name (#2169) 2024-06-05 23:22:19 +02:00
Jakub Różbicki
0abc3389db Update circle-slash.svg (#2183)
Having <line> after <circle> allows to set `fill` as a background and line would still be visible
2024-06-05 21:43:33 +02:00
Jakob Guddas
ebb8ec66af fix(icons): added rounding radical icon (#2150)
* Updated icons/radical.svg

* Updated icons/radical.svg

* Updated icons/radical.json
2024-06-02 12:05:05 +02:00
Jakob Guddas
f55ced97a5 fix(icons): added rounding to compass icon (#2143)
* Updated icons/compass.svg

* Updated icons/compass.json
2024-06-02 10:41:30 +02:00
Karsa
8458345535 feat(icons): added pill-bottle icon (#2174)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-06-02 10:39:11 +02:00
Karsa
66d6c2fe4b feat(icons): added lectern icon (#2171)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-30 12:56:40 +02:00
Karsa
053808685c feat(icons): added section icon (#2172)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-30 12:03:14 +02:00
Sayakie
4f2a6b70d8 fix license typos (#2161) 2024-05-24 12:06:03 +02:00
Karsa
d8004e471a feat(angular): add support for ng 18 (#2167)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-24 12:04:15 +02:00
Karsa
e2b46eac8e feat(icons): add deprecationReason and alias deprecation feature (#1960)
* feat(icons): add deprecationReason and alias deprecation feature

* chore(tools): run prettier. again.

* fix(scripts): overall alias as object support

* fix(icon.schema.json): add dependentRequired on deprecated properties

* fix(icon.schema.json): remove unicode for now

* fix(icon.schema.json): use const true for deprecated

* fix(build): convert deprecation reason to enum

* fix(build): fix linting of icon.schema.json

* fix(build): renamed gracePeriod => toBeRemovedInVersion

* fix(build): fix aliases map in related icons generation

* fix(build): deprecate aliases using numbers

* feat(icon-schema): separate deprecation reason enumerations, extract removal notice

* fix(icon-schema): fix linting

* Update tools/build-icons/utils/deprecationReasonTemplate.mjs

* fix(icons): add deprecation reason to some more icons

* fix(docs): fix linting issue

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-05-22 13:08:34 +02:00
Karsa
1b3173b17b fix(icons): arcified and renamed paintbrush-2 (#2146)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-21 15:34:42 +02:00
Eric Fennis
d5f4275055 fix(lucide-svelte): Remove export mergeClasses in svelte Icon (#2119)
* Remove export svelte icon

* formatting
2024-05-21 15:31:05 +02:00
Jakob Guddas
6abae7cc14 fix(icons): arcified key icon (#2067)
* Updated icons/key.svg

* Updated icons/key.json

* Update icons/key.svg

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

* Add space before close key.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-05-21 15:29:20 +02:00
Eric Fennis
f32ffcd2a2 fix(docs): Fix data api 2024-05-14 23:31:11 +02:00
Karsa
824bb897cf feat(figma): add data API endpoint for new plugin (#2018)
* feat(figma): add data API endpoint with every metadata needed by new Figma plugin

* chore(docs/api): extract data as static const

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-14 22:44:52 +02:00
Jakob Guddas
2843a76e28 docs(site): changed my name in the team section (#2142) 2024-05-13 08:23:53 +02:00
Jakob Guddas
155ff3319a fix: resolved broken icons as code details section issue (#2144) 2024-05-13 08:23:23 +02:00
Karsa
34dddb811b fix(icons): fix incorrect category name for diamond-plus/minus (#2125)
Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-03 17:15:48 +02:00
Daniel Bayley
5fead67bf3 Sort out loader/cursor icons (#1331)
* Add `loader-pinwheel` icon

* Optimise `loader` icon

* Improve `loader` metadata

* Add `loader-circle-big` variant

* Rename `loader-2` to `loader-circle`

* Improve `more-horizontal` metadata

* Add `mouse-pointer-ban` icon

* Improve `mouse-pointer` icons metadata

* Improve metadata

* Revert rename of `loader-2` to `loader-circle`

* Revert "Improve `more-horizontal` metadata"

This reverts commit 41fa676b15.

* Formatting

* Format pinwheel and remove loader-circle-big

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-05-03 10:31:21 +02:00
Karsa
48dc9372db fix(icons): add more Lucide-ish rounding to sparkle icons (#1937)
* fix(icons): add more Lucide-ish rounding to sparkle icons

* chore(icons): sharpen points ever so slightly for better visual weight

* chore(icons): linting fix

* chore(icons): update sparkles & moon-star icon as per Discord

---------

Co-authored-by: Karsa <karsa@sztaki.hu>
2024-05-03 10:27:46 +02:00
Karsa
747446fc76 fix(docs): fix uppercase import in lucide-static docs (#2118) 2024-05-03 08:34:04 +02:00
Jakob Guddas
5862ea735e fix(icons): arcified award icon (#2113)
* Updated icons/award.svg

* Update icons/award.svg

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

---------

Co-authored-by: Karsa <contact@karsa.org>
2024-05-02 11:44:15 +02:00
Rob van Bakel
3a8a349771 fix: Prevent internal router from handling external links (#2107) 2024-04-28 11:22:07 +02:00
Eric Fennis
70bc2245c7 fix(lucide-svelte): Revert shared package for lucide-svelte (#2109)
* fix(lucide-svelte): Revert shared package for `lucide-svelte`

* Update lockfile
2024-04-28 11:05:58 +02:00
Eric Fennis
89f6b6357d fix: Revert moving createIcons to separate file 2024-04-26 19:39:48 +02:00
Jakob Guddas
354af456d3 fix(icons): added rounding to alarm-smoke icon (#2059)
* Updated icons/alarm-smoke.svg

* Updated icons/alarm-smoke.svg

* Updated icons/alarm-smoke.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-04-26 18:45:50 +02:00
Eric Fennis
e50582e93e feat(icon-component): Creating icons with iconNodes (#1997)
* Add useIconComponent, lucide-react

* Add concept useIconComponent

* add useIconComponents to packages

* Add icon component

* Add icon component

* Add tests for react packages

* Reset changes in icons

* Add types

* Add support for Icon components in Lucide Vue Next

* update tests

* Update tests

* Enable Svelte component

* Fix lucide-react-native tests

* Update Solid package

* update snapshots

* Add docs

* add docs

* Update tests

* Formatting

* Formatting

* Update package lock

* Remove `useIconComponent`

* Update guides

* Update exports preact and solid package

* Formatting

* Format createIcons.ts

* Add lucide lab repo link in docs
2024-04-26 17:59:04 +02:00
Eric Fennis
65deefa53c ci: Revert pnpm in pull-request.yml 2024-04-26 16:25:44 +02:00
Kyle Angelo Galendez
54ef137b49 feat(icons): added grid-2x2-x icon (#2085)
* Added icons/grid-2x2-x.svg

* Added icons/grid-2x2-x.json

* Archify grid-2x2-x.svg
2024-04-26 15:41:08 +02:00
Kyle Angelo Galendez
d4df542117 feat(icons): added grid-2x2-check icon (#2084)
* Added icons/grid-2x2-check.svg

* Added icons/grid-2x2-check.json

* Updated icons/grid-2x2-check.json

* Arcify grid-2x2-check.svg

* Unarcify the check
2024-04-26 15:40:50 +02:00
Jakob Guddas
8c1e56a7bf fix(icons): arcify activity icon (#2058)
* Updated icons/activity.svg

* Updated icons/activity.svg

* Updated icons/activity.json

* Updated icons/activity.svg

* Updated icons/activity.svg

* Update icons/activity.svg

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

---------

Co-authored-by: Karsa <contact@karsa.org>
2024-04-26 10:59:23 +02:00
Jakob Guddas
dff2172173 Updated icons/printer.svg (#2066) 2024-04-26 10:42:33 +02:00
Kyle Angelo Galendez
e8ccd3df7e Add more OS (#2101)
This includes ChromeOS, iOS, and Android to ensure the report is concise as possible.
2024-04-26 10:40:29 +02:00
Kyle Angelo Galendez
b593355537 Add more OS (#2100)
This includes ChromeOS, iOS, and Android to ensure the report is concise as possible.
2024-04-26 10:40:08 +02:00
Eric Fennis
09420cbca5 docs: Fix dark logo paths 2024-04-25 09:45:07 +02:00
Eric Fennis
45e82a51b8 docs: Update readme files (#2102)
* Update lucide readme

* Add Readme and update package.jsons

* Update readme

* Update package logos

* Update darkmode logos

* Update title build font readme
2024-04-24 17:43:51 +02:00
Jakob Guddas
305e282e19 fix(icons): changed search-code icon (#1953)
* Updated icons/search-code.svg

* Updated icons/search-code.json

* fix: magic apply changes

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-04-24 09:09:33 +02:00
Eric Fennis
ad7ae84987 Split up workflows (#2093) 2024-04-24 09:08:01 +02:00
Jakob Guddas
df100bde73 fix(icons): changed save-all icon (#2065)
* Updated icons/save-all.svg

* Updated icons/save-all.json

* Updated icons/save-all.svg

* Updated icons/save-all.json
2024-04-24 09:00:01 +02:00
Jakob Guddas
0724851934 Updated icons/bold.svg (#2060) 2024-04-23 19:56:04 +02:00
Riley
34cf88d209 feat(icons): add origami (#2035)
* Add origami

* Reformat

* Change rounding on wing, add right fold

* Fix head outlining

* Merge paths

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

* Add rounding to neck peak

---------

Co-authored-by: Karsa <contact@karsa.org>
2024-04-19 10:49:38 +02:00
Jakob Guddas
6322d1df66 fix(icons): changed save icon (#2064)
* Updated icons/save.svg

* Update icons/save.svg

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

* Add whitespace before closing tag

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-04-19 10:48:35 +02:00
Riley
8a414b3249 fix(icons): Add axis tag to scale-3d (#2033)
* Add axis tag to scale-3d

* Update scale-3d.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-04-19 10:30:36 +02:00
Kyle Angelo Galendez
58f614acca feat(icons): add diamond-minus (#2073)
* Add diamond-minus icon

* Add json file
2024-04-18 09:25:51 +02:00
Kyle Angelo Galendez
d598ad7190 feat(icons): add diamond-plus (#2074)
* Add diamond-plus icon

* Add json file
2024-04-18 09:25:20 +02:00
Jakob Guddas
439ee3f707 chore: always fold Icon as code preview comment (#2062) 2024-04-18 09:21:10 +02:00
Jakob Guddas
c2c85fbd5c fix(icons): changed monitor-play icon (#2063)
* Updated icons/monitor-play.svg

* Update icons/monitor-play.svg

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

---------

Co-authored-by: Karsa <contact@karsa.org>
2024-04-17 16:42:55 +02:00
Taichi Maeda
59aa7bc824 Add bot-off icon (#2079)
* Add bot-off icon

* Fix gap size and corners

Thanks to @karsa-mistmere

* Add @ericfennis as original author
2024-04-17 16:41:23 +02:00
Jakob Guddas
0beb50ebca Updated icons/scroll-text.svg (#2069) 2024-04-17 16:40:27 +02:00
Jakob Guddas
649b440d9d Updated icons/scroll.svg (#2068) 2024-04-17 16:39:52 +02:00
Jakob Guddas
a74e8f3863 Updated icons/feather.svg (#2070) 2024-04-17 16:39:15 +02:00
Jakob Guddas
46318b1605 fix(icons): redesigned dumbbell icon (#2001)
* Updated icons/dumbbell.svg

* Updated icons/dumbbell.json

* Updated icons/dumbbell.svg

* Updated icons/dumbbell.json

* Updated icons/dumbbell.svg
2024-04-12 12:21:52 +02:00
Jakob Guddas
4bf91a3c51 feat(icons): added image-play icon (#2054)
* Added icons/image-play.svg

* Added icons/image-play.json

* Updated icons/image-play.json
2024-04-10 09:26:32 +02:00
Jakob Guddas
3cde4f2a41 fix(icons): changed cable icon (#2026)
* Updated icons/cable.svg

* Update cable.svg

* Update cable.svg

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-04-10 08:36:44 +02:00
Nicolas Diotto
d75c7613b2 feat(icons): add keyboard-off (#1963)
* feat(icons): added keyboard-off

* fix: change name contribuitor

* fix: fix adjust 2px gap of empty space to the right of the line

* fix: fix adjust 2px gap of empty space to the right of the line

* feat: add contribuitor

* fix: update metadata

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Jakob Guddas <github@jguddas.de>
2024-04-09 09:20:49 +02:00
Jakob Guddas
d17e81d712 fix(icons): added rounding to video-off icon (#2051)
* Updated icons/video-off.svg

* Updated icons/video-off.json

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-04-09 09:17:22 +02:00
Jakob Guddas
3b4a19efcf fix(icons): added rounding to video icon (#2050)
* Updated icons/video.svg

* Updated icons/video.svg

* Updated icons/video.json
2024-04-09 09:15:35 +02:00
705 changed files with 8527 additions and 34223 deletions

View File

@@ -1,4 +1,4 @@
const DEFAULT_ATTRS = require('./scripts/render/default-attrs.json'); const DEFAULT_ATTRS = require('./tools/build-icons/render/default-attrs.json');
module.exports = { module.exports = {
root: true, root: true,
@@ -15,7 +15,9 @@ module.exports = {
'no-use-before-define': 'off', 'no-use-before-define': 'off',
'import/no-extraneous-dependencies': [ 'import/no-extraneous-dependencies': [
'error', 'error',
{ devDependencies: ['**/*.test.js', '**/*.spec.js', './scripts/**'] }, {
devDependencies: ['**/*.test.js', '**/*.spec.js', '**/scripts/**'],
},
], ],
'import/extensions': [ 'import/extensions': [
'error', 'error',

View File

@@ -69,6 +69,9 @@ body:
- label: Windows - label: Windows
- label: Linux - label: Linux
- label: macOS - label: macOS
- label: ChromeOS
- label: iOS
- label: Android
- label: Other/not relevant - label: Other/not relevant
- type: textarea - type: textarea
id: description id: description

View File

@@ -30,6 +30,9 @@ body:
- label: Windows - label: Windows
- label: Linux - label: Linux
- label: macOS - label: macOS
- label: ChromeOS
- label: iOS
- label: Android
- label: Other/not relevant - label: Other/not relevant
- type: textarea - type: textarea
id: description id: description

View File

@@ -8,7 +8,7 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide-angular: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -26,5 +26,20 @@ jobs:
- name: Build - name: Build
run: pnpm --filter lucide-angular build run: pnpm --filter lucide-angular build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test - name: Test
run: pnpm --filter lucide-angular test run: pnpm --filter lucide-angular test

View File

@@ -24,8 +24,5 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Build
run: pnpm --filter lucide-preact build
- name: Test - name: Test
run: pnpm --filter lucide-preact test run: pnpm --filter lucide-preact test

View File

@@ -24,8 +24,5 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Build
run: pnpm --filter lucide-react-native build
- name: Test - name: Test
run: pnpm --filter lucide-react-native test run: pnpm --filter lucide-react-native test

View File

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

View File

@@ -9,7 +9,7 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide-solid: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -27,5 +27,20 @@ jobs:
- name: Build - name: Build
run: pnpm --filter lucide-solid build run: pnpm --filter lucide-solid build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test - name: Test
run: pnpm --filter lucide-solid test run: pnpm --filter lucide-solid test

View File

@@ -9,7 +9,7 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide-svelte: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -27,5 +27,20 @@ jobs:
- name: Build - name: Build
run: pnpm --filter lucide-svelte build run: pnpm --filter lucide-svelte build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test - name: Test
run: pnpm --filter lucide-svelte test run: pnpm --filter lucide-svelte test

View File

@@ -9,7 +9,7 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide-vue-next: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -27,5 +27,20 @@ jobs:
- name: Build - name: Build
run: pnpm --filter lucide-vue-next build run: pnpm --filter lucide-vue-next build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test - name: Test
run: pnpm --filter lucide-vue-next test run: pnpm --filter lucide-vue-next test

View File

@@ -9,7 +9,7 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide-vue: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -27,5 +27,20 @@ jobs:
- name: Build - name: Build
run: pnpm --filter lucide-vue build run: pnpm --filter lucide-vue build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test - name: Test
run: pnpm --filter lucide-vue test run: pnpm --filter lucide-vue test

View File

@@ -9,7 +9,7 @@ on:
- pnpm-lock.yaml - pnpm-lock.yaml
jobs: jobs:
lucide: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -27,5 +27,20 @@ jobs:
- name: Build - name: Build
run: pnpm --filter lucide build run: pnpm --filter lucide build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- uses: actions/setup-node@v3.8.1
with:
node-version: 18
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test - name: Test
run: pnpm --filter lucide test run: pnpm --filter lucide test

View File

@@ -0,0 +1,16 @@
name: Validate PR title
on:
pull_request:
types:
- opened
- edited
- synchronize
jobs:
semantic-pull-request:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -3,7 +3,7 @@ name: Add Changed Icons comment
on: on:
pull_request_target: pull_request_target:
paths: paths:
- 'icons/*.svg' - 'icons/*'
branches: branches:
- main - main
- fix-icon-preview - fix-icon-preview
@@ -68,6 +68,16 @@ jobs:
# input: +++ b/icons/accessibility.json%0A@@ -2,0 +3 @@%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A # input: +++ b/icons/accessibility.json%0A@@ -2,0 +3 @@%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
# output: ::$ANNOTATION_SEVERITY file=icons/accessibility.json,line=2,endLine=3,title=$ANNOTATION_TITLE::$ANNOTATION_DESCRIPTION%0A%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A # output: ::$ANNOTATION_SEVERITY file=icons/accessibility.json,line=2,endLine=3,title=$ANNOTATION_TITLE::$ANNOTATION_DESCRIPTION%0A%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
lint-aliases:
name: Check Uniqueness of Aliases
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Check Uniqueness of Aliases
run: "! cat <(printf \"%s\\n\" icons/*.json | while read -r name; do basename \"$name\" .json; done) <(jq -cr 'select(.aliases) | .aliases[] | if type==\"string\" then . else .name end' icons/*.json) | sort | uniq -c | grep -ve '^\\s*1 '"
generate-changed-icons-comment: generate-changed-icons-comment:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:

1
.gitignore vendored
View File

@@ -34,6 +34,7 @@ docs/.vitepress/data/iconNodes
docs/.vitepress/data/iconMetaData.ts docs/.vitepress/data/iconMetaData.ts
docs/.vitepress/data/releaseMetaData.json docs/.vitepress/data/releaseMetaData.json
docs/.vitepress/data/releaseMetaData docs/.vitepress/data/releaseMetaData
docs/.vitepress/data/categoriesData.json
docs/.vitepress/data/iconDetails docs/.vitepress/data/iconDetails
docs/.vitepress/data/relatedIcons.json docs/.vitepress/data/relatedIcons.json
docs/.vercel docs/.vercel

View File

@@ -2,6 +2,10 @@ pnpm-lock.yaml
# docs examples # docs examples
docs/**/examples/ docs/**/examples/
docs/.vitepress/.temp
docs/.vitepress/cache
docs/.vitepress/data
docs/.nitro
# lucide-angular # lucide-angular
packages/lucide-angular/.angular/cache packages/lucide-angular/.angular/cache

View File

@@ -39,6 +39,8 @@ You can also [download an Adobe Illustrator template](https://github.com/lucide-
#### [Figma Guide](https://lucide.dev/docs/figma-guide) #### [Figma Guide](https://lucide.dev/docs/figma-guide)
#### [Affinity Designer Guide](https://lucide.dev/guide/design/affinity-designer-guide)
### Submitting Multiple Icons ### 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.

View File

@@ -1,4 +1,11 @@
<p align=center><img width="480" src="https://lucide.dev/lucide-logo-repo.svg" alt="Lucide Logo"></p> <p align="center">
<a href="https://github.com/lucide-icons/lucide#gh-light-mode-only">
<img src="https://lucide.dev/lucide-logo-repo.svg#gh-light-mode-only" alt="Lucide - Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons." width="480">
</a>
<a href="https://github.com/lucide-icons/lucide#gh-dark-mode-only">
<img src="https://lucide.dev/lucide-logo-repo-dark.svg#gh-dark-mode-only" alt="Lucide - Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons." width="480">
</a>
</p>
<p align="center"> <p align="center">
<a href="https://github.com/lucide-icons/lucide/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/lucide" alt="license"></a> <a href="https://github.com/lucide-icons/lucide/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/lucide" alt="license"></a>
<a href="https://www.npmjs.com/package/lucide"><img src="https://img.shields.io/npm/v/lucide" alt="npm package"></a> <a href="https://www.npmjs.com/package/lucide"><img src="https://img.shields.io/npm/v/lucide" alt="npm package"></a>
@@ -274,9 +281,12 @@ 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="docs/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> <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>
### Awesome backer 🍺
<a href="https://www.scipress.io?utm_source=lucide"><img src="docs/public/sponsors/scipress.svg" width="180" alt="Scipress sponsor badge" /></a>

View File

@@ -1,5 +1,5 @@
{ {
"$schema": "../category.schema.json", "$schema": "../category.schema.json",
"title": "Home", "title": "Home",
"icon": "home" "icon": "house"
} }

28
commitlint.config.ts Normal file
View File

@@ -0,0 +1,28 @@
import type { UserConfig } from '@commitlint/types';
import fs from 'fs/promises'
import path from 'path'
// Read directory
const getAllPackageFromDirectory = async (directory: string) => {
return fs.readdir(path.resolve(process.cwd(), directory))
}
const Configuration: UserConfig = {
extends: ['@commitlint/config-conventional'],
rules: {
'scope-enum': async () => {
const packages = await getAllPackageFromDirectory('packages')
const toolPackages = await getAllPackageFromDirectory('tools')
return [2, 'always', [
'site',
'meta',
...packages,
...toolPackages,
]
]
}
},
};
export default Configuration;

View File

@@ -1,4 +1,3 @@
import { eventHandler, setResponseHeader } from 'h3';
import iconMetaData from '../../data/iconMetaData'; import iconMetaData from '../../data/iconMetaData';
export default eventHandler((event) => { export default eventHandler((event) => {

View File

@@ -0,0 +1,40 @@
import iconNodes from '../../data/iconNodes/index.ts';
import { IconNodeWithKeys } from '../../theme/types';
import iconMetaData from '../../data/iconMetaData';
import releaseMeta from '../../data/releaseMetaData.json';
import categories from '../../data/categoriesData.json';
const dataResponse = {
icons: Object.entries(iconNodes).reduce((acc, [name, iconNode]) => {
const newIconNode = (iconNode as IconNodeWithKeys).map(([name, { key, ...attrs }]) => {
return [name, attrs];
});
acc[name] = {
iconNode: newIconNode,
aliases: (iconMetaData[name]?.aliases ?? []).map((alias) =>
typeof alias === 'string' ? alias : alias.name,
),
tags: iconMetaData[name].tags ?? [],
categories: iconMetaData[name].categories ?? [],
...releaseMeta[name],
};
return acc;
}, {}),
aliases: Object.entries(iconNodes).reduce((acc, [name]) => {
for (const alias of iconMetaData[name]?.aliases ?? []) {
acc[typeof alias === 'string' ? alias : alias.name] = name;
}
return acc;
}, {}),
categories,
};
export default eventHandler((event) => {
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400');
setResponseHeader(event, 'Access-Control-Allow-Origin', '*');
return dataResponse;
});

View File

@@ -13,7 +13,10 @@ export default eventHandler((event) => {
const data = pathData.at(-1).slice(0, -4); const data = pathData.at(-1).slice(0, -4);
const [name] = pathData; const [name] = pathData;
const src = Buffer.from(data, 'base64').toString('utf8'); const src = Buffer.from(data, 'base64')
.toString('utf8')
.replaceAll('\n', '')
.replace(/<svg[^>]*>|<\/svg>/g, '');
const children = []; const children = [];
@@ -30,7 +33,7 @@ export default eventHandler((event) => {
const LucideIcon = createLucideIcon(backdropName, iconNode); const LucideIcon = createLucideIcon(backdropName, iconNode);
const svg = renderToStaticMarkup(createElement(LucideIcon)); const svg = renderToStaticMarkup(createElement(LucideIcon));
const backdropString = svg.replace(/<svg[^>]*>|<\/svg>/g, ''); const backdropString = svg.replaceAll('\n', '').replace(/<svg[^>]*>|<\/svg>/g, '');
children.push( children.push(
createElement(Backdrop, { createElement(Backdrop, {
@@ -39,6 +42,15 @@ export default eventHandler((event) => {
color: name in iconNodes ? 'red' : '#777', color: name in iconNodes ? 'red' : '#777',
}), }),
); );
if (name in iconNodes) {
children.push(
createElement(Backdrop, {
backdropString: src,
src: backdropString,
color: 'lime',
}),
);
}
} }
const svg = Buffer.from( const svg = Buffer.from(

View File

@@ -1,4 +1,3 @@
import { eventHandler, setResponseHeader } from 'h3';
import iconMetaData from '../../data/iconMetaData'; import iconMetaData from '../../data/iconMetaData';
export default eventHandler((event) => { export default eventHandler((event) => {

View File

@@ -28,6 +28,10 @@ export default defineConfig({
new URL('./theme/components/overrides/VPFooter.vue', import.meta.url), new URL('./theme/components/overrides/VPFooter.vue', import.meta.url),
), ),
}, },
{
find: '~/.vitepress',
replacement: fileURLToPath(new URL('./', import.meta.url)),
},
], ],
}, },
}, },

View File

@@ -0,0 +1,186 @@
[
{
"name": "accessibility",
"title": "Accessibility"
},
{
"name": "account",
"title": "Accounts & access"
},
{
"name": "animals",
"title": "Animals"
},
{
"name": "arrows",
"title": "Arrows"
},
{
"name": "brands",
"title": "Brands"
},
{
"name": "buildings",
"title": "Buildings"
},
{
"name": "charts",
"title": "Charts"
},
{
"name": "communication",
"title": "Communication"
},
{
"name": "connectivity",
"title": "Connectivity"
},
{
"name": "currency",
"title": "Currency"
},
{
"name": "cursors",
"title": "Cursors"
},
{
"name": "design",
"title": "Design"
},
{
"name": "development",
"title": "Coding & development"
},
{
"name": "devices",
"title": "Devices"
},
{
"name": "emoji",
"title": "Emoji"
},
{
"name": "files",
"title": "File icons"
},
{
"name": "food-beverage",
"title": "Food & beverage"
},
{
"name": "furniture",
"title": "Furniture"
},
{
"name": "gaming",
"title": "Gaming"
},
{
"name": "home",
"title": "Home"
},
{
"name": "layout",
"title": "Layout"
},
{
"name": "mail",
"title": "Mail"
},
{
"name": "maps",
"title": "Maps"
},
{
"name": "maths",
"title": "Maths"
},
{
"name": "medical",
"title": "Medical"
},
{
"name": "money",
"title": "Money"
},
{
"name": "multimedia",
"title": "Multimedia"
},
{
"name": "nature",
"title": "Nature"
},
{
"name": "navigation",
"title": "Navigation"
},
{
"name": "notifications",
"title": "Notifications"
},
{
"name": "people",
"title": "People"
},
{
"name": "photography",
"title": "Photography"
},
{
"name": "science",
"title": "Science"
},
{
"name": "seasons",
"title": "Seasons"
},
{
"name": "security",
"title": "Security"
},
{
"name": "shapes",
"title": "Shapes"
},
{
"name": "shopping",
"title": "Shopping"
},
{
"name": "social",
"title": "Social"
},
{
"name": "sports",
"title": "Sports"
},
{
"name": "sustainability",
"title": "Sustainability"
},
{
"name": "text",
"title": "Text formatting"
},
{
"name": "time",
"title": "Time & calendar"
},
{
"name": "tools",
"title": "Tools"
},
{
"name": "transportation",
"title": "Transportation"
},
{
"name": "travel",
"title": "Travel"
},
{
"name": "weather",
"title": "Weather"
}
]

View File

@@ -158,16 +158,5 @@
"href": "https://www.npmjs.com/package/lucide-static" "href": "https://www.npmjs.com/package/lucide-static"
} }
] ]
},
"lucide-flutter": {
"order": 9,
"icon": "flutter",
"shields": [
{
"alt": "flutter",
"src": "https://img.shields.io/pub/v/lucide_icons",
"href": "https://img.shields.io/pub/v/lucide_icons"
}
]
} }
} }

View File

@@ -31,8 +31,8 @@
] ]
}, },
{ {
"name": "jguddas", "name": "Jakob Guddas",
"title": "Maintainer of Lucide & Software engineer @lego", "title": "Maintainer of Lucide & Software engineer @LEGO",
"image": "https://github.com/jguddas.png?size=192", "image": "https://github.com/jguddas.png?size=192",
"socialLinks": [ "socialLinks": [
{ {

View File

@@ -7,11 +7,12 @@ interface BackdropProps {
} }
const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.Element => { const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.Element => {
const id = React.useId();
return ( return (
<> <>
<defs xmlns="http://www.w3.org/2000/svg"> <defs xmlns="http://www.w3.org/2000/svg">
<pattern <pattern
id="pattern" id={`pattern-${id}`}
width=".1" width=".1"
height=".1" height=".1"
patternUnits="userSpaceOnUse" patternUnits="userSpaceOnUse"
@@ -30,69 +31,56 @@ const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.El
</pattern> </pattern>
</defs> </defs>
<mask <mask
id="svg-preview-backdrop-mask-outline" id={`svg-preview-backdrop-mask-${id}`}
maskUnits="userSpaceOnUse" maskUnits="userSpaceOnUse"
> >
<g <g
stroke="#fff" stroke="#fff"
dangerouslySetInnerHTML={{ __html: backdropString }} dangerouslySetInnerHTML={{ __html: backdropString }}
/> />
<g <g dangerouslySetInnerHTML={{ __html: src }} />
dangerouslySetInnerHTML={{ __html: src }}
strokeWidth={2.05}
/>
</mask> </mask>
<mask <mask
id="svg-preview-backdrop-mask-fill" id={`svg-preview-backdrop-mask-outline-${id}`}
maskUnits="userSpaceOnUse" maskUnits="userSpaceOnUse"
> >
<g <rect
stroke="#fff" x="0"
dangerouslySetInnerHTML={{ __html: backdropString }} y="0"
/> width="24"
<g height="24"
dangerouslySetInnerHTML={{ __html: src }} fill="#fff"
strokeWidth={2.05} stroke="none"
/> />
<g <g
strokeWidth={1.75} strokeWidth={1.75}
dangerouslySetInnerHTML={{ __html: backdropString }} dangerouslySetInnerHTML={{ __html: backdropString }}
/> />
</mask> </mask>
<g <g mask={`url(#svg-preview-backdrop-mask-${id})`}>
strokeWidth={2.25}
stroke="url(#pattern)"
mask={'url(#svg-preview-backdrop-mask-outline)'}
>
<rect <rect
x="0" x="0"
y="0" y="0"
width="24" width="24"
height="24" height="24"
fill="url(#pattern)"
opacity={0.5} opacity={0.5}
fill={`url(#pattern-${id})`}
stroke="none" stroke="none"
/> />
<g
stroke={color}
strokeWidth={2.25}
opacity={0.75}
dangerouslySetInnerHTML={{ __html: src }}
/>
<g
stroke={color}
strokeWidth={2.25}
opacity={0.75}
mask={`url(#svg-preview-backdrop-mask-outline-${id})`}
dangerouslySetInnerHTML={{ __html: backdropString }}
/>
</g> </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={color}
opacity={0.5}
stroke="none"
mask={'url(#svg-preview-backdrop-mask-fill)'}
/>
</> </>
); );
}; };

View File

@@ -301,7 +301,6 @@ const Handles = ({
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity', 'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
any any
>) => { >) => {
console.log(paths);
return ( return (
<g <g
className="svg-preview-handles-group" className="svg-preview-handles-group"

View File

@@ -10,18 +10,24 @@ type CodeExampleType = {
const getIconCodes = (): CodeExampleType => { const getIconCodes = (): CodeExampleType => {
return [ return [
{ {
language: 'html', language: 'js',
title: 'HTML', title: 'Vanilla',
code: `<i data-lucide="Name"></i>`, code: `\
import { createIcons, icons } from 'lucide';
createIcons({ icons });
document.body.append('<i data-lucide="$Name"></i>');\
`,
}, },
{ {
language: 'tsx', language: 'tsx',
title: 'React', title: 'React',
code: `import { PascalCase } from 'lucide-react'; code: `import { $PascalCase } from 'lucide-react';
const App = () => { const App = () => {
return ( return (
<PascalCase /> <$PascalCase />
); );
}; };
@@ -32,11 +38,11 @@ export default App;
language: 'vue', language: 'vue',
title: 'Vue', title: 'Vue',
code: `<script setup> code: `<script setup>
import { PascalCase } from 'lucide-vue-next'; import { $PascalCase } from 'lucide-vue-next';
</script> </script>
<template> <template>
<PascalCase /> <$PascalCase />
</template> </template>
`, `,
}, },
@@ -44,20 +50,20 @@ export default App;
language: 'svelte', language: 'svelte',
title: 'Svelte', title: 'Svelte',
code: `<script> code: `<script>
import { PascalCase } from 'lucide-svelte'; import { $PascalCase } from 'lucide-svelte';
</script> </script>
<PascalCase /> <$PascalCase />
`, `,
}, },
{ {
language: 'tsx', language: 'tsx',
title: 'Preact', title: 'Preact',
code: `import { PascalCase } from 'lucide-preact'; code: `import { $PascalCase } from 'lucide-preact';
const App = () => { const App = () => {
return ( return (
<PascalCase /> <$PascalCase />
); );
}; };
@@ -67,11 +73,11 @@ export default App;
{ {
language: 'tsx', language: 'tsx',
title: 'Solid', title: 'Solid',
code: `import { PascalCase } from 'lucide-solid'; code: `import { $PascalCase } from 'lucide-solid';
const App = () => { const App = () => {
return ( return (
<PascalCase /> <$PascalCase />
); );
}; };
@@ -82,16 +88,16 @@ export default App;
language: 'tsx', language: 'tsx',
title: 'Angular', title: 'Angular',
code: `// app.module.ts code: `// app.module.ts
import { LucideAngularModule, PascalCase } from 'lucide-angular'; import { LucideAngularModule, $PascalCase } from 'lucide-angular';
@NgModule({ @NgModule({
imports: [ imports: [
LucideAngularModule.pick({ PascalCase }) LucideAngularModule.pick({ $PascalCase })
], ],
}) })
// app.component.html // app.component.html
<lucide-icon name="Name"></lucide-icon> <lucide-icon name="$Name"></lucide-icon>
`, `,
}, },
{ {
@@ -101,7 +107,7 @@ import { LucideAngularModule, PascalCase } from 'lucide-angular';
@import ('~lucide-static/font/Lucide.css'); @import ('~lucide-static/font/Lucide.css');
</style> </style>
<div class="icon-Name"></div> <div class="icon-$Name"></div>
`, `,
}, },
]; ];

View File

@@ -0,0 +1,161 @@
import { bundledLanguages, type ThemeRegistration } from 'shikiji';
import { getHighlighter } from 'shikiji';
type CodeExampleType = {
title: string;
language: string;
code: string;
}[];
const getIconCodes = (): CodeExampleType => {
return [
{
language: 'js',
title: 'Vanilla',
code: `\
import { createIcons, icons } from 'lucide';
import { $CamelCase } from '@lucide/lab';
createIcons({
icons: {
$CamelCase
}
});
document.body.append('<i data-lucide="$Name"></i>');\
`,
},
{
language: 'tsx',
title: 'React',
code: `import { Icon } from 'lucide-react';
import { $CamelCase } from '@lucide/lab';
const App = () => {
return (
<Icon iconNode={$CamelCase} />
);
};
export default App;
`,
},
{
language: 'vue',
title: 'Vue',
code: `<script setup>
import { Icon } from 'lucide-vue-next';
import { $CamelCase } from '@lucide/lab';
</script>
<template>
<Icon :iconNode="burger" />
</template>
`,
},
{
language: 'svelte',
title: 'Svelte',
code: `<script>
import { Icon } from 'lucide-svelte';
import { $CamelCase } from '@lucide/lab';
</script>
<Icon iconNode={burger} />
`,
},
{
language: 'tsx',
title: 'Preact',
code: `import { Icon } from 'lucide-preact';
import { $CamelCase } from '@lucide/lab';
const App = () => {
return (
<Icon iconNode={$CamelCase} />
);
};
export default App;
`,
},
{
language: 'tsx',
title: 'Solid',
code: `import { Icon } from 'lucide-solid';
import { $CamelCase } from '@lucide/lab';
const App = () => {
return (
<Icon iconNode={$CamelCase} />
);
};
export default App;
`,
},
{
language: 'tsx',
title: 'Angular',
code: `// app.module.ts
import { LucideAngularModule } from 'lucide-angular';
import { $CamelCase } from '@lucide/lab';
@NgModule({
imports: [
LucideAngularModule.pick({ $CamelCase })
],
})
// app.component.html
<lucide-icon name="$CamelCase"></lucide-icon>
`,
},
];
};
export type ThemeOptions =
| ThemeRegistration
| { light: ThemeRegistration; dark: ThemeRegistration };
const highLightCode = async (code: string, lang: string, active?: boolean) => {
const highlighter = await getHighlighter({
themes: ['github-light', 'github-dark'],
langs: Object.keys(bundledLanguages),
});
const highlightedCode = highlighter
.codeToHtml(code, {
lang,
themes: {
light: 'github-light',
dark: 'github-dark',
},
defaultColor: false,
})
.replace('shiki-themes', 'shiki-themes vp-code');
return `<div class="language-${lang} ${active ? 'active' : ''}">
<button title="Copy Code" class="copy"></button>
<span class="lang">${lang}</span>
${highlightedCode}
</div>`;
};
export default async function createCodeExamples() {
const codes = getIconCodes();
const codeExamplePromises = codes.map(async ({ title, language, code }, index) => {
const isFirst = index === 0;
const codeString = await highLightCode(code, language, isFirst);
return {
title,
language: language,
code: codeString,
};
});
return Promise.all(codeExamplePromises);
}

View File

@@ -0,0 +1,32 @@
import { bundledLanguages, type ThemeRegistration } from 'shikiji';
import { getHighlighter } from 'shikiji';
export type ThemeOptions =
| ThemeRegistration
| { light: ThemeRegistration; dark: ThemeRegistration };
const highLightCode = async (code: string, lang: string, active?: boolean) => {
const highlighter = await getHighlighter({
themes: ['github-light', 'github-dark'],
langs: Object.keys(bundledLanguages),
});
const highlightedCode = highlighter
.codeToHtml(code, {
lang,
themes: {
light: 'github-light',
dark: 'github-dark',
},
defaultColor: false,
})
.replace('shiki-themes', 'shiki-themes vp-code');
return `<div class="language-${lang} ${active ? 'active' : ''}">
<button title="Copy Code" class="copy"></button>
<span class="lang">${lang}</span>
${highlightedCode}
</div>`;
};
export default highLightCode;

View File

@@ -0,0 +1,5 @@
export type CodeExampleType = {
title: string;
language: string;
code: string;
}[];

View File

@@ -1,6 +1,5 @@
import { promises as fs, constants } from 'fs'; import { promises as fs, constants } from 'fs';
import path from 'path'; import path from 'path';
import yaml from 'js-yaml';
import { PackageItem } from '../theme/types'; import { PackageItem } from '../theme/types';
const fileExist = (filePath) => const fileExist = (filePath) =>
@@ -27,11 +26,6 @@ const fetchPackages = async (): Promise<PackageItem[]> => {
return JSON.parse(await fs.readFile(jsonFilePath, 'utf-8')); return JSON.parse(await fs.readFile(jsonFilePath, 'utf-8'));
} }
const ymlFilePath = path.resolve(filePath, 'pubspec.yaml');
if (await fileExist(ymlFilePath)) {
return yaml.load(await fs.readFile(ymlFilePath, 'utf-8'));
}
return null; return null;
}), }),
); );

View File

@@ -31,10 +31,10 @@ const sidebar: UserConfig<DefaultTheme.Config>['themeConfig']['sidebar'] = {
{ {
text: 'Advanced', text: 'Advanced',
items: [ items: [
// { {
// text: 'Accessibility', text: 'Accessibility',
// link: '/guide/advanced/accessibility' link: '/guide/advanced/accessibility',
// }, },
{ {
text: 'Global styling', text: 'Global styling',
link: '/guide/advanced/global-styling', link: '/guide/advanced/global-styling',
@@ -117,6 +117,10 @@ const sidebar: UserConfig<DefaultTheme.Config>['themeConfig']['sidebar'] = {
text: 'Designing in Figma', text: 'Designing in Figma',
link: '/guide/design/figma-guide', link: '/guide/design/figma-guide',
}, },
{
text: 'Designing in Affinity Designer',
link: '/guide/design/affinity-designer-guide',
},
], ],
}, },
], ],

View File

@@ -7,7 +7,16 @@ const props = defineProps<{
href?: string href?: string
}>() }>()
const isExternal = computed(() => props.href?.startsWith('http') ?? false)
const component = computed(() => props.href ? 'a' : 'div') const component = computed(() => props.href ? 'a' : 'div')
const target = computed(() => isExternal.value ? '_blank' : undefined)
const rel = computed(() => isExternal.value ? 'noreferrer noopener' : undefined)
const onClick = computed(() => {
if(!props.href || isExternal) return
return go(props.href)
})
</script> </script>
<template> <template>
@@ -15,7 +24,9 @@ const component = computed(() => props.href ? 'a' : 'div')
:is="component" :is="component"
:href="href" :href="href"
class="badge" class="badge"
@click="props?.href ? go(href) : undefined" :target="target"
:rel="rel"
@click="onClick"
> >
<slot/> <slot/>
</component> </component>

View File

@@ -0,0 +1,90 @@
<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps<{
label: string
id: string
value: string
modelValue: string | string[]
}>()
const emit = defineEmits(['change', 'input', 'update:modelValue'])
const model = computed({
get: () => {
if (Array.isArray(props.modelValue)) {
return props.modelValue.includes(props.value)
}
return props.modelValue === props.value
},
set: (value: string) => {
if (Array.isArray(props.modelValue)) {
const newValue = [...props.modelValue]
const index = newValue.indexOf(props.value)
if (value) {
if (index === -1) {
newValue.push(props.value)
}
} else {
if (index !== -1) {
newValue.splice(index, 1)
}
}
emit('update:modelValue', newValue)
} else {
emit('update:modelValue', value)
}
}
})
</script>
<template>
<div class="checkbox-wrapper">
<input
type="checkbox"
class="checkbox"
ref="input"
:id="id"
v-model="model"
v-bind="$attrs"
/>
<label :for="id" class="checkbox-label">
{{ label }}
</label>
</div>
</template>
<style scoped>
.checkbox-wrapper {
display: flex;
align-items: center;
gap: 8px;
}
.checkbox-label {
line-height: 20px;
font-size: 13px;
color: var(--vt-c-text-1);
transition: color .5s;
display: block;
}
.checkbox {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
cursor: pointer;
border: 1px solid var(--vp-input-border-color);
background-color: var(--vp-input-switch-bg-color);
border-radius: 4px;
}
.checkbox:checked {
border-color: transparent;
background: url("data:image/svg+xml,%3Csvg width='12px' height='12px' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='4' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")
center no-repeat var(--vp-c-brand);;
}
</style>

View File

@@ -8,8 +8,6 @@ import { data } from './HomeHeroBefore.data'
<HomeContainer class="container"> <HomeContainer class="container">
<Badge <Badge
:href="`https://github.com/lucide-icons/lucide/releases/tag/${data.version}`" :href="`https://github.com/lucide-icons/lucide/releases/tag/${data.version}`"
target="_blank"
rel="noreferrer noopener"
>v{{ data.version }}</Badge> >v{{ data.version }}</Badge>
</HomeContainer> </HomeContainer>
</template> </template>

View File

@@ -1,17 +1,23 @@
<script setup lang="ts"> <script setup lang="ts">
import Card from '../base/Card.vue' import Card from '../base/Card.vue';
import HomeSectionTitle from './HomeSectionTitle.vue' import HomeSectionTitle from './HomeSectionTitle.vue';
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue' import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
</script> </script>
<template> <template>
<HomeSectionTitle :headingLevel="3"> <HomeSectionTitle :headingLevel="3"> Sponsor the Lucide maintainers </HomeSectionTitle>
Sponsor the Lucide maintainers
</HomeSectionTitle>
<Card class="sponsor-card"> <Card class="sponsor-card">
<img <img
src="/open-collective.png" src="/company-logos/open-collective-light.svg"
alt="Open Collective logo" alt="Open Collective logo"
class="logo light"
width="242"
height="42"
/>
<img
src="/company-logos/open-collective-dark.svg"
alt="Open Collective logo"
class="logo dark"
width="242" width="242"
height="42" height="42"
/> />
@@ -37,6 +43,13 @@ import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vu
margin: auto 0; margin: auto 0;
} }
html.dark .logo.dark {
display: none;
}
html:not(.dark) .logo.light {
display: none;
}
@media (min-width: 640px) { @media (min-width: 640px) {
.sponsor-card { .sponsor-card {
flex-direction: row; flex-direction: row;

View File

@@ -3,7 +3,7 @@ export interface TeamMember {
name: string name: string
title: string title: string
image: string image: string
sponsor: string sponsor?: string
socialLinks: DefaultTheme.SocialLink[] socialLinks: DefaultTheme.SocialLink[]
} }
</script> </script>

View File

@@ -6,6 +6,7 @@ import { isActive } from 'vitepress/dist/client/shared'
import { useActiveAnchor } from '../../composables/useActiveAnchor' import { useActiveAnchor } from '../../composables/useActiveAnchor'
import { data } from './CategoryList.data' import { data } from './CategoryList.data'
import CategoryListItem from './CategoryListItem.vue' import CategoryListItem from './CategoryListItem.vue'
import SidebarTitle from './SidebarTitle.vue'
import { useCategoryView } from '../../composables/useCategoryView' import { useCategoryView } from '../../composables/useCategoryView'
const { page } = useData() const { page } = useData()
@@ -46,10 +47,13 @@ watch(headers, () => {
<template> <template>
<div class="category-list" ref="container"> <div class="category-list" ref="container">
<VPLink class="sidebar-title" href="/icons/" :class="{ 'active': overviewIsActive } "> <SidebarTitle>
View
</SidebarTitle>
<VPLink class="sidebar-link sidebar-text" href="/icons/" :class="{ 'active': overviewIsActive } ">
All All
</VPLink> </VPLink>
<VPLink class="sidebar-title" href="/icons/categories" :class="{ 'active': categoriesIsActive } "> <VPLink class="sidebar-link sidebar-text" href="/icons/categories" :class="{ 'active': categoriesIsActive } ">
Categories Categories
</VPLink> </VPLink>
<div class="content"> <div class="content">
@@ -62,17 +66,20 @@ watch(headers, () => {
</template> </template>
<style scoped> <style scoped>
.sidebar-title { .sidebar-text {
font-weight: 500;
color: var(--vp-c-text-2);
margin-bottom: 6px;
line-height: 24px; line-height: 24px;
font-size: 14px; font-size: 14px;
display: block; display: block;
transition: color 0.25s; transition: color 0.25s;
padding: 4px 0;
} }
.sidebar-title:hover, .sidebar-title.active { .sidebar-link {
font-weight: 500;
color: var(--vp-c-text-2);
}
.sidebar-link:hover, .sidebar-link.active {
color: var(--vp-c-brand); color: var(--vp-c-brand);
} }
.content { .content {

View File

@@ -39,6 +39,12 @@ function copyJSX() {
navigator.clipboard.writeText(code) navigator.clipboard.writeText(code)
} }
function copyComponentName() {
const code = componentName.value
navigator.clipboard.writeText(code)
}
function copyVue() { function copyVue() {
let attrs = [''] let attrs = ['']
@@ -101,6 +107,7 @@ function copyAngular() {
:popoverPosition="popoverPosition" :popoverPosition="popoverPosition"
:options="[ :options="[
{ text: 'Copy JSX' , onClick: copyJSX }, { text: 'Copy JSX' , onClick: copyJSX },
{ text: 'Copy Component Name' , onClick: copyComponentName },
{ text: 'Copy Vue' , onClick: copyVue }, { text: 'Copy Vue' , onClick: copyVue },
{ text: 'Copy Svelte' , onClick: copyJSX }, { text: 'Copy Svelte' , onClick: copyJSX },
{ text: 'Copy Angular' , onClick: copyAngular }, { text: 'Copy Angular' , onClick: copyAngular },

View File

@@ -11,21 +11,32 @@ import IconInfo from './IconInfo.vue';
import Badge from '../base/Badge.vue'; import Badge from '../base/Badge.vue';
import { computedAsync } from '@vueuse/core'; import { computedAsync } from '@vueuse/core';
import { satisfies } from 'semver'; import { satisfies } from 'semver';
import { useExternalLibs } from '../../composables/useExternalLibs';
const props = defineProps<{ const props = defineProps<{
iconName: string | null iconName: string | null
}>() }>()
const { externalIconNodes } = useExternalLibs()
const { go } = useRouter() const { go } = useRouter()
const icon = computedAsync<IconEntity | null>(async () => { const icon = computedAsync<IconEntity | null>(async () => {
if (props.iconName) { if (props.iconName) {
try { try {
if (props.iconName.includes(':')) {
const [library, name] = props.iconName.split(':')
return externalIconNodes.value[library].find((icon) => icon.name === name)
} else {
return (await import(`../../../data/iconDetails/${props.iconName}.ts`)).default as IconEntity return (await import(`../../../data/iconDetails/${props.iconName}.ts`)).default as IconEntity
}
} catch (err) { } catch (err) {
if (!props.iconName.includes(':')) {
go(`/icons/${props.iconName}`) go(`/icons/${props.iconName}`)
} }
} }
}
return null return null
}, null) }, null)
@@ -55,10 +66,8 @@ const Expand = createLucideIcon('Expand', expand)
v-if="icon.createdRelease" v-if="icon.createdRelease"
class="version" class="version"
:href="releaseTagLink(icon.createdRelease.version)" :href="releaseTagLink(icon.createdRelease.version)"
target="_blank"
rel="noreferrer noopener"
>v{{ icon.createdRelease.version }}</Badge> >v{{ icon.createdRelease.version }}</Badge>
<IconButton @click="go(`/icons/${icon.name}`)"> <IconButton @click="go(icon.externalLibrary ? `/icons/${icon.externalLibrary}/${icon.name}` : `/icons/${icon.name}`)">
<component :is="Expand" /> <component :is="Expand" />
</IconButton> </IconButton>
<IconButton @click="onClose"> <IconButton @click="onClose">

View File

@@ -25,8 +25,10 @@ function setActiveIcon(name: string) {
:key="icon.name" :key="icon.name"
> >
<IconItem <IconItem
v-bind="icon" :iconNode="icon.iconNode"
@setActiveIcon="setActiveIcon(icon.name)" :name="icon.name"
:externalLibrary="icon.externalLibrary"
@setActiveIcon="setActiveIcon"
:active="activeIcon === icon.name" :active="activeIcon === icon.name"
customizable customizable
:overlayMode="overlayMode" :overlayMode="overlayMode"

View File

@@ -7,6 +7,8 @@ import CopyCodeButton from './CopyCodeButton.vue';
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue'; import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
import {useData, useRouter} from 'vitepress'; import {useData, useRouter} from 'vitepress';
import { computed } from 'vue'; import { computed } from 'vue';
import createLucideIcon from 'lucide-vue-next/src/createLucideIcon';
import { diamond } from '../../../data/iconNodes'
const props = defineProps<{ const props = defineProps<{
icon: IconEntity icon: IconEntity
@@ -20,13 +22,21 @@ const tags = computed(() => {
if (!props.icon || !props?.icon?.tags) return [] if (!props.icon || !props?.icon?.tags) return []
return props.icon.tags.join(' • ') return props.icon.tags.join(' • ')
}) })
const DiamondIcon = createLucideIcon('Diamond', diamond)
</script> </script>
<template> <template>
<div class="icon-info"> <div class="icon-info">
<div class="icon-name-wrapper">
<IconDetailName class="icon-name"> <IconDetailName class="icon-name">
{{ icon.name }} {{ icon.name }}
</IconDetailName> </IconDetailName>
<div v-if="icon.externalLibrary" class="icon-external-lib">
<DiamondIcon fill="currentColor" :size="12"/>
{{ icon.externalLibrary }}
</div>
</div>
<div class="tags-scroller" v-if="tags.length"> <div class="tags-scroller" v-if="tags.length">
<p class="icon-tags horizontal-scroller"> <p class="icon-tags horizontal-scroller">
{{ tags }} {{ tags }}
@@ -44,10 +54,10 @@ const tags = computed(() => {
<div class="group buttons"> <div class="group buttons">
<VPButton <VPButton
v-if="!page?.relativePath?.startsWith?.(`icons/${icon.name}`)" v-if="!page?.relativePath?.startsWith?.(icon.externalLibrary ? `icons/${icon.externalLibrary}/${icon.name}`: `icons/${icon.name}`)"
:href="`/icons/${icon.name}`" :href="icon.externalLibrary ? `/icons/${icon.externalLibrary}/${icon.name}`: `/icons/${icon.name}`"
text="See in action" text="See in action"
@click="go(`/icons/${icon.name}`)" @click="go(icon.externalLibrary ? `/icons/${icon.externalLibrary}/${icon.name}`: `/icons/${icon.name}`)"
/> />
<CopySVGButton :name="icon.name" :popoverPosition="popoverPosition"/> <CopySVGButton :name="icon.name" :popoverPosition="popoverPosition"/>
<CopyCodeButton :name="icon.name" :popoverPosition="popoverPosition"/> <CopyCodeButton :name="icon.name" :popoverPosition="popoverPosition"/>
@@ -67,9 +77,27 @@ const tags = computed(() => {
text-transform: capitalize; text-transform: capitalize;
} }
.icon-name { .icon-name {
margin-right: -36px;
}
.icon-name-wrapper {
display: flex;
align-items: center;
gap: 2px;
margin-bottom: 4px; margin-bottom: 4px;
} }
.icon-external-lib {
color: var(--vp-c-brand-dark);
padding: 4px 12px;
font-size: 16px;
font-weight: 600;
line-height: 28px;
display: flex;
gap: 8px;
align-items: center;
}
.icon-tags { .icon-tags {
font-size: 16px; font-size: 16px;
color: var(--vp-c-text-2); color: var(--vp-c-text-2);

View File

@@ -6,6 +6,7 @@ import { useRouter } from 'vitepress';
import getSVGIcon from '../../utils/getSVGIcon'; import getSVGIcon from '../../utils/getSVGIcon';
import useConfetti from '../../composables/useConfetti'; import useConfetti from '../../composables/useConfetti';
import Tooltip from '../base/Tooltip.vue'; import Tooltip from '../base/Tooltip.vue';
import { diamond } from '../../../data/iconNodes'
const downloadText = 'Download!' const downloadText = 'Download!'
const copiedText = 'Copied!' const copiedText = 'Copied!'
@@ -16,6 +17,7 @@ const props = defineProps<{
name: string; name: string;
iconNode: IconNode; iconNode: IconNode;
active: boolean; active: boolean;
externalLibrary?: string;
customizable?: boolean; customizable?: boolean;
overlayMode?: boolean overlayMode?: boolean
hideIcon?: boolean hideIcon?: boolean
@@ -33,8 +35,9 @@ const icon = computed(() => {
return createLucideIcon(props.name, props.iconNode) return createLucideIcon(props.name, props.iconNode)
}) })
async function navigateToIcon(event) { const href = computed(() => props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`)
async function navigateToIcon(event) {
if (event.shiftKey) { if (event.shiftKey) {
event.preventDefault() event.preventDefault()
const svgString = getSVGIcon(event.target.firstChild, { const svgString = getSVGIcon(event.target.firstChild, {
@@ -50,13 +53,16 @@ async function navigateToIcon(event) {
if(props.overlayMode && showOverlay.value) { if(props.overlayMode && showOverlay.value) {
event.preventDefault() event.preventDefault()
window.history.pushState({}, '', `/icons/${props.name}`)
emit('setActiveIcon', props.name) window.history.pushState({}, '', props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`)
emit('setActiveIcon', props.externalLibrary ? `${props.externalLibrary}:${props.name}`: props.name)
} else { } else {
event.preventDefault() event.preventDefault()
go(`/icons/${props.name}`) go(props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`)
} }
} }
const DiamondIcon = createLucideIcon('Diamond', diamond)
</script> </script>
<template> <template>
@@ -66,7 +72,7 @@ async function navigateToIcon(event) {
@click="navigateToIcon" @click="navigateToIcon"
:class="{ active, animate }" :class="{ active, animate }"
:aria-label="name" :aria-label="name"
:href="`/icons/${props.name}`"
:data-confetti-text="confettiText" :data-confetti-text="confettiText"
ref="ref" ref="ref"
> >
@@ -80,6 +86,13 @@ async function navigateToIcon(event) {
}" }"
/> />
</KeepAlive> </KeepAlive>
<div
v-if="externalLibrary"
class="floating-diamond"
aria-hidden="true"
>
<DiamondIcon fill="currentColor" :size="8"/>
</div>
</a> </a>
</Tooltip> </Tooltip>
</template> </template>
@@ -88,6 +101,7 @@ async function navigateToIcon(event) {
<style scoped> <style scoped>
.icon-button { .icon-button {
position: relative;
display: inline-block; display: inline-block;
border: 1px solid transparent; border: 1px solid transparent;
text-align: center; text-align: center;
@@ -104,6 +118,13 @@ async function navigateToIcon(event) {
color: var(--vp-c-text-1); color: var(--vp-c-text-1);
} }
.floating-diamond {
position: absolute;
top: 4px;
right: 4px;
color: var(--vp-c-brand);
}
.confetti-button:before, .confetti-button:before,
.confetti-button:after { .confetti-button:after {
z-index: 100; z-index: 100;

View File

@@ -19,7 +19,7 @@ export type CategoryRow = CategoryNameRow | CategoryIconsRow;
import IconGrid from './IconGrid.vue' import IconGrid from './IconGrid.vue'
defineProps<{ defineProps<{
activeIconName: string activeIconName: string | null
categoryRow: CategoryRow categoryRow: CategoryRow
}>() }>()

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, defineAsyncComponent, onMounted } from 'vue'; import { ref, computed, defineAsyncComponent, onMounted, watch, watchEffect } from 'vue';
import type { IconEntity, Category } from '../../types'; import type { IconEntity, Category } from '../../types';
import useSearch from '../../composables/useSearch'; import useSearch from '../../composables/useSearch';
import InputSearch from '../base/InputSearch.vue'; import InputSearch from '../base/InputSearch.vue';
@@ -69,7 +69,7 @@ const categories = computed(() => {
return props.categories return props.categories
.map(({ name, title }) => { .map(({ name, title }) => {
const categoryIcons = props.icons.filter((icon) => { const categoryIcons = props.icons.filter((icon) => {
const iconCategories = props.iconCategories[icon.name]; const iconCategories = icon?.externalLibrary ? icon.categories : props.iconCategories[icon.name]
return iconCategories?.includes(name); return iconCategories?.includes(name);
}); });
@@ -140,6 +140,12 @@ function handleCloseDrawer() {
window.history.pushState({}, '', '/icons/categories'); window.history.pushState({}, '', '/icons/categories');
} }
watchEffect(() => {
console.log(props.icons.find((icon) => icon.name === 'burger'));
});
</script> </script>
<template> <template>

View File

@@ -0,0 +1,47 @@
<script setup lang="ts">
import Checkbox from '../base/Checkbox.vue'
import SidebarTitle from './SidebarTitle.vue'
import { useExternalLibs } from '../../composables/useExternalLibs';
import { ExternalLibs } from '../../types';
interface ExternalLibrary {
name: string;
value: ExternalLibs;
}
const externalLibraries: ExternalLibrary[] = [
{
name: 'Lab',
value: 'lab'
},
];
const { selectedLibs } = useExternalLibs();
</script>
<template>
<div class="external-library-select">
<SidebarTitle>
Include external libs
</SidebarTitle>
<ul>
<li
v-for="library in externalLibraries"
:key="library.name"
>
<Checkbox
:label="library.name"
:id="library.name"
v-model="selectedLibs"
:value="library.value"
/>
</li>
</ul>
</div>
</template>
<style scoped>
.external-library-select {
margin-bottom: 24px;
}
</style>

View File

@@ -0,0 +1,19 @@
<template>
<h2 class="sidebar-title sidebar-text">
<slot />
</h2>
</template>
<style scoped>
.sidebar-title {
font-weight: 700;
color: var(--vp-c-text-1);
}
.sidebar-text {
line-height: 24px;
font-size: 14px;
display: block;
transition: color 0.25s;
padding: 4px 0;
}
</style>

View File

@@ -24,7 +24,7 @@ const links = computed(() => [
}, },
{ {
text: 'Github', text: 'Github',
href: `${githubLink.value}/issues` href: `${githubLink.value}`
}, },
{ {
text: 'Issues', text: 'Issues',

View File

@@ -5,9 +5,10 @@ import fetchPackages from '../../../lib/fetchPackages';
export default { export default {
async load() { async load() {
const packages = await fetchPackages(); const packages = await fetchPackages();
return { return {
packages: packages packages: packages
.filter((p) => p.name in packageData) .filter((p) => p?.name != null && p.name in packageData)
.map((pData) => ({ .map((pData) => ({
...pData, ...pData,
...packageData[pData.name], ...packageData[pData.name],

View File

@@ -1,7 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { data } from './PackageList.data' import { data } from './PackageList.data'
import GridSection from '../base/GridSection.vue' import GridSection from '../base/GridSection.vue'
import PackageListItem from "./PackageListItem.vue";</script> import PackageListItem from "./PackageListItem.vue";
</script>
<template> <template>
<GridSection <GridSection

View File

@@ -19,7 +19,7 @@ const props = defineProps<{
<img v-if="packageData.iconDark" :src="packageData.iconDark" alt="" class="package-icon dark" :class="packageData.iconClass" /> <img v-if="packageData.iconDark" :src="packageData.iconDark" alt="" class="package-icon dark" :class="packageData.iconClass" />
</div> </div>
<div class="package-title"> <div class="package-title">
<h2 class="title">{{ props.packageData.name }}</h2> <h2 class="title">{{ props.packageData?.name }}</h2>
<a v-for="shield in props.packageData.shields" :href="shield.href" class="package-shield" rel="noreferrer noopener"> <a v-for="shield in props.packageData.shields" :href="shield.href" class="package-shield" rel="noreferrer noopener">
<img :src="shield.src" :alt="shield.href" /> <img :src="shield.src" :alt="shield.href" />
</a> </a>

View File

@@ -0,0 +1,57 @@
import { ref, inject, Ref, watch } from 'vue';
import { ExternalLibs, IconEntity } from '../types';
export const EXTERNAL_LIBS_CONTEXT = Symbol('externalLibs');
type ExternalIconNodes = Partial<Record<ExternalLibs, IconEntity[]>>;
interface ExternalLibContext {
selectedLibs: Ref<[ExternalLibs]>;
externalIconNodes: Ref<ExternalIconNodes>;
}
export const externalLibContext = {
selectedLibs: ref([]),
externalIconNodes: ref({}),
};
const externalLibIconNodesAPI = {
lab: 'https://lab.lucide.dev/api/icon-details',
};
export function useExternalLibs(): ExternalLibContext {
const context = inject<ExternalLibContext>(EXTERNAL_LIBS_CONTEXT);
watch(context?.selectedLibs, async (selectedLibs) => {
const savedIconNodes = { ...context?.externalIconNodes.value };
const newExternalIconNodes: ExternalIconNodes = {};
try {
for (const lib of selectedLibs) {
if (savedIconNodes[lib]) {
newExternalIconNodes[lib] = savedIconNodes[lib];
} else {
const response = await fetch(externalLibIconNodesAPI[lib]);
const iconNodes = await response.json();
if (iconNodes) {
newExternalIconNodes[lib] = Object.values(iconNodes).map((iconEntity: IconEntity) => ({
...iconEntity,
externalLibrary: lib,
}));
}
}
}
context.externalIconNodes.value = newExternalIconNodes;
} catch (error) {
console.error(error);
}
});
if (!context) {
throw new Error('useExternalLibs must be used with externalLibs context');
}
return context;
}

View File

@@ -0,0 +1,29 @@
import { computed } from 'vue';
import { useExternalLibs } from '~/.vitepress/theme/composables/useExternalLibs';
import { IconEntity } from '../types';
const useIconsWithExternalLibs = (initialIcons?: IconEntity[]) => {
const { externalIconNodes } = useExternalLibs();
return computed(() => {
let icons = [];
if (initialIcons) {
icons = icons.concat(initialIcons);
}
const externalIconNodesArray = Object.values(externalIconNodes.value);
if (externalIconNodesArray?.length) {
externalIconNodesArray.forEach((iconNodes) => {
if (iconNodes?.length) {
icons = icons.concat(iconNodes);
}
});
}
return icons;
});
};
export default useIconsWithExternalLibs;

View File

@@ -7,6 +7,7 @@ import HomeHeroIconsCard from './components/home/HomeHeroIconsCard.vue';
import HomeHeroBefore from './components/home/HomeHeroBefore.vue'; import HomeHeroBefore from './components/home/HomeHeroBefore.vue';
import { ICON_STYLE_CONTEXT, iconStyleContext } from './composables/useIconStyle'; import { ICON_STYLE_CONTEXT, iconStyleContext } from './composables/useIconStyle';
import { CATEGORY_VIEW_CONTEXT, categoryViewContext } from './composables/useCategoryView'; import { CATEGORY_VIEW_CONTEXT, categoryViewContext } from './composables/useCategoryView';
import { EXTERNAL_LIBS_CONTEXT, externalLibContext } from './composables/useExternalLibs';
const theme: Partial<Theme> = { const theme: Partial<Theme> = {
extends: DefaultTheme, extends: DefaultTheme,
@@ -20,6 +21,7 @@ const theme: Partial<Theme> = {
enhanceApp({ app }) { enhanceApp({ app }) {
app.provide(ICON_STYLE_CONTEXT, iconStyleContext); app.provide(ICON_STYLE_CONTEXT, iconStyleContext);
app.provide(CATEGORY_VIEW_CONTEXT, categoryViewContext); app.provide(CATEGORY_VIEW_CONTEXT, categoryViewContext);
app.provide(EXTERNAL_LIBS_CONTEXT, externalLibContext);
}, },
}; };

View File

@@ -3,6 +3,7 @@ import { useData } from 'vitepress'
import CategoryList from '../components/icons/CategoryList.vue' import CategoryList from '../components/icons/CategoryList.vue'
import SidebarIconCustomizer from '../components/icons/SidebarIconCustomizer.vue' import SidebarIconCustomizer from '../components/icons/SidebarIconCustomizer.vue'
import ExternalLibrarySelect from '../components/icons/SidebarExternalLibrarySelect.vue'
const { page } = useData() const { page } = useData()
@@ -11,6 +12,7 @@ const { page } = useData()
<template> <template>
<div> <div>
<SidebarIconCustomizer v-if="page?.relativePath?.startsWith?.('icons')"/> <SidebarIconCustomizer v-if="page?.relativePath?.startsWith?.('icons')"/>
<ExternalLibrarySelect v-if="page?.relativePath?.startsWith?.('icons')"/>
<CategoryList v-if="page?.relativePath?.startsWith?.('icons')"/> <CategoryList v-if="page?.relativePath?.startsWith?.('icons')"/>
</div> </div>
</template> </template>

View File

@@ -1,13 +1,18 @@
export type IconNode = [elementName: string, attrs: Record<string, string>][]; export type IconNode = [elementName: string, attrs: Record<string, string>][];
export type IconNodeWithKeys = [elementName: string, attrs: Record<string, string>, key: string][]; export type IconNodeWithKeys = [elementName: string, attrs: Record<string, string>, key: string][];
export interface IconEntity { export interface IconMetaData {
name: string;
tags: string[]; tags: string[];
categories: string[]; categories: string[];
contributors: string[]; contributors: string[];
aliases?: string[]; aliases?: string[];
}
export type ExternalLibs = 'lab';
export interface IconEntity extends IconMetaData {
name: string;
iconNode: IconNode; iconNode: IconNode;
externalLibrary?: ExternalLibs;
createdRelease?: Release; createdRelease?: Release;
changedRelease?: Release; changedRelease?: Release;
} }

View File

@@ -1,4 +1,215 @@
---
title: Accessibility
---
# Accessibility # Accessibility
<!-- Description how you should use svg icons keeping web accessible --> Icons are pictures that show what something means without using words. They can be very helpful
<!-- See @JanTrichter comment about some information to write this: https://github.com/lucide-icons/lucide/pull/1521#discussion_r1332141390 --> because they can quickly give information.
However, not everyone can understand them easily. When using icons it is very important to consider
the following aspects of accessibility.
## Provide visible labels
Icons are a helpful tool to improve perception, but they aren't a replacement for text.
In most cases, it is probably a good idea to also provide a textual representation of your icon's
function.
![In short: Dont rely on communicating the function of elements by icons alone. Do also provide a written description of the your interactive elements. For example: write out "On this page" on your on-page navigation element.](../../images/a11y/visible-labels.svg?raw=true)
## Contrast
Ensure there's enough contrast between the icon and its background so that it's visible to people
with low vision or color vision deficiencies.
We recommend
following [WCAG 2.1 SC 1.4.3](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html).
![In short: use a contrast ratio of at least 4.5:1](../../images/a11y/contrast.svg?raw=true)
## Use of color
Avoid relying solely on color to convey meaning in icons, as some users may have color blindness.
Instead, use additional visual cues like shape, shading or text.
![For example: Dont mark state with color, mark it with distinct visuals.](../../images/a11y/use-of-color.svg?raw=true)
## Interactivity
Ensure that interactive icons are accessible via keyboard navigation and provide clear feedback when
activated.
![](../../images/a11y/interactivity.svg?raw=true)
In most cases this is easily done by wrapping them in icon buttons.
## Minimum target size
Small targets can be difficult to click or touch, if your icon is interactive, we recommend that it
should have a minimum target size of 44×44 pixels.
![](../../images/a11y/target-size.svg?raw=true)
In practice, this doesn't necessarily mean that the icon itself should be this large, only its
interactive wrapper element.
## Meaningfulness
Icons should represent concepts or actions in a universally understandable way. Avoid using abstract
or ambiguous, or culture-specific symbols that might confuse some users.
![For example: Use universally understandable symbols and don't base your choice of icon on puns.](../../images/a11y/meaningfulness.svg?raw=true)
## Consistency
Maintain consistency in icon design and usage across your interface to help users learn and
understand their meanings more easily.
![For example: Dont use the same icon for multiple distinct purposes or meanings. Dont use different icons for the same purpose or function.](../../images/a11y/consistency.svg?raw=true)
## Text Alternatives
You may have to provide text labels or alternative text descriptions for icons, especially for
screen readers used by people with visual impairments.
However: descriptions should only be provided to standalone icons that aren't purely decorative, as
providing accessible names to non-functional elements only increases clutter when using screen
readers.
### On standalone icons
Icons are usually very unlikely to stand on their own with no semantically meaningful wrapper
element. In most cases they will be part of a badge, button (including icon buttons), navigation
item or other interactive UI element.
::: warning
In case some of your icons stand alone, and they serve a non-decorative function, make sure to
provide the appropriate accessible label for them.
:::
![In short: provide accessible label for semantic icons, but not for decorative icons.](../../images/a11y/alttext-standalone.svg?raw=true)
In general try to avoid using functional icons with no interactivity, we recommend that:
1) you either add a visible description next to them, or
2) place them in badges, labels or on buttons, and at least add a tooltip to them.
In any such case, it is preferred that the accessible name be provided for these interactive
elements (badges, buttons, nav items etc.) only, _not_ the icons themselves.
### On buttons
Do not provide an accessible label to icons when used on a button, as this label will be read out by
screen readers, leading to nonsensical text.
![](../../images/a11y/alttext-buttons.svg?raw=true)
::: details Code examples
```tsx
// Don't do this
<button>
<Plus aria-label="Plus icon"/>
Add document
</button>
// Do this, just leave it
<button>
<Plus/>
Add document
</button>
```
:::
### On icon buttons
Icon buttons are buttons that do not contain any visible text apart from the icon itself (think of
the close button of a dialog for example).
As previously stated, you should provide your accessible label on the icon button itself, not the
contained icon.
![](../../images/a11y/alttext-iconbuttons.svg?raw=true)
::: details Code examples
```tsx
// Don't do this
<button class="btn-icon">
<Home/>
</button>
// Don't do this either
<button class="btn-icon">
<Home aria-label="Home icon"/>
</button>
// This works but might not be the best solution, see below
<button aria-label="Go to home" class="btn-icon">
<Home/>
</button>
// Do this instead
<button class="btn-icon">
<Home/>
<span class="visually-hidden">Go to home</span>
</button>
```
:::
## A note on `aria-label`
Although you could provide accessible labels to your elements via the `aria-label` attribute, we
generally recommend avoiding this and instead suggest that you use your chosen CSS framework's "
visually hidden" utility whenever possible. You can
[read more about why `aria-label` might not be the best solution](https://gomakethings.com/revisting-aria-label-versus-a-visually-hidden-class/).
### Example - Radix UI
Use [Radix UI's built-in accessible icon utility component](https://www.radix-ui.com/primitives/docs/utilities/accessible-icon).
```tsx
import { ArrowRightIcon } from 'lucide-react';
import { AccessibleIcon } from '@radix-ui/react-accessible-icon';
<AccessibleIcon label="Next item">
<ArrowRightIcon />
</AccessibleIcon>
```
### Example - Bootstrap
```html
<div>
<i data-lucide="phone" aria-hidden="true"></i>
<span class="visually-hidden">Phone number</span>
</div>
```
### Example - Tailwind CSS
```html
<div>
<i data-lucide="phone" aria-hidden="true"></i>
<span class="sr-only">Phone number</span>
</div>
```
If you're not sure, you may consider learning more
about [how to hide content.](https://www.a11yproject.com/posts/how-to-hide-content/)
## Further resources
We also recommend checking out the following resources about accessibility:
- [Web Content Accessibility Guidelines (WCAG) 2.1](https://www.w3.org/TR/WCAG21/)
- [Web Accessibility Initiative (WAI)](https://www.w3.org/WAI/)
- [Learn accessibility on web.dev](https://web.dev/learn/accessibility)
- [Inclusive Components](https://inclusive-components.design/)
- [A11yTalks](https://www.a11ytalks.com/)
- [A11y automation tracker](https://a11y-automation.dev/)
- [The A11Y Project](https://www.a11yproject.com/)

View File

@@ -0,0 +1,18 @@
---
title: Affinity Designer Template Guide
---
# Affinity Designer Template Guide
This guide describes how to use the Affinity Designer template for Lucide.
## General Workflow
>Attention: By default, Affinity Designer sets the unit for stroke to points. Make sure that it is set to pixel. To do this, open `Preferences > User Interface`. Under `Decimal Places for Unit Types`, uncheck `Show Lines in points`.
1. Download and open the [Affinity Designer template](https://github.com/lucide-icons/lucide/blob/main/docs/public/templates/affinity_designer.aftemplate).
2. Follow the [Icon Design Principles](icon-design-guide.md) while you use the template (to ensure integrity with the Lucide icon pack).
3. Export the file as SVG (`File > Export`). Make sure that _Rastering_ is set to _Nothing_, _Export text as curves_ is checked (hopefully, you won't need this), _Use hex colors_ is checked, and _Flatten transforms_ is checked.
![SVG export options in Affinity Designer](../../images/affinity-designer-export-options.png?raw=true)
4. Optimize the exported SVG file further with [SVGOMG](https://jakearchibald.github.io/svgomg/) or [`svgo`](https://github.com/svg/svgo) (using `svgo --multipass exported_icon.svg`).

View File

@@ -109,8 +109,8 @@ Here are rules that should be followed to keep quality and consistency when maki
7. Icons depicting multiple elements (e.g. a person and a circle) of different sizes must list these elements in decreasing order of size.\ 7. Icons depicting multiple elements (e.g. a person and a circle) of different sizes must list these elements in decreasing order of size.\
For example: if the circle is bigger, it should be `circle-person`, if the person is bigger, it should be `person-circle`. For example: if the circle is bigger, it should be `circle-person`, if the person is bigger, it should be `person-circle`.
8. Icons depicting multiple elements of roughly equal sizes (e.g. a `ruler` and a `pencil`) must list these elements in English reading order.\ 8. Icons depicting multiple elements of roughly equal sizes (e.g. a `ruler` and a `pencil`) must list these elements front to back in case one element is in front of the other, otherwise in English reading order (top to bottom, left to right).\
For example: if the `pencil` is either above or left of `ruler`, it should be `pencil-ruler`, otherwise, it should be `ruler-pencil`. For example: if the `pencil` is either in front of, above or left of `ruler`, it should be `pencil-ruler`, otherwise, it should be `ruler-pencil`.
9. Icons depicting some sort of variation of an element must use the `[element]-[modifier]` naming scheme, with modifiers being applied to each element respectively.\ 9. Icons depicting some sort of variation of an element must use the `[element]-[modifier]` naming scheme, with modifiers being applied to each element respectively.\
For example: a dashed circle must be named `circle-dashed`, not `dashed-circle`, and in coordination with the previous guidelines, a dashed circle containing a broken heart would be named `circle-dashed-heart-broken`, due to the heart being smaller than the circle. For example: a dashed circle must be named `circle-dashed`, not `dashed-circle`, and in coordination with the previous guidelines, a dashed circle containing a broken heart would be named `circle-dashed-heart-broken`, due to the heart being smaller than the circle.

View File

@@ -20,6 +20,12 @@ As new applications with specific features arise, Lucide aims to provide a compl
In addition to design, code is also important. Assets like icons can significantly increase bandwidth usage in web projects. With the growing internet, Lucide has a responsibility to keep their assets as small as possible. To achieve this, Lucide uses SVG compression and specific code architecture for tree-shaking abilities. After tree-shaking, you only ship the icons you used, which helps to keep software distribution size to a minimum. In addition to design, code is also important. Assets like icons can significantly increase bandwidth usage in web projects. With the growing internet, Lucide has a responsibility to keep their assets as small as possible. To achieve this, Lucide uses SVG compression and specific code architecture for tree-shaking abilities. After tree-shaking, you only ship the icons you used, which helps to keep software distribution size to a minimum.
## Accessibility
Icons are pictures that show what something means without using words. They can be very helpful because they can quickly give information.
However, not everyone can understand them easily. Read more about [how to use Lucide in an accessible way](./advanced/accessibility.md).
## Official Packages ## Official Packages
Lucide's official packages are designed to work on different platforms, making it easier for users to integrate icons into their projects. The packages are available for various technologies, including [Web (Vanilla)](https://lucide.dev/guide/packages/lucide), [React](https://lucide.dev/guide/packages/lucide-react), [React Native](https://lucide.dev/guide/packages/lucide-react-native), [Vue](https://lucide.dev/guide/packages/lucide-vue), [Vue 3](https://lucide.dev/guide/packages/lucide-vue-next), [Svelte](https://lucide.dev/guide/packages/lucide-svelte),[Preact](https://lucide.dev/guide/packages/lucide-preact), [Solid](https://lucide.dev/guide/packages/lucide-solid), [Angular](https://lucide.dev/guide/packages/lucide-angular), [NodeJS](https://lucide.dev/guide/packages/lucide-static#nodejs) and [Flutter](https://lucide.dev/guide/packages/lucide-flutter). Lucide's official packages are designed to work on different platforms, making it easier for users to integrate icons into their projects. The packages are available for various technologies, including [Web (Vanilla)](https://lucide.dev/guide/packages/lucide), [React](https://lucide.dev/guide/packages/lucide-react), [React Native](https://lucide.dev/guide/packages/lucide-react-native), [Vue](https://lucide.dev/guide/packages/lucide-vue), [Vue 3](https://lucide.dev/guide/packages/lucide-vue-next), [Svelte](https://lucide.dev/guide/packages/lucide-svelte),[Preact](https://lucide.dev/guide/packages/lucide-preact), [Solid](https://lucide.dev/guide/packages/lucide-solid), [Angular](https://lucide.dev/guide/packages/lucide-angular), [NodeJS](https://lucide.dev/guide/packages/lucide-static#nodejs) and [Flutter](https://lucide.dev/guide/packages/lucide-flutter).

View File

@@ -115,3 +115,20 @@ import { icons } from 'lucide-angular';
LucideAngularModule.pick(icons) LucideAngularModule.pick(icons)
``` ```
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used in the same way as the official icons.
```js
import { LucideAngularModule } from 'lucide-angular';
import { burger } from '@lucide/lab';
@NgModule({
imports: [
LucideAngularModule.pick({ burger })
]
})
export class AppModule { }
```

View File

@@ -67,6 +67,26 @@ const App = () => {
> SVG attributes in Preact aren't transformed, so if you want to change for example the `stroke-linejoin` you need to pass it in kebabcase. Basically how the SVG spec want you to write it. See this topic in the [Preact documentation](https://preactjs.com/guide/v10/differences-to-react/#svg-inside-jsx). > SVG attributes in Preact aren't transformed, so if you want to change for example the `stroke-linejoin` you need to pass it in kebabcase. Basically how the SVG spec want you to write it. See this topic in the [Preact documentation](https://preactjs.com/guide/v10/differences-to-react/#svg-inside-jsx).
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used by using the `Icon` component.
All props like regular lucide icons can be passed to adjust the icon appearance.
### Using the `Icon` component
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
```jsx
import { Icon } from 'lucide-preact';
import { burger } from '@lucide/lab';
const App = () => (
<Icon iconNode={burger} />
);
```
## One generic icon component ## One generic icon component
It is possible to create one generic icon component to load icons, but it is not recommended. It is possible to create one generic icon component to load icons, but it is not recommended.

View File

@@ -61,6 +61,26 @@ const App = () => {
}; };
``` ```
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used by using the `Icon` component.
All props like regular lucide icons can be passed to adjust the icon appearance.
### Using the `Icon` component
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
```jsx
import { Icon } from 'lucide-react-native';
import { burger } from '@lucide/lab';
const App = () => (
<Icon iconNode={burger} />
);
```
## One generic icon component ## One generic icon component
It is possible to create one generic icon component to load icons, but it is not recommended. It is possible to create one generic icon component to load icons, but it is not recommended.

View File

@@ -61,6 +61,26 @@ const App = () => {
}; };
``` ```
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used by using the `Icon` component.
All props like regular lucide icons can be passed to adjust the icon appearance.
### Using the `Icon` component
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
```jsx
import { Icon } from 'lucide-react';
import { burger } from '@lucide/lab';
const App = () => (
<Icon iconNode={burger} />
);
```
## One generic icon component ## One generic icon component
It is possible to create one generic icon component to load icons, but it is not recommended. It is possible to create one generic icon component to load icons, but it is not recommended.

View File

@@ -61,6 +61,26 @@ const App = () => {
}; };
``` ```
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used by using the `Icon` component.
All props like the regular Lucide icons can be passed to adjust the icon appearance.
### Using the `Icon` component
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
```jsx
import { Icon } from 'lucide-solid';
import { burger, sausage } from '@lucide/lab';
const App = () => (
<Icon iconNode={sausage} color="red"/>
);
```
## One generic icon component ## One generic icon component
It is possible to create one generic icon component to load icons. It's not recommended. It is possible to create one generic icon component to load icons. It's not recommended.

View File

@@ -143,7 +143,7 @@ and update the SVG as follows
### Icon Font ### Icon Font
```css ```css
@import ('~lucide-static/font/Lucide.css'); @import ('~lucide-static/font/lucide.css');
``` ```
```html ```html

View File

@@ -166,6 +166,27 @@ The package includes type definitions for all icons. This is useful if you want
For more details about typing the `svelte:component` directive, see the [Svelte documentation](https://svelte.dev/docs/typescript#types-componenttype). For more details about typing the `svelte:component` directive, see the [Svelte documentation](https://svelte.dev/docs/typescript#types-componenttype).
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used by using the `Icon` component.
All props like the regular Lucide icons can be passed to adjust the icon appearance.
### Using the `Icon` component
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
```svelte
<script>
import { Icon } from 'lucide-svelte';
import { burger, sausage } from '@lucide/lab';
</script>
<Icon iconNode={burger} />
<Icon iconNode={sausage} color="red"/>
```
## One generic icon component ## One generic icon component
It is possible to create one generic icon component to load icons, but it is not recommended. It is possible to create one generic icon component to load icons, but it is not recommended.

View File

@@ -37,16 +37,16 @@ Each icon can be imported as a Vue component, which renders an inline SVG Elemen
You can pass additional props to adjust the icon. You can pass additional props to adjust the icon.
```vue ```vue
<script setup>
import { Camera } from 'lucide-vue-next';
</script>
<template> <template>
<Camera <Camera
color="red" color="red"
:size="32" :size="32"
/> />
</template> </template>
<script setup>
import { Camera } from 'lucide-vue-next';
</script>
``` ```
## Props ## Props
@@ -69,6 +69,28 @@ To customize the appearance of an icon, you can pass custom properties as props
</template> </template>
``` ```
## With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used by using the `Icon` component.
All props like regular lucide icons can be passed to adjust the icon appearance.
### Using the `Icon` component
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
```vue
<script setup>
import { Icon } from 'lucide-vue-next';
import { burger } from '@lucide/lab';
</script>
<template>
<Icon :iconNode="burger" />
</template>
```
## One generic icon component ## One generic icon component
It is possible to create one generic icon component to load icons, but it is not recommended. It is possible to create one generic icon component to load icons, but it is not recommended.

View File

@@ -130,3 +130,18 @@ menuIcon.classList.add('my-icon-class');
const myApp = document.getElementById('app'); const myApp = document.getElementById('app');
myApp.appendChild(menuIcon); myApp.appendChild(menuIcon);
``` ```
### With Lucide lab or custom icons
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
They can be used in the same way as the official icons.
```js
import { burger } from '@lucide/lab';
createIcons({
icons: {
burger
}
});
```

View File

@@ -10,14 +10,14 @@ sidebar: true
<script setup> <script setup>
import { computed } from 'vue' import { computed } from 'vue'
import { useData } from 'vitepress' import { useData } from 'vitepress'
import IconPreview from '../.vitepress/theme/components/icons/IconPreview.vue' import IconPreview from '~/.vitepress/theme/components/icons/IconPreview.vue'
import IconPreviewSmall from '../.vitepress/theme/components/icons/IconPreviewSmall.vue' import IconPreviewSmall from '~/.vitepress/theme/components/icons/IconPreviewSmall.vue'
import IconInfo from '../.vitepress/theme/components/icons/IconInfo.vue' import IconInfo from '~/.vitepress/theme/components/icons/IconInfo.vue'
import IconContributors from '../.vitepress/theme/components/icons/IconContributors.vue' import IconContributors from '~/.vitepress/theme/components/icons/IconContributors.vue'
import RelatedIcons from '../.vitepress/theme/components/icons/RelatedIcons.vue' import RelatedIcons from '~/.vitepress/theme/components/icons/RelatedIcons.vue'
import CodeGroup from '../.vitepress/theme/components/base/CodeGroup.vue' import CodeGroup from '~/.vitepress/theme/components/base/CodeGroup.vue'
import Badge from '../.vitepress/theme/components/base/Badge.vue' import Badge from '~/.vitepress/theme/components/base/Badge.vue'
import Label from '../.vitepress/theme/components/base/Label.vue' import Label from '~/.vitepress/theme/components/base/Label.vue'
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue'; import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
import { data } from './codeExamples.data' import { data } from './codeExamples.data'
import { camelCase, startCase } from 'lodash-es' import { camelCase, startCase } from 'lodash-es'
@@ -31,8 +31,13 @@ const tabs = computed(() => data.codeExamples?.map(
const codeExample = computed(() => data.codeExamples?.map( const codeExample = computed(() => data.codeExamples?.map(
(codeExample) => { (codeExample) => {
const pascalCase = startCase(camelCase( params.value.name)).replace(/\s/g, '') const pascalCaseName = startCase(camelCase( params.value.name)).replace(/\s/g, '')
return codeExample.code.replace(/PascalCase/g, pascalCase).replace(/Name/g, params.value.name) const camelCaseName = camelCase(params.value.name)
return codeExample.code
.replace(/\$(?:<[^>]+>)*PascalCase/g, pascalCaseName)
.replace(/\$CamelCase/g, camelCaseName)
.replace(/\$Name/g, params.value.name)
} }
).join('') ?? [] ).join('') ?? []
) )
@@ -69,8 +74,6 @@ function releaseTagLink(version) {
<Label>Created:</Label> <Label>Created:</Label>
<Badge <Badge
:href="releaseTagLink(params.createdRelease.version)" :href="releaseTagLink(params.createdRelease.version)"
target="_blank"
rel="noreferrer noopener"
> >
v{{params.createdRelease.version}} v{{params.createdRelease.version}}
</Badge> </Badge>
@@ -82,8 +85,6 @@ function releaseTagLink(version) {
<Label>Last changed:</Label> <Label>Last changed:</Label>
<Badge <Badge
:href="releaseTagLink(params.changedRelease.version)" :href="releaseTagLink(params.changedRelease.version)"
target="_blank"
rel="noreferrer noopener"
> >
v{{params.changedRelease.version}} v{{params.changedRelease.version}}
</Badge> </Badge>
@@ -104,7 +105,10 @@ function releaseTagLink(version) {
</div> </div>
</div> </div>
<RelatedIcons :icons="params.relatedIcons" /> <RelatedIcons
v-if="params.relatedIcons"
:icons="params.relatedIcons"
/>
<style module> <style module>
.preview { .preview {

View File

@@ -10,13 +10,16 @@ import { data } from './icons.data.ts'
import { data as categoriesData } from './categories.data.ts' import { data as categoriesData } from './categories.data.ts'
import PageContainer from '../.vitepress/theme/components/PageContainer.vue' import PageContainer from '../.vitepress/theme/components/PageContainer.vue'
import IconsCategoryOverview from '../.vitepress/theme/components/icons/IconsCategoryOverview.vue' import IconsCategoryOverview from '../.vitepress/theme/components/icons/IconsCategoryOverview.vue'
import useIconsWithExternalLibs from '~/.vitepress/theme/composables/useIconsWithExternalLibs'
const icons = useIconsWithExternalLibs(data.icons)
</script> </script>
<div class="VPDoc content"> <div class="VPDoc content">
<PageContainer> <PageContainer>
<IconsCategoryOverview <IconsCategoryOverview
:categories="categoriesData.categories" :categories="categoriesData.categories"
:icons="data.icons" :icons="icons"
:iconCategories="categoriesData.iconCategories" :iconCategories="categoriesData.iconCategories"
/> />
</PageContainer> </PageContainer>

View File

@@ -1,11 +1,9 @@
import createCodeExamples from '../.vitepress/lib/createCodeExamples'; import createCodeExamples from '../.vitepress/lib/codeExamples/createCodeExamples';
export default { export default {
async load() { async load() {
const codeExamples = await createCodeExamples(); const codeExamples = await createCodeExamples();
// const randomIcons = Array.from({ length: 200 }, () => getRandomItem(icons))
return { return {
codeExamples, codeExamples,
}; };

View File

@@ -10,13 +10,17 @@ head:
--- ---
<script setup> <script setup>
import { computed } from 'vue'
import { data } from './icons.data.ts' import { data } from './icons.data.ts'
import IconsOverview from '../.vitepress/theme/components/icons/IconsOverview.vue' import IconsOverview from '~/.vitepress/theme/components/icons/IconsOverview.vue'
import PageContainer from '../.vitepress/theme/components/PageContainer.vue' import PageContainer from '~/.vitepress/theme/components/PageContainer.vue'
import useIconsWithExternalLibs from '~/.vitepress/theme/composables/useIconsWithExternalLibs'
const icons = useIconsWithExternalLibs(data.icons)
</script> </script>
<div class="VPDoc content"> <div class="VPDoc content">
<PageContainer> <PageContainer>
<IconsOverview :icons="data.icons" /> <IconsOverview :icons="icons" />
</PageContainer> </PageContainer>
</div> </div>

10
docs/icons/lab/[name].md Normal file
View File

@@ -0,0 +1,10 @@
---
layout: doc
footer: false
aside: false
editLink: false
next: false
prev: false
sidebar: true
---
<!--@include: ../[name].md -->

View File

@@ -0,0 +1,19 @@
import { IconEntity } from '../../.vitepress/theme/types';
export default {
paths: async () => {
const iconDetailsResponse = await fetch('https://lab.lucide.dev/api/icon-details');
const iconDetails = (await iconDetailsResponse.json()) as Record<string, IconEntity>;
return Object.values(iconDetails).map((iconEntity) => {
const params = {
externalLibrary: 'lab',
...iconEntity,
};
return {
params,
};
});
},
};

View File

@@ -0,0 +1,11 @@
import createCodeExamples from '../../.vitepress/lib/codeExamples/createLabCodeExamples';
export default {
async load() {
const codeExamples = await createCodeExamples();
return {
codeExamples,
};
},
};

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 101 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 244 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 209 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 118 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 239 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 76 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 142 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

View File

@@ -9,12 +9,13 @@
"docs:build": "pnpm run /^prebuild:.*/ && vitepress build", "docs:build": "pnpm run /^prebuild:.*/ && vitepress build",
"docs:preview": "vitepress preview", "docs:preview": "vitepress preview",
"build:docs": "vitepress build", "build:docs": "vitepress build",
"prebuild:iconNodes": "node ../scripts/writeIconNodes.mjs", "prebuild:iconNodes": "node ./scripts/writeIconNodes.mjs",
"prebuild:metaJson": "node ../scripts/writeIconMetaIndex.mjs", "prebuild:metaJson": "node ./scripts/writeIconMetaIndex.mjs",
"prebuild:releaseJson": "node ../scripts/writeReleaseMetadata.mjs", "prebuild:releaseJson": "node ./scripts/writeReleaseMetadata.mjs",
"prebuild:relatedIcons": "node ../scripts/writeIconRelatedIcons.mjs", "prebuild:categoriesJson": "node ./scripts/writeCategoriesMetadata.mjs",
"prebuild:iconDetails": "node ../scripts/writeIconDetails.mjs", "prebuild:relatedIcons": "node ./scripts/writeIconRelatedIcons.mjs",
"postbuild:vercelJson": "node ../scripts/writeVercelOutput.mjs", "prebuild:iconDetails": "node ./scripts/writeIconDetails.mjs",
"postbuild:vercelJson": "node ./scripts/writeVercelOutput.mjs",
"dev": "npx nitropack dev", "dev": "npx nitropack dev",
"prebuild:api": "npx nitropack prepare", "prebuild:api": "npx nitropack prepare",
"build:api": "npx nitropack build", "build:api": "npx nitropack build",
@@ -24,6 +25,9 @@
"author": "Eric Fennis", "author": "Eric Fennis",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@lucide/build-icons": "workspace:*",
"@lucide/helpers": "workspace:*",
"@lucide/shared": "workspace:*",
"@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-replace": "^5.0.2",
"@types/semver": "^7.5.3", "@types/semver": "^7.5.3",
"h3": "^1.8.0", "h3": "^1.8.0",
@@ -40,7 +44,6 @@
"@vueuse/core": "^10.7.2", "@vueuse/core": "^10.7.2",
"element-to-path": "^1.2.1", "element-to-path": "^1.2.1",
"fuse.js": "^6.5.3", "fuse.js": "^6.5.3",
"js-yaml": "^4.1.0",
"jszip": "^3.7.0", "jszip": "^3.7.0",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",

View File

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 79 22">
<path fill="#fff" d="M74.2 17.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V11.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
<path fill="#fff" d="M63.5 17.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V5.36h2.07V17h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
<path fill="#fff" d="M56.09 17V8.27h2.05V17H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
<path fill="#fff" d="M50.66 17.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
<path fill="#fff" d="M42.68 13.33V8.27h2.06V17h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.65 2.65 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V8.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
<path fill="#fff" d="M28.15 17V5.36h2.1v9.87h5.13V17h-7.23Z"/>
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,9 +1,10 @@
<svg width="98" height="32" viewBox="0 0 98 32" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 79 22">
<rect width="98" height="32" rx="5" fill="white"/> <path fill="#1B1B1F" d="M74.2 17.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V11.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
<svg height="24" width="82" y="4" x="8" viewBox="0 0 82 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill="#1B1B1F" d="M63.5 17.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V5.36h2.07V17h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
<path d="M28.52 5.4h2.14v10.84h5.28V18h-7.42V5.4zm15.24 3.16h2.06V18h-1.58l-.26-1.14h-.08a5.26 5.26 0 01-1.26.94c-.507.267-1.12.4-1.84.4-1 0-1.8-.28-2.4-.84-.6-.56-.9-1.4-.9-2.52V8.56h2.06v6.06c0 .733.166 1.247.5 1.54.346.293.76.44 1.24.44.52 0 .98-.107 1.38-.32.4-.227.76-.52 1.08-.88V8.56zm9.297 8.08c.427 0 .8-.047 1.12-.14.334-.107.633-.227.9-.36l.42 1.48a4.7 4.7 0 01-1.16.42 6.55 6.55 0 01-1.5.16c-.693 0-1.347-.1-1.96-.3a4.782 4.782 0 01-1.58-.92 4.593 4.593 0 01-1.06-1.54c-.253-.613-.38-1.327-.38-2.14 0-.747.12-1.42.36-2.02.24-.613.58-1.133 1.02-1.56.44-.427.967-.753 1.58-.98a5.786 5.786 0 012.02-.34c.413 0 .827.033 1.24.1.427.067.894.22 1.4.46l-.46 1.5a3.995 3.995 0 00-1.96-.52c-.92 0-1.666.287-2.24.86-.573.573-.86 1.387-.86 2.44 0 .64.087 1.18.26 1.62.187.427.427.773.72 1.04.294.267.62.46.98.58.373.107.753.16 1.14.16zM57.211 18V8.56h2.06V18h-2.06zm1.04-11.78c-.36 0-.646-.107-.86-.32a1.18 1.18 0 01-.32-.84c0-.333.107-.607.32-.82.214-.227.5-.34.86-.34.347 0 .627.113.84.34.227.213.34.487.34.82 0 .347-.113.627-.34.84-.213.213-.493.32-.84.32zM68.33 3.78h2.06V18h-1.62l-.24-1.04h-.08c-.347.4-.734.707-1.16.92-.427.213-.98.32-1.66.32-.534 0-1.047-.1-1.54-.3a3.997 3.997 0 01-1.3-.94c-.374-.413-.674-.927-.9-1.54-.227-.613-.34-1.32-.34-2.12 0-.747.093-1.42.28-2.02.2-.6.48-1.113.84-1.54a3.71 3.71 0 011.36-.98c.533-.24 1.14-.36 1.82-.36.466 0 .92.073 1.36.22.44.147.813.353 1.12.62V3.78zm0 7.12c-.56-.64-1.234-.96-2.02-.96-.347 0-.68.06-1 .18-.32.12-.607.313-.86.58a2.834 2.834 0 00-.6 1.02c-.147.413-.22.92-.22 1.52s.066 1.113.2 1.54c.146.427.333.78.56 1.06.226.28.486.487.78.62.306.12.62.18.94.18.48 0 .9-.107 1.26-.32a2.93 2.93 0 00.96-.9V10.9zm12.858 2.74h-6.62v.08c0 .96.28 1.687.84 2.18.56.493 1.3.74 2.22.74.507 0 .96-.04 1.36-.12a6.47 6.47 0 001.24-.42l.4 1.5a6.51 6.51 0 01-1.38.42c-.533.12-1.12.18-1.76.18-.68 0-1.327-.093-1.94-.28a4.449 4.449 0 01-1.62-.88 4.253 4.253 0 01-1.08-1.52c-.267-.613-.4-1.347-.4-2.2 0-.733.107-1.4.32-2a4.56 4.56 0 01.94-1.56c.413-.44.907-.773 1.48-1a5.077 5.077 0 011.94-.36c.613 0 1.167.1 1.66.3.507.2.933.487 1.28.86.36.36.633.807.82 1.34.2.52.3 1.1.3 1.74v1zm-2.12-1.44c0-.32-.04-.62-.12-.9-.08-.28-.2-.52-.36-.72a1.605 1.605 0 00-.64-.5c-.253-.133-.56-.2-.92-.2-.667 0-1.213.213-1.64.64-.413.427-.667 1-.76 1.72l4.44-.04z" fill="#2D3748"/> <path fill="#1B1B1F" d="M56.09 17V8.27h2.05V17H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
<path d="M14 12a4 4 0 00-8 0 8 8 0 1016 0 11.97 11.97 0 00-4-8.944" stroke="#2D3748" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path fill="#1B1B1F" d="M50.66 17.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
<path d="M10 12a4 4 0 008 0 8 8 0 10-16 0c0 3.584 1.571 6.801 4.063 9" stroke="#F56565" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path fill="#1B1B1F" d="M42.68 13.33V8.27h2.06V17h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.65 2.65 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V8.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
</svg> <path fill="#1B1B1F" d="M28.15 17V5.36h2.1v9.87h5.13V17h-7.23Z"/>
<path stroke="#1B1B1F" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 118 22">
<path fill="#fff" d="M74.202 17.17c-.875 0-1.63-.181-2.267-.545a3.694 3.694 0 0 1-1.46-1.557c-.341-.674-.512-1.468-.512-2.38 0-.898.17-1.686.512-2.364a3.867 3.867 0 0 1 1.443-1.591c.617-.383 1.342-.574 2.176-.574.538 0 1.045.087 1.523.261.48.17.905.436 1.272.796.371.36.663.818.875 1.375.212.553.319 1.212.319 1.977v.63h-7.154v-1.386h5.182a2.213 2.213 0 0 0-.256-1.05c-.166-.311-.4-.556-.699-.734a1.964 1.964 0 0 0-1.034-.267c-.42 0-.79.103-1.108.307-.318.2-.566.466-.744.796a2.289 2.289 0 0 0-.267 1.073v1.21c0 .508.093.944.278 1.307.186.36.445.637.779.83.333.19.723.284 1.17.284.3 0 .57-.041.813-.125.242-.087.452-.214.63-.38.178-.167.313-.374.404-.62l1.92.216c-.121.508-.352.95-.693 1.33a3.379 3.379 0 0 1-1.295.875c-.527.204-1.13.306-1.807.306Z"/>
<path fill="#fff" d="M63.498 17.153c-.685 0-1.299-.176-1.84-.528-.542-.352-.97-.864-1.285-1.534-.314-.67-.471-1.485-.471-2.443 0-.97.159-1.788.477-2.455.322-.67.756-1.176 1.301-1.517a3.344 3.344 0 0 1 1.824-.517c.512 0 .932.087 1.262.261.329.17.59.377.784.62.193.238.342.464.448.676h.086V5.364h2.062V17h-2.023v-1.375h-.125c-.106.212-.259.438-.46.676a2.53 2.53 0 0 1-.795.602c-.33.167-.745.25-1.245.25Zm.574-1.687c.436 0 .807-.117 1.114-.352.307-.239.54-.57.699-.995.159-.424.238-.918.238-1.483 0-.564-.08-1.055-.238-1.471-.156-.417-.387-.74-.693-.972-.303-.23-.676-.346-1.12-.346-.458 0-.84.119-1.147.358-.307.238-.538.568-.694.988-.155.42-.233.902-.233 1.443 0 .546.078 1.033.233 1.46.16.425.392.76.7 1.006.31.243.69.364 1.141.364Z"/>
<path fill="#fff" d="M56.088 17V8.273h2.057V17h-2.057Zm1.034-9.966a1.2 1.2 0 0 1-.84-.324 1.044 1.044 0 0 1-.353-.79c0-.31.117-.573.352-.79.235-.219.515-.329.841-.329.33 0 .61.11.841.33.235.216.352.479.352.79 0 .306-.117.57-.352.79a1.187 1.187 0 0 1-.84.323Z"/>
<path fill="#fff" d="M50.66 17.17c-.87 0-1.619-.19-2.244-.573a3.831 3.831 0 0 1-1.437-1.586c-.334-.678-.5-1.458-.5-2.34 0-.887.17-1.67.511-2.347a3.817 3.817 0 0 1 1.443-1.591c.625-.383 1.364-.574 2.216-.574.709 0 1.335.13 1.88.392.55.258.988.623 1.313 1.097.326.47.512 1.019.557 1.647h-1.966c-.08-.42-.269-.77-.568-1.05-.295-.285-.691-.427-1.187-.427-.42 0-.79.114-1.108.341-.319.223-.567.545-.745.966-.174.42-.261.924-.261 1.511 0 .595.087 1.106.261 1.534.175.425.419.752.733.983.319.228.692.341 1.12.341.303 0 .574-.056.812-.17.242-.118.445-.286.608-.506a1.94 1.94 0 0 0 .335-.801H54.4a3.427 3.427 0 0 1-.545 1.642 3.23 3.23 0 0 1-1.284 1.114c-.542.265-1.178.397-1.91.397Z"/>
<path fill="#fff" d="M42.682 13.33V8.272h2.057V17h-1.995v-1.551h-.09c-.198.489-.521.888-.972 1.199-.447.31-.998.466-1.654.466-.572 0-1.077-.127-1.517-.381a2.645 2.645 0 0 1-1.022-1.12c-.246-.492-.37-1.086-.37-1.784V8.273h2.057v5.238c0 .553.152.993.455 1.319.303.325.7.488 1.193.488.303 0 .596-.074.88-.221.285-.148.518-.368.7-.66.185-.295.278-.664.278-1.107Z"/>
<path fill="#fff" d="M28.148 17V5.364h2.108v9.869h5.125V17h-7.233Z"/>
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0 11.97 11.97 0 0 0-4-8.944"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.584 1.571 6.801 4.063 9"/>
<circle cx="88" cy="11" r="2" fill="#737374"/>
<path fill="url(#a)" d="m117.917 4.466-.719 11.135L110.322 1l7.595 3.466Zm-4.762 14.399-5.196 2.922-5.196-2.922 1.057-2.526h8.278l1.056 2.526h.001Zm-5.197-12.322 2.723 6.526h-5.445l2.723-6.526h-.001Zm-9.246 9.059L98 4.466 105.596 1l-6.884 14.602Z"/>
<path fill="url(#b)" d="m117.917 4.466-.719 11.135L110.322 1l7.595 3.466Zm-4.762 14.399-5.196 2.922-5.196-2.922 1.057-2.526h8.278l1.056 2.526h.001Zm-5.197-12.322 2.723 6.526h-5.445l2.723-6.526h-.001Zm-9.246 9.059L98 4.466 105.596 1l-6.884 14.602Z"/>
<defs>
<linearGradient id="a" x1="102.396" x2="118.171" y1="19.902" y2="12.299" gradientUnits="userSpaceOnUse">
<stop stop-color="#E40035"/>
<stop offset=".24" stop-color="#F60A48"/>
<stop offset=".35" stop-color="#F20755"/>
<stop offset=".49" stop-color="#DC087D"/>
<stop offset=".74" stop-color="#9717E7"/>
<stop offset="1" stop-color="#6C00F5"/>
</linearGradient>
<linearGradient id="b" x1="101.679" x2="111.892" y1="3.506" y2="15.322" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF31D9"/>
<stop offset="1" stop-color="#FF5BE1" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 118 24">
<path fill="#fff" d="M74.202 18.17c-.875 0-1.63-.181-2.267-.545a3.694 3.694 0 0 1-1.46-1.557c-.341-.674-.512-1.468-.512-2.38 0-.898.17-1.686.512-2.364a3.867 3.867 0 0 1 1.443-1.591c.617-.383 1.342-.574 2.176-.574.538 0 1.045.087 1.523.261.48.17.905.436 1.272.796.371.36.663.818.875 1.375.212.553.319 1.212.319 1.977v.63h-7.154v-1.386h5.182a2.213 2.213 0 0 0-.256-1.05c-.166-.311-.4-.556-.699-.734a1.964 1.964 0 0 0-1.034-.267c-.42 0-.79.103-1.108.307-.318.2-.566.466-.744.796a2.289 2.289 0 0 0-.267 1.073v1.21c0 .508.093.944.278 1.307.186.36.445.637.779.83.333.19.723.284 1.17.284.3 0 .57-.042.813-.125.242-.087.452-.214.63-.38.178-.167.313-.374.404-.62l1.92.216c-.121.508-.352.95-.693 1.33a3.379 3.379 0 0 1-1.295.875c-.527.204-1.13.306-1.807.306Z"/>
<path fill="#fff" d="M63.498 18.153c-.685 0-1.299-.176-1.84-.528-.542-.352-.97-.864-1.285-1.534-.314-.67-.471-1.485-.471-2.443 0-.97.159-1.788.477-2.455.322-.67.756-1.176 1.301-1.517a3.344 3.344 0 0 1 1.824-.517c.512 0 .932.087 1.262.261.329.17.59.377.784.62.193.238.342.464.448.676h.086V6.364h2.062V18h-2.023v-1.375h-.125c-.106.212-.259.438-.46.676a2.53 2.53 0 0 1-.795.602c-.33.167-.745.25-1.245.25Zm.574-1.687c.436 0 .807-.117 1.114-.352.307-.239.54-.57.699-.995.159-.424.238-.918.238-1.483 0-.564-.08-1.055-.238-1.471-.156-.417-.387-.74-.693-.972-.303-.23-.676-.346-1.12-.346-.458 0-.84.119-1.147.358-.307.238-.538.568-.694.988-.155.42-.233.902-.233 1.443 0 .546.078 1.033.233 1.46.16.425.392.76.7 1.006.31.243.69.364 1.141.364Z"/>
<path fill="#fff" d="M56.088 18V9.273h2.057V18h-2.057Zm1.034-9.966a1.2 1.2 0 0 1-.84-.324 1.044 1.044 0 0 1-.353-.79c0-.31.117-.573.352-.79.235-.219.515-.329.841-.329.33 0 .61.11.841.33.235.216.352.479.352.79 0 .306-.117.57-.352.79a1.187 1.187 0 0 1-.84.323Z"/>
<path fill="#fff" d="M50.66 18.17c-.87 0-1.619-.19-2.244-.573a3.831 3.831 0 0 1-1.437-1.586c-.334-.678-.5-1.458-.5-2.34 0-.887.17-1.67.511-2.347a3.817 3.817 0 0 1 1.443-1.591c.625-.383 1.364-.574 2.216-.574.709 0 1.335.13 1.88.392.55.258.988.623 1.313 1.097.326.47.512 1.019.557 1.647h-1.966c-.08-.42-.269-.77-.568-1.05-.295-.285-.691-.427-1.187-.427-.42 0-.79.114-1.108.341-.319.223-.567.545-.745.966-.174.42-.261.924-.261 1.511 0 .595.087 1.106.261 1.534.175.425.419.752.733.983.319.228.692.341 1.12.341.303 0 .574-.056.812-.17.242-.118.445-.286.608-.506a1.94 1.94 0 0 0 .335-.801H54.4a3.427 3.427 0 0 1-.545 1.642 3.23 3.23 0 0 1-1.284 1.114c-.542.265-1.178.397-1.91.397Z"/>
<path fill="#fff" d="M42.682 14.33V9.272h2.057V18h-1.995v-1.551h-.09c-.198.488-.521.888-.972 1.199-.447.31-.998.466-1.654.466-.572 0-1.077-.127-1.517-.381a2.645 2.645 0 0 1-1.022-1.12c-.246-.492-.37-1.086-.37-1.784V9.273h2.057v5.238c0 .553.152.993.455 1.319.303.325.7.488 1.193.488.303 0 .596-.074.88-.221.285-.148.518-.368.7-.66.185-.295.278-.664.278-1.107Z"/>
<path fill="#fff" d="M28.148 18V6.364h2.108v9.869h5.125V18h-7.233Z"/>
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 12a4 4 0 0 0-8 0 8 8 0 0 0 16 0 11.97 11.97 0 0 0-4-8.944"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 12a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.584 1.571 6.801 4.063 9"/>
<circle cx="88" cy="12" r="2" fill="#737374"/>
<path fill="#673AB8" d="m108 0 10 5.773V17.32l-10 5.774-10-5.774V5.773L108 0Z"/>
<path fill="#fff" d="M100.724 17.225c1.329 1.701 5.554.405 9.543-2.711 3.988-3.117 6.269-6.902 4.939-8.604-1.329-1.702-5.554-.405-9.543 2.711-3.988 3.117-6.269 6.902-4.939 8.604Zm.568-.444c-.441-.564-.249-1.672.591-3.067.885-1.468 2.386-3.09 4.224-4.525 1.837-1.435 3.774-2.5 5.412-3.003 1.557-.478 2.678-.397 3.119.168.441.564.248 1.672-.591 3.066-.885 1.469-2.386 3.09-4.224 4.526-1.837 1.435-3.774 2.5-5.412 3.003-1.557.478-2.678.396-3.119-.168Z"/>
<path fill="#fff" d="M115.206 17.225c1.33-1.702-.951-5.487-4.939-8.604-3.989-3.116-8.214-4.413-9.543-2.711-1.33 1.702.951 5.487 4.939 8.604 3.989 3.116 8.214 4.413 9.543 2.71Zm-.568-.444c-.441.565-1.562.646-3.119.168-1.638-.503-3.575-1.568-5.412-3.003-1.838-1.436-3.339-3.057-4.224-4.526-.84-1.394-1.032-2.502-.591-3.066.441-.565 1.562-.646 3.119-.168 1.638.503 3.575 1.568 5.412 3.003 1.838 1.436 3.339 3.057 4.224 4.525.839 1.395 1.032 2.503.591 3.067Z"/>
<path fill="#fff" d="M107.965 13.099a1.531 1.531 0 1 0 0-3.062 1.531 1.531 0 0 0 0 3.062Z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 119 26">
<g clip-path="url(#a)">
<path fill="#fff" d="M74.2 19.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V13.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
<path fill="#fff" d="M63.5 19.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V7.36h2.07V19h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
<path fill="#fff" d="M56.09 19v-8.73h2.05V19H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
<path fill="#fff" d="M50.66 19.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
<path fill="#fff" d="M42.68 15.33v-5.06h2.06V19h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.64 2.64 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78v-5.56h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
<path fill="#fff" d="M28.15 19V7.36h2.1v9.87h5.13V19h-7.23Z"/>
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 13a4 4 0 1 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 13a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
</g>
<path fill="#54C1DE" d="m112.75 6.34-.63-.2.1-.42c.47-2.3.17-4.14-.89-4.75-1.01-.58-2.67.02-4.34 1.48l-.48.44-.32-.3c-1.75-1.55-3.51-2.2-4.56-1.6-1.02.6-1.31 2.33-.89 4.5l.14.65c-.25.07-.49.15-.71.23-2.06.71-3.37 1.84-3.37 3 0 1.2 1.4 2.4 3.55 3.14l.52.16c-.06.23-.1.46-.15.7-.4 2.13-.09 3.83.92 4.41 1.04.6 2.79-.02 4.5-1.5l.4-.38c.17.17.34.33.52.48 1.65 1.42 3.28 2 4.28 1.41 1.05-.6 1.38-2.42.94-4.64l-.11-.52.36-.11c2.22-.75 3.67-1.94 3.67-3.16 0-1.17-1.35-2.3-3.45-3.02Zm-5.21-3.27c1.43-1.25 2.77-1.73 3.37-1.38.65.37.9 1.88.5 3.86a12 12 0 0 1-.09.39c-.85-.2-1.72-.33-2.59-.41-.5-.72-1.05-1.4-1.64-2.05l.45-.4Zm-5.01 7.29c.36.68.74 1.35 1.16 2-.6-.07-1.2-.17-1.79-.3.18-.57.4-1.14.63-1.7Zm0-1.95c-.23-.55-.44-1.11-.62-1.68.56-.13 1.15-.23 1.76-.3-.41.64-.8 1.3-1.14 1.98Zm.44.97c.51-1.06 1.1-2.09 1.77-3.06 1.17-.1 2.35-.1 3.53 0 .66.97 1.25 2 1.77 3.05a26.12 26.12 0 0 1-1.76 3.07c-1.18.09-2.36.09-3.53.01-.67-.98-1.26-2-1.78-3.07Zm6.95 1.97c.2-.33.39-.68.57-1.02.25.55.46 1.12.65 1.7-.6.14-1.2.24-1.81.31l.6-.99Zm.56-2.94a29.97 29.97 0 0 0-1.15-1.98c.62.08 1.21.18 1.77.3-.18.58-.38 1.13-.62 1.68Zm-3.97-4.33c.4.43.78.9 1.14 1.37-.76-.03-1.53-.03-2.3 0 .37-.47.76-.93 1.16-1.37Zm-4.47-2.37c.65-.37 2.08.16 3.6 1.5l.29.27c-.6.64-1.15 1.33-1.65 2.05-.87.08-1.74.21-2.6.4l-.13-.6c-.36-1.86-.12-3.27.5-3.62Zm-.94 10.16-.48-.15a7.1 7.1 0 0 1-2.27-1.2c-.47-.42-.72-.83-.72-1.16 0-.7 1.05-1.61 2.8-2.22.23-.08.45-.15.68-.2.26.83.57 1.65.94 2.44-.37.8-.69 1.64-.95 2.49Zm4.49 3.77a6.9 6.9 0 0 1-2.17 1.36c-.6.21-1.08.22-1.36.05-.62-.35-.87-1.71-.53-3.54l.15-.64c.86.18 1.73.3 2.61.37.51.72 1.07 1.41 1.67 2.06l-.37.34Zm.94-.93c-.4-.45-.8-.92-1.17-1.4.77.03 1.54.03 2.31 0-.35.48-.73.95-1.14 1.4Zm5.03 1.15c-.11.63-.34 1.04-.63 1.2-.61.36-1.92-.1-3.33-1.31a9.83 9.83 0 0 1-.49-.45c.6-.65 1.13-1.34 1.63-2.07.88-.07 1.76-.2 2.62-.4a6.93 6.93 0 0 1 .2 3.03Zm.7-4.14-.32.1c-.27-.84-.6-1.66-.98-2.45.37-.79.69-1.6.95-2.43l.57.19c1.8.62 2.9 1.53 2.9 2.23 0 .75-1.2 1.73-3.11 2.36Z"/>
<path fill="#54C1DE" d="M106.5 11.1a1.73 1.73 0 1 0 0-3.47 1.73 1.73 0 0 0 0 3.47Z"/>
<path fill="#54C1DE" d="M100.25 19.75v4.62h-.71l-2.56-3.13v3.14h-.86v-4.63h.71l2.56 3.13v-3.13h.86Z"/>
<path fill="#54C1DE" d="M104.38 22.25v2.08h-.8v-.43c-.2.3-.58.48-1.12.48-.82 0-1.33-.46-1.33-1.07 0-.6.4-1.05 1.48-1.05h.92v-.05c0-.49-.3-.77-.89-.77-.39 0-.77.12-1.08.35l-.33-.6c.45-.3.98-.46 1.52-.44 1.03 0 1.63.48 1.63 1.5Zm-.84.97v-.41h-.87c-.56 0-.72.21-.72.47 0 .3.26.49.7.49a.91.91 0 0 0 .89-.55Z"/>
<path fill="#54C1DE" d="M107.5 24.15c-.24.16-.52.24-.8.22-.79 0-1.24-.4-1.24-1.2v-1.7h-.58v-.66h.58V20h.84v.81h.95v.66h-.95v1.69c0 .34.17.53.5.53.16 0 .32-.05.45-.14l.25.6Z"/>
<path fill="#54C1DE" d="M108 19.75a.5.5 0 0 1 .17-.36.53.53 0 0 1 .4-.14c.14 0 .28.04.38.13a.48.48 0 0 1 .17.35c0 .14-.06.26-.17.36a.58.58 0 0 1-.77.01.52.52 0 0 1-.18-.35Zm.12 1.08h.88v3.55h-.88v-3.55Z"/>
<path fill="#54C1DE" d="m113.38 20.88-1.52 3.5h-.85l-1.51-3.5h.86l1.1 2.59 1.13-2.6h.78Z"/>
<path fill="#54C1DE" d="M117 22.82h-2.69c.1.52.51.85 1.1.85a1.2 1.2 0 0 0 .93-.38l.43.5a1.73 1.73 0 0 1-1.38.58c-1.14 0-1.89-.76-1.89-1.81a1.8 1.8 0 0 1 .5-1.3 1.67 1.67 0 0 1 1.26-.51c1 0 1.73.72 1.73 1.82v.25Zm-2.7-.54h1.95a.97.97 0 0 0-.32-.63.92.92 0 0 0-.65-.23.93.93 0 0 0-.65.23.99.99 0 0 0-.32.63Z"/>
<circle cx="88" cy="13" r="2" fill="#737374"/>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 2h82v22H0z"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 119 22">
<path fill="#61DAFB" d="M107.5 13.28a2.05 2.05 0 1 0 0-4.1 2.05 2.05 0 0 0 0 4.1Z"/>
<path stroke="#61DAFB" d="M107.5 15.43c6.08 0 11-1.88 11-4.2 0-2.32-4.92-4.2-11-4.2s-11 1.88-11 4.2c0 2.32 4.92 4.2 11 4.2Z"/>
<path stroke="#61DAFB" d="M103.86 13.33c3.04 5.26 7.13 8.59 9.14 7.43 2-1.16 1.17-6.37-1.86-11.63C108.1 3.87 104 .55 102 1.71c-2 1.16-1.17 6.36 1.86 11.62Z"/>
<path stroke="#61DAFB" d="M103.86 9.13C100.83 14.4 100 19.6 102 20.76c2 1.16 6.1-2.17 9.14-7.43C114.17 8.07 115 2.87 113 1.71c-2-1.16-6.1 2.16-9.14 7.42Z"/>
<path fill="#fff" d="M74.2 17.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V11.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
<path fill="#fff" d="M63.5 17.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V5.36h2.07V17h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
<path fill="#fff" d="M56.09 17V8.27h2.05V17H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
<path fill="#fff" d="M50.66 17.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
<path fill="#fff" d="M42.68 13.33V8.27h2.06V17h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.64 2.64 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V8.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
<path fill="#fff" d="M28.15 17V5.36h2.1v9.87h5.13V17h-7.23Z"/>
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
<circle cx="88" cy="11" r="2" fill="#737374"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,39 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 120 23">
<path fill="#76B3E1" d="M119.14 5.18S111.29-.59 105.22.74l-.44.15c-.9.3-1.63.74-2.08 1.33l-.3.45-2.22 3.85 3.85.74a7.51 7.51 0 0 0 5.63 1.03l6.81 1.34 2.67-4.45Z"/>
<path fill="url(#a)" d="M119.14 5.18S111.29-.59 105.22.74l-.44.15c-.9.3-1.63.74-2.08 1.33l-.3.45-2.22 3.85 3.85.74a7.51 7.51 0 0 0 5.63 1.03l6.81 1.34 2.67-4.45Z" opacity=".3"/>
<path fill="#518AC8" d="m102.7 5.18-.6.15c-2.5.74-3.25 3.11-1.92 5.19a7.01 7.01 0 0 0 7.11 2.22l9.18-3.11s-7.84-5.78-13.77-4.45Z"/>
<path fill="url(#b)" d="m102.7 5.18-.6.15c-2.5.74-3.25 3.11-1.92 5.19a7.01 7.01 0 0 0 7.11 2.22l9.18-3.11s-7.84-5.78-13.77-4.45Z" opacity=".3"/>
<path fill="url(#c)" d="M114.84 11.85a6.66 6.66 0 0 0-7.1-2.22l-9.19 2.96-2.96 5.18 16.59 2.82 2.96-5.34c.6-1.03.45-2.22-.3-3.4Z"/>
<path fill="url(#d)" d="M111.88 17.03a6.66 6.66 0 0 0-7.1-2.22l-9.19 2.96s7.85 5.93 13.92 4.45l.45-.15c2.52-.74 3.4-3.11 1.92-5.04Z"/>
<path fill="#fff" d="M74.2 18.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V12.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
<path fill="#fff" d="M63.5 18.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V6.36h2.07V18h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
<path fill="#fff" d="M56.09 18V9.27h2.05V18H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
<path fill="#fff" d="M50.66 18.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
<path fill="#fff" d="M42.68 14.33V9.27h2.06V18h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.64 2.64 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V9.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
<path fill="#fff" d="M28.15 18V6.36h2.1v9.87h5.13V18h-7.23Z"/>
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 12a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 12a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
<circle cx="88" cy="12" r="2" fill="#737374"/>
<defs>
<linearGradient id="a" x1="99.07" x2="117.51" y1=".44" y2="9.4" gradientUnits="userSpaceOnUse">
<stop offset=".1" stop-color="#76B3E1"/>
<stop offset=".3" stop-color="#DCF2FD"/>
<stop offset="1" stop-color="#76B3E1"/>
</linearGradient>
<linearGradient id="b" x1="109.19" x2="105.96" y1="4.83" y2="15.58" gradientUnits="userSpaceOnUse">
<stop stop-color="#76B3E1"/>
<stop offset=".5" stop-color="#4377BB"/>
<stop offset="1" stop-color="#1F3B77"/>
</linearGradient>
<linearGradient id="c" x1="97.72" x2="116.37" y1="9.51" y2="22.19" gradientUnits="userSpaceOnUse">
<stop stop-color="#315AA9"/>
<stop offset=".5" stop-color="#518AC8"/>
<stop offset="1" stop-color="#315AA9"/>
</linearGradient>
<linearGradient id="d" x1="106.14" x2="98.61" y1="11.03" y2="38.62" gradientUnits="userSpaceOnUse">
<stop stop-color="#4377BB"/>
<stop offset=".5" stop-color="#1A336B"/>
<stop offset="1" stop-color="#1A336B"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

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