Compare commits

...

30 Commits

Author SHA1 Message Date
Dashboard Icons Manager
83bd958f0e feat(icons): add opencode 2025-09-06 18:31:52 +00:00
dashboard-icons-manager[bot]
ab5ae686d9 feat(icons): add aboard (#1965)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 20:29:16 +02:00
dashboard-icons-manager[bot]
55374bb209 feat(icons): add convertx (#1966)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 20:23:21 +02:00
dashboard-icons-manager[bot]
2275dd5cab feat(icons): add teamtailor (#1964)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 20:14:13 +02:00
dashboard-icons-manager[bot]
ad5db399f0 feat(icons): add topdesk (#1963)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 20:11:10 +02:00
dashboard-icons-manager[bot]
7e551d30ed feat(icons): add drop (#1962)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 20:02:54 +02:00
dashboard-icons-manager[bot]
b85f50f50c feat(icons): add golink (#1960)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 19:51:11 +02:00
dashboard-icons-manager[bot]
b32a69db2b feat(icons): add wevr-labs (#1959)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 19:48:49 +02:00
dashboard-icons-manager[bot]
5bd0fb5942 feat(icons): add lexmark (#1958)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 19:46:25 +02:00
dashboard-icons-manager[bot]
683151c5a9 feat(icons): add issabel-pbx-wordmark (#1957)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2025-09-06 19:43:38 +02:00
dashboard-icons-manager[bot]
5a252076c8 feat(icons): add issabel-pbx (#1954)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-06 19:36:46 +02:00
homarr-renovate[bot]
4308eed3e6 fix(deps): update dependency posthog-js to ^1.261.0 (#1900)
Some checks failed
Trigger Cloudflare Pages Build / cron_job (push) Has been cancelled
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-09-05 07:20:28 +00:00
Thomas Camlong
f3582ffc38 Merge pull request #1906 from homarr-labs/renovate/posthog-node-5.x 2025-09-05 07:22:49 +02:00
Thomas Camlong
c5b921186a Merge pull request #1928 from homarr-labs/renovate/zod-4.x 2025-09-05 07:21:58 +02:00
Thomas Camlong
ad0701df9b Merge pull request #1931 from homarr-labs/icons/add-pinepods 2025-09-05 07:21:27 +02:00
Thomas Camlong
9ea0f54eb8 Merge pull request #1932 from homarr-labs/icons/add-control-d 2025-09-05 07:20:54 +02:00
Thomas Camlong
b05aa32128 Merge pull request #1410 from homarr-labs/feat/wordmark 2025-09-05 07:20:06 +02:00
dashboard-icons-manager[bot]
c7e1237f61 feat(icons): add primal (#1940)
Some checks failed
Trigger Cloudflare Pages Build / cron_job (push) Has been cancelled
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 20:26:44 +02:00
dashboard-icons-manager[bot]
f96bedb16b feat(icons): add linear (#1939)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 20:21:20 +02:00
dashboard-icons-manager[bot]
3d32639a93 feat(icons): add zomro (#1937)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 20:19:43 +02:00
dashboard-icons-manager[bot]
304812df02 feat(icons): add wirenboard (#1938)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 20:15:29 +02:00
dashboard-icons-manager[bot]
d8e4d61498 feat(icons): add chatbetter (#1936)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 20:07:52 +02:00
dashboard-icons-manager[bot]
c35ea11fe8 feat(icons): add mympd (#1935)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 19:55:45 +02:00
dashboard-icons-manager[bot]
54431dff8f feat(icons): add livebook (#1934)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 19:24:09 +02:00
dashboard-icons-manager[bot]
1eee629981 feat(icons): add garmin-connect (#1933)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-09-04 19:21:44 +02:00
Dashboard Icons Manager
07d48cd01a feat(icons): add pinepods 2025-09-04 09:32:25 +00:00
homarr-renovate[bot]
5e42738c55 fix(deps): update dependency zod to v4 2025-09-03 21:21:54 +00:00
homarr-renovate[bot]
c33dbc5772 fix(deps): update dependency posthog-node to v5 2025-09-03 21:21:19 +00:00
Thomas Camlong
5942dd6234 Merge branch 'main' into feat/wordmark
Signed-off-by: Thomas Camlong <thomas@ajnart.fr>
2025-05-19 15:14:24 +02:00
ajnart
beab14f535 feat: add workmark icons 2025-05-08 23:55:25 +02:00
103 changed files with 1353 additions and 328 deletions

14
meta/aboard.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [
"aboardhr"
],
"categories": [],
"update": {
"timestamp": "2025-09-06T18:26:21.574041",
"author": {
"id": 412615,
"login": "johanekhager"
}
}
}

16
meta/chatbetter.json Normal file
View File

@@ -0,0 +1,16 @@
{
"base": "png",
"aliases": [
"unsupervised"
],
"categories": [
"Organization"
],
"update": {
"timestamp": "2025-09-04T18:03:24.249994",
"author": {
"id": 50716,
"login": "tylerwillis"
}
}
}

14
meta/convertx.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "png",
"aliases": [],
"categories": [
"File"
],
"update": {
"timestamp": "2025-09-06T18:21:09.942796",
"author": {
"id": 12634286,
"login": "bitkris-dev"
}
}
}

14
meta/drop.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Media"
],
"update": {
"timestamp": "2025-09-06T18:00:59.580587",
"author": {
"id": 1866197,
"login": "orstendium"
}
}
}

18
meta/garmin-connect.json Normal file
View File

@@ -0,0 +1,18 @@
{
"base": "png",
"aliases": [
"garmin"
],
"categories": [
"Health",
"Organization",
"Cloud"
],
"update": {
"timestamp": "2025-09-04T17:19:14.226634",
"author": {
"id": 58833097,
"login": "rsiedl"
}
}
}

16
meta/golink.json Normal file
View File

@@ -0,0 +1,16 @@
{
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T17:50:24.395398",
"author": {
"id": 142508044,
"login": "mawewo"
}
},
"colors": {
"light": "golink",
"dark": "golink-dark"
}
}

20
meta/issabel-pbx.json Normal file
View File

@@ -0,0 +1,20 @@
{
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T17:13:18.400425",
"author": {
"id": 168635257,
"login": "adolf242"
}
},
"colors": {
"light": "issabel-pbx",
"dark": "issabel-pbx-dark"
},
"wordmark": {
"light": "issabel-pbx-wordmark",
"dark": "issabel-pbx-wordmark-dark"
}
}

14
meta/lexmark.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Hardware"
],
"update": {
"timestamp": "2025-09-06T17:45:00.646049",
"author": {
"id": 154547389,
"login": "tech-pops"
}
}
}

20
meta/linear.json Normal file
View File

@@ -0,0 +1,20 @@
{
"base": "svg",
"aliases": [
"linear-app"
],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-09-04T18:20:37.295669",
"author": {
"id": 564542,
"login": "DouglasdeMoura"
}
},
"colors": {
"light": "linear",
"dark": "linear-dark"
}
}

14
meta/livebook.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-09-04T17:22:40.740559",
"author": {
"id": 4853491,
"login": "servaasvdc"
}
}
}

14
meta/mympd.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Media"
],
"update": {
"timestamp": "2025-09-04T17:25:51.906208",
"author": {
"id": 4215150,
"login": "tsunulukai"
}
}
}

20
meta/opencode.json Normal file
View File

@@ -0,0 +1,20 @@
{
"base": "svg",
"aliases": [
"opencode"
],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-09-06T18:31:45.274263",
"author": {
"id": 11842502,
"login": "ZainW"
}
},
"colors": {
"light": "opencode",
"dark": "opencode-dark"
}
}

14
meta/pinepods.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "png",
"aliases": [],
"categories": [
"Media"
],
"update": {
"timestamp": "2025-09-04T09:32:20.858215",
"author": {
"id": 1866197,
"login": "orstendium"
}
}
}

14
meta/primal.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"SocialMedia"
],
"update": {
"timestamp": "2025-09-04T18:24:11.419068",
"author": {
"id": 980297,
"login": "shawnyeager"
}
}
}

12
meta/teamtailor.json Normal file
View File

@@ -0,0 +1,12 @@
{
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T18:13:33.888809",
"author": {
"id": 412615,
"login": "johanekhager"
}
}
}

12
meta/topdesk.json Normal file
View File

@@ -0,0 +1,12 @@
{
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T18:09:39.961988",
"author": {
"id": 208478076,
"login": "Dakpanbaviaan"
}
}
}

14
meta/wevr-labs.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Cloud"
],
"update": {
"timestamp": "2025-09-06T17:47:55.518069",
"author": {
"id": 66124192,
"login": "WevrLabs"
}
}
}

12
meta/wirenboard.json Normal file
View File

@@ -0,0 +1,12 @@
{
"base": "png",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-04T18:12:32.222183",
"author": {
"id": 45313095,
"login": "eremeeff"
}
}
}

12
meta/zomro.json Normal file
View File

@@ -0,0 +1,12 @@
{
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-04T18:16:32.978378",
"author": {
"id": 123839282,
"login": "MikMich"
}
}
}

View File

@@ -698,6 +698,20 @@
}
}
},
"wevr-labs": {
"base": "svg",
"aliases": [],
"categories": [
"Cloud"
],
"update": {
"timestamp": "2025-09-06T17:47:55.518069",
"author": {
"id": 66124192,
"login": "WevrLabs"
}
}
},
"xmr": {
"base": "svg",
"aliases": [],
@@ -735,6 +749,18 @@
"dark": "cobalt-dark"
}
},
"topdesk": {
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T18:09:39.961988",
"author": {
"id": 208478076,
"login": "Dakpanbaviaan"
}
}
},
"google-domains": {
"base": "svg",
"aliases": [
@@ -1734,6 +1760,20 @@
}
}
},
"lexmark": {
"base": "svg",
"aliases": [],
"categories": [
"Hardware"
],
"update": {
"timestamp": "2025-09-06T17:45:00.646049",
"author": {
"id": 154547389,
"login": "tech-pops"
}
}
},
"papra": {
"base": "svg",
"aliases": [],
@@ -2765,6 +2805,20 @@
}
}
},
"livebook": {
"base": "svg",
"aliases": [],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-09-04T17:22:40.740559",
"author": {
"id": 4853491,
"login": "servaasvdc"
}
}
},
"reolink": {
"base": "svg",
"aliases": [],
@@ -4016,6 +4070,18 @@
}
}
},
"zomro": {
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-04T18:16:32.978378",
"author": {
"id": 123839282,
"login": "MikMich"
}
}
},
"torrserver": {
"base": "png",
"aliases": [],
@@ -5996,6 +6062,20 @@
}
}
},
"aboard": {
"base": "svg",
"aliases": [
"aboardhr"
],
"categories": [],
"update": {
"timestamp": "2025-09-06T18:26:21.574041",
"author": {
"id": 412615,
"login": "johanekhager"
}
}
},
"brick-tracker": {
"base": "svg",
"aliases": [],
@@ -6430,6 +6510,18 @@
}
}
},
"wirenboard": {
"base": "png",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-04T18:12:32.222183",
"author": {
"id": 45313095,
"login": "eremeeff"
}
}
},
"grimoire": {
"base": "svg",
"aliases": [
@@ -10775,6 +10867,18 @@
}
}
},
"teamtailor": {
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T18:13:33.888809",
"author": {
"id": 412615,
"login": "johanekhager"
}
}
},
"triliumnext": {
"base": "svg",
"aliases": [],
@@ -14916,6 +15020,20 @@
}
}
},
"drop": {
"base": "svg",
"aliases": [],
"categories": [
"Media"
],
"update": {
"timestamp": "2025-09-06T18:00:59.580587",
"author": {
"id": 1866197,
"login": "orstendium"
}
}
},
"flux-cd": {
"base": "svg",
"aliases": [],
@@ -15607,6 +15725,26 @@
"light": "backrest-light"
}
},
"issabel-pbx": {
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T17:13:18.400425",
"author": {
"id": 168635257,
"login": "adolf242"
}
},
"colors": {
"light": "issabel-pbx",
"dark": "issabel-pbx-dark"
},
"wordmark": {
"light": "issabel-pbx-wordmark",
"dark": "issabel-pbx-wordmark-dark"
}
},
"servarr": {
"base": "svg",
"aliases": [],
@@ -17438,6 +17576,22 @@
}
}
},
"chatbetter": {
"base": "png",
"aliases": [
"unsupervised"
],
"categories": [
"Organization"
],
"update": {
"timestamp": "2025-09-04T18:03:24.249994",
"author": {
"id": 50716,
"login": "tylerwillis"
}
}
},
"woocommerce": {
"base": "svg",
"aliases": [],
@@ -18567,6 +18721,20 @@
}
}
},
"primal": {
"base": "svg",
"aliases": [],
"categories": [
"SocialMedia"
],
"update": {
"timestamp": "2025-09-04T18:24:11.419068",
"author": {
"id": 980297,
"login": "shawnyeager"
}
}
},
"ugreen": {
"base": "svg",
"aliases": [
@@ -22263,6 +22431,20 @@
"light": "openpanel-light"
}
},
"pinepods": {
"base": "png",
"aliases": [],
"categories": [
"Media"
],
"update": {
"timestamp": "2025-09-04T09:32:20.858215",
"author": {
"id": 1866197,
"login": "orstendium"
}
}
},
"notebook-lm": {
"base": "svg",
"aliases": [],
@@ -22922,6 +23104,20 @@
}
}
},
"convertx": {
"base": "png",
"aliases": [],
"categories": [
"File"
],
"update": {
"timestamp": "2025-09-06T18:21:09.942796",
"author": {
"id": 12634286,
"login": "bitkris-dev"
}
}
},
"ubuntu-linux-alt": {
"base": "svg",
"aliases": [],
@@ -24747,6 +24943,26 @@
}
}
},
"linear": {
"base": "svg",
"aliases": [
"linear-app"
],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-09-04T18:20:37.295669",
"author": {
"id": 564542,
"login": "DouglasdeMoura"
}
},
"colors": {
"light": "linear",
"dark": "linear-dark"
}
},
"pia": {
"base": "svg",
"aliases": [],
@@ -28023,6 +28239,24 @@
}
}
},
"garmin-connect": {
"base": "png",
"aliases": [
"garmin"
],
"categories": [
"Health",
"Organization",
"Cloud"
],
"update": {
"timestamp": "2025-09-04T17:19:14.226634",
"author": {
"id": 58833097,
"login": "rsiedl"
}
}
},
"photoview": {
"base": "svg",
"aliases": [],
@@ -28917,6 +29151,22 @@
}
}
},
"golink": {
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-09-06T17:50:24.395398",
"author": {
"id": 142508044,
"login": "mawewo"
}
},
"colors": {
"light": "golink",
"dark": "golink-dark"
}
},
"actual-budget": {
"base": "svg",
"aliases": [],
@@ -28953,6 +29203,20 @@
}
}
},
"mympd": {
"base": "svg",
"aliases": [],
"categories": [
"Media"
],
"update": {
"timestamp": "2025-09-04T17:25:51.906208",
"author": {
"id": 4215150,
"login": "tsunulukai"
}
}
},
"linkstack": {
"base": "svg",
"aliases": [],
@@ -29330,6 +29594,26 @@
}
}
},
"opencode": {
"base": "svg",
"aliases": [
"opencode"
],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-09-06T18:31:45.274263",
"author": {
"id": 11842502,
"login": "ZainW"
}
},
"colors": {
"light": "opencode",
"dark": "opencode-dark"
}
},
"rsshub": {
"base": "png",
"aliases": [

BIN
png/aboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
png/chatbetter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
png/convertx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
png/drop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
png/garmin-connect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
png/golink-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
png/golink.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
png/issabel-pbx-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
png/issabel-pbx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
png/lexmark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
png/linear-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
png/linear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
png/livebook.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
png/mympd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
png/opencode-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
png/opencode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
png/pinepods.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
png/primal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
png/teamtailor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
png/topdesk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
png/wevr-labs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
png/wirenboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
png/zomro.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

74
svg/aboard.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

3
svg/drop.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="3 2.31 18 20.19">
<path d="M4 13.5C4 11.0008 5.38798 8.76189 7.00766 7C8.43926 5.44272 10.0519 4.25811 11.0471 3.5959C11.6287 3.20893 12.3713 3.20893 12.9529 3.5959C13.9481 4.25811 15.5607 5.44272 16.9923 7C18.612 8.76189 20 11.0008 20 13.5C20 17.9183 16.4183 21.5 12 21.5C7.58172 21.5 4 17.9183 4 13.5Z" stroke="#60a5fa" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 416 B

1
svg/golink-dark.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="13.63 53.79 232.9 146.59"><path fill="#fff" d="M52.567 200.386c-6.925 0-12.873-.941-17.844-2.823-4.972-1.846-8.967-4.332-11.985-7.457-3.019-3.125-5.114-6.588-6.286-10.387l17.365-4.208c.782 1.598 1.918 3.178 3.41 4.74 1.49 1.598 3.497 2.912 6.019 3.942 2.556 1.066 5.77 1.598 9.64 1.598 5.47 0 9.997-1.331 13.584-3.995 3.587-2.628 5.38-6.96 5.38-12.997v-15.501h-.959c-.994 1.989-2.45 4.031-4.368 6.126-1.882 2.095-4.385 3.853-7.51 5.273-3.09 1.421-6.978 2.131-11.666 2.131-6.285 0-11.985-1.474-17.099-4.421-5.078-2.983-9.126-7.422-12.145-13.317-2.983-5.93-4.474-13.352-4.474-22.265 0-8.985 1.492-16.566 4.474-22.745 3.019-6.215 7.085-10.92 12.199-14.116 5.113-3.232 10.813-4.847 17.098-4.847 4.794 0 8.736.816 11.826 2.45 3.125 1.598 5.61 3.533 7.457 5.806 1.847 2.237 3.25 4.35 4.208 6.339h1.065v-13.53h19.017v83.15c0 6.995-1.67 12.784-5.007 17.365-3.338 4.581-7.902 8.008-13.69 10.28-5.788 2.273-12.358 3.409-19.709 3.409Zm.16-48.686c4.084 0 7.564-.994 10.44-2.983 2.877-1.988 5.06-4.847 6.552-8.576 1.492-3.728 2.237-8.203 2.237-13.423 0-5.149-.745-9.659-2.237-13.53-1.456-3.871-3.622-6.871-6.498-9.002-2.841-2.166-6.34-3.249-10.494-3.249-4.297 0-7.883 1.118-10.76 3.356-2.876 2.237-5.042 5.309-6.498 9.215-1.456 3.871-2.184 8.274-2.184 13.21 0 5.007.728 9.393 2.184 13.157 1.491 3.729 3.675 6.641 6.551 8.736 2.912 2.059 6.481 3.089 10.707 3.089Zm93.697 17.898c-7.99 0-14.915-1.758-20.774-5.273-5.86-3.516-10.405-8.434-13.637-14.755-3.196-6.321-4.794-13.708-4.794-22.159 0-8.452 1.598-15.856 4.794-22.213 3.232-6.356 7.777-11.292 13.637-14.808 5.859-3.516 12.784-5.273 20.774-5.273s14.915 1.757 20.774 5.273c5.859 3.516 10.387 8.452 13.583 14.808 3.232 6.357 4.847 13.761 4.847 22.213 0 8.451-1.615 15.838-4.847 22.159-3.196 6.321-7.724 11.239-13.583 14.755-5.859 3.515-12.784 5.273-20.774 5.273Zm.106-15.447c4.333 0 7.955-1.19 10.867-3.569 2.912-2.415 5.078-5.647 6.498-9.695 1.456-4.048 2.184-8.558 2.184-13.53 0-5.007-.728-9.535-2.184-13.583-1.42-4.084-3.586-7.333-6.498-9.748-2.912-2.414-6.534-3.622-10.867-3.622-4.439 0-8.132 1.208-11.079 3.622-2.912 2.415-5.096 5.664-6.552 9.748-1.421 4.048-2.131 8.576-2.131 13.583 0 4.972.71 9.482 2.131 13.53 1.456 4.048 3.64 7.28 6.552 9.695 2.947 2.379 6.64 3.569 11.079 3.569Zm99.996-100.356L211.37 184.406h-16.886l35.156-130.61h16.886Z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
svg/golink.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="13.63 53.79 232.9 146.59"><path fill="#000" d="M52.567 200.386c-6.925 0-12.873-.941-17.844-2.823-4.972-1.846-8.967-4.332-11.985-7.457-3.019-3.125-5.114-6.588-6.286-10.387l17.365-4.208c.782 1.598 1.918 3.178 3.41 4.74 1.49 1.598 3.497 2.912 6.019 3.942 2.556 1.066 5.77 1.598 9.64 1.598 5.47 0 9.997-1.331 13.584-3.995 3.587-2.628 5.38-6.96 5.38-12.997v-15.501h-.959c-.994 1.989-2.45 4.031-4.368 6.126-1.882 2.095-4.385 3.853-7.51 5.273-3.09 1.421-6.978 2.131-11.666 2.131-6.285 0-11.985-1.474-17.099-4.421-5.078-2.983-9.126-7.422-12.145-13.317-2.983-5.93-4.474-13.352-4.474-22.265 0-8.985 1.492-16.566 4.474-22.745 3.019-6.215 7.085-10.92 12.199-14.116 5.113-3.232 10.813-4.847 17.098-4.847 4.794 0 8.736.816 11.826 2.45 3.125 1.598 5.61 3.533 7.457 5.806 1.847 2.237 3.25 4.35 4.208 6.339h1.065v-13.53h19.017v83.15c0 6.995-1.67 12.784-5.007 17.365-3.338 4.581-7.902 8.008-13.69 10.28-5.788 2.273-12.358 3.409-19.709 3.409Zm.16-48.686c4.084 0 7.564-.994 10.44-2.983 2.877-1.988 5.06-4.847 6.552-8.576 1.492-3.728 2.237-8.203 2.237-13.423 0-5.149-.745-9.659-2.237-13.53-1.456-3.871-3.622-6.871-6.498-9.002-2.841-2.166-6.34-3.249-10.494-3.249-4.297 0-7.883 1.118-10.76 3.356-2.876 2.237-5.042 5.309-6.498 9.215-1.456 3.871-2.184 8.274-2.184 13.21 0 5.007.728 9.393 2.184 13.157 1.491 3.729 3.675 6.641 6.551 8.736 2.912 2.059 6.481 3.089 10.707 3.089Zm93.697 17.898c-7.99 0-14.915-1.758-20.774-5.273-5.86-3.516-10.405-8.434-13.637-14.755-3.196-6.321-4.794-13.708-4.794-22.159 0-8.452 1.598-15.856 4.794-22.213 3.232-6.356 7.777-11.292 13.637-14.808 5.859-3.516 12.784-5.273 20.774-5.273s14.915 1.757 20.774 5.273c5.859 3.516 10.387 8.452 13.583 14.808 3.232 6.357 4.847 13.761 4.847 22.213 0 8.451-1.615 15.838-4.847 22.159-3.196 6.321-7.724 11.239-13.583 14.755-5.859 3.515-12.784 5.273-20.774 5.273Zm.106-15.447c4.333 0 7.955-1.19 10.867-3.569 2.912-2.415 5.078-5.647 6.498-9.695 1.456-4.048 2.184-8.558 2.184-13.53 0-5.007-.728-9.535-2.184-13.583-1.42-4.084-3.586-7.333-6.498-9.748-2.912-2.414-6.534-3.622-10.867-3.622-4.439 0-8.132 1.208-11.079 3.622-2.912 2.415-5.096 5.664-6.552 9.748-1.421 4.048-2.131 8.576-2.131 13.583 0 4.972.71 9.482 2.131 13.53 1.456 4.048 3.64 7.28 6.552 9.695 2.947 2.379 6.64 3.569 11.079 3.569Zm99.996-100.356L211.37 184.406h-16.886l35.156-130.61h16.886Z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
svg/issabel-pbx-dark.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Capa_1" x="0px" y="0px" style="enable-background:new 0 0 446.7 124.6;" xml:space="preserve" viewBox="0 0 91.5 124.6"><style type="text/css"> .st0{fill:#FFFFFF;} .st1{fill:#54BDC8;} .st2{fill:#EA661C;} .st3{fill:#E95880;} .st4{fill:#885EA3;} .st5{fill:#EFB922;}</style><g> <g> <g> <path class="st0" d="M12.1,23.1c-6.1,0-11-5-11-11s5-11,11-11s11,5,11,11S18.2,23.1,12.1,23.1z M12.1,2.4c-5.4,0-9.7,4.4-9.7,9.7 s4.4,9.7,9.7,9.7s9.7-4.4,9.7-9.7S17.4,2.4,12.1,2.4z"/> </g> <g> <path class="st0" d="M46.3,24.2c-6.7,0-12.1-5.4-12.1-12.1S39.6,0,46.3,0c6.7,0,12.1,5.4,12.1,12.1S52.9,24.2,46.3,24.2z M46.3,1.3c-5.9,0-10.8,4.8-10.8,10.8s4.8,10.8,10.8,10.8C52.2,22.8,57,18,57,12.1S52.2,1.3,46.3,1.3z"/> </g> <g> <path class="st0" d="M12.1,58C5.4,58,0,52.6,0,45.9s5.4-12.1,12.1-12.1s12.1,5.4,12.1,12.1S18.7,58,12.1,58z M12.1,35.2 C6.1,35.2,1.3,40,1.3,45.9s4.8,10.8,10.8,10.8s10.8-4.8,10.8-10.8S18,35.2,12.1,35.2z"/> </g> <g> <path class="st1" d="M46.3,4.4c-4.2,0-7.7,3.4-7.7,7.7v0c0,4.2,3.4,7.7,7.7,7.7c4.2,0,7.7-3.4,7.7-7.7 C53.9,7.8,50.5,4.4,46.3,4.4z"/> </g> <g> <path class="st2" d="M80.5,21.4c5.2,0,9.3-4.2,9.3-9.3c0-5.2-4.2-9.3-9.3-9.3l0,0c-5.2,0-9.3,4.2-9.3,9.3v0 C71.1,17.2,75.3,21.4,80.5,21.4z"/> </g> <g> <path class="st3" d="M12.1,38.2c-4.2,0-7.7,3.4-7.7,7.7v0c0,4.2,3.4,7.7,7.7,7.7l0,0c4.2,0,7.7-3.4,7.7-7.7 C19.7,41.7,16.3,38.2,12.1,38.2z"/> </g> <g> <path class="st4" d="M46.3,36.6c-5.2,0-9.3,4.2-9.3,9.3v0c0,5.2,4.2,9.3,9.3,9.3c5.2,0,9.3-4.2,9.3-9.3 C55.6,40.7,51.4,36.6,46.3,36.6z"/> </g> <g> <path class="st0" d="M80.5,56.9c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C91.5,52,86.6,56.9,80.5,56.9z M80.5,36.2c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C90.2,40.5,85.8,36.2,80.5,36.2z"/> </g> <g> <path class="st5" d="M12.1,70.4c-5.2,0-9.3,4.2-9.3,9.3v0c0,5.2,4.2,9.3,9.3,9.3l0,0c5.2,0,9.3-4.2,9.3-9.3 C21.4,74.6,17.2,70.4,12.1,70.4z"/> </g> <g> <path class="st0" d="M46.3,90.8c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C57.3,85.8,52.4,90.8,46.3,90.8z M46.3,70c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C56,74.4,51.6,70,46.3,70z"/> </g> <g> <path class="st0" d="M46.3,124.6c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C57.3,119.6,52.4,124.6,46.3,124.6z M46.3,103.8c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C56,108.2,51.6,103.8,46.3,103.8z"/> </g> <g> <path class="st0" d="M80.5,90.8c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C91.5,85.8,86.6,90.8,80.5,90.8z M80.5,70c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C90.2,74.4,85.8,70,80.5,70z"/> </g> </g> </g></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.4 KiB

1
svg/issabel-pbx.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Capa_1" x="0px" y="0px" style="enable-background:new 0 0 446.7 124.6;" xml:space="preserve" viewBox="0 0 91.5 124.6"><style type="text/css"> .st0{fill:#000;} .st1{fill:#54BDC8;} .st2{fill:#EA661C;} .st3{fill:#E95880;} .st4{fill:#885EA3;} .st5{fill:#EFB922;}</style><g> <g> <g> <path class="st0" d="M12.1,23.1c-6.1,0-11-5-11-11s5-11,11-11s11,5,11,11S18.2,23.1,12.1,23.1z M12.1,2.4c-5.4,0-9.7,4.4-9.7,9.7 s4.4,9.7,9.7,9.7s9.7-4.4,9.7-9.7S17.4,2.4,12.1,2.4z"/> </g> <g> <path class="st0" d="M46.3,24.2c-6.7,0-12.1-5.4-12.1-12.1S39.6,0,46.3,0c6.7,0,12.1,5.4,12.1,12.1S52.9,24.2,46.3,24.2z M46.3,1.3c-5.9,0-10.8,4.8-10.8,10.8s4.8,10.8,10.8,10.8C52.2,22.8,57,18,57,12.1S52.2,1.3,46.3,1.3z"/> </g> <g> <path class="st0" d="M12.1,58C5.4,58,0,52.6,0,45.9s5.4-12.1,12.1-12.1s12.1,5.4,12.1,12.1S18.7,58,12.1,58z M12.1,35.2 C6.1,35.2,1.3,40,1.3,45.9s4.8,10.8,10.8,10.8s10.8-4.8,10.8-10.8S18,35.2,12.1,35.2z"/> </g> <g> <path class="st1" d="M46.3,4.4c-4.2,0-7.7,3.4-7.7,7.7v0c0,4.2,3.4,7.7,7.7,7.7c4.2,0,7.7-3.4,7.7-7.7 C53.9,7.8,50.5,4.4,46.3,4.4z"/> </g> <g> <path class="st2" d="M80.5,21.4c5.2,0,9.3-4.2,9.3-9.3c0-5.2-4.2-9.3-9.3-9.3l0,0c-5.2,0-9.3,4.2-9.3,9.3v0 C71.1,17.2,75.3,21.4,80.5,21.4z"/> </g> <g> <path class="st3" d="M12.1,38.2c-4.2,0-7.7,3.4-7.7,7.7v0c0,4.2,3.4,7.7,7.7,7.7l0,0c4.2,0,7.7-3.4,7.7-7.7 C19.7,41.7,16.3,38.2,12.1,38.2z"/> </g> <g> <path class="st4" d="M46.3,36.6c-5.2,0-9.3,4.2-9.3,9.3v0c0,5.2,4.2,9.3,9.3,9.3c5.2,0,9.3-4.2,9.3-9.3 C55.6,40.7,51.4,36.6,46.3,36.6z"/> </g> <g> <path class="st0" d="M80.5,56.9c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C91.5,52,86.6,56.9,80.5,56.9z M80.5,36.2c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C90.2,40.5,85.8,36.2,80.5,36.2z"/> </g> <g> <path class="st5" d="M12.1,70.4c-5.2,0-9.3,4.2-9.3,9.3v0c0,5.2,4.2,9.3,9.3,9.3l0,0c5.2,0,9.3-4.2,9.3-9.3 C21.4,74.6,17.2,70.4,12.1,70.4z"/> </g> <g> <path class="st0" d="M46.3,90.8c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C57.3,85.8,52.4,90.8,46.3,90.8z M46.3,70c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C56,74.4,51.6,70,46.3,70z"/> </g> <g> <path class="st0" d="M46.3,124.6c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C57.3,119.6,52.4,124.6,46.3,124.6z M46.3,103.8c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C56,108.2,51.6,103.8,46.3,103.8z"/> </g> <g> <path class="st0" d="M80.5,90.8c-6.1,0-11-4.9-11-11c0-6.1,5-11,11-11c6.1,0,11,4.9,11,11C91.5,85.8,86.6,90.8,80.5,90.8z M80.5,70c-5.4,0-9.7,4.4-9.7,9.7c0,5.4,4.4,9.7,9.7,9.7c5.4,0,9.7-4.4,9.7-9.7C90.2,74.4,85.8,70,80.5,70z"/> </g> </g> </g></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

1
svg/lexmark.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" style="enable-background:new 0 0 2500 491.2" xml:space="preserve" viewBox="0 0 491.2 491.2"><path style="fill:#008a44" d="M491.2 395.1V0h-96.1L246 149z"/><path style="fill:#3af23a" d="M0 96.1v395.1h96.1l149-149.9z"/><path style="fill:#006446" d="M96.1 491.2h395.1v-96.1l-149-150z"/><path style="fill:#00c425" d="M395.1 0H0v96.1l149 149z"/></svg>

After

Width:  |  Height:  |  Size: 385 B

1
svg/linear-dark.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" width="200" height="200" viewBox="0 0 100 100"><path fill="#fff" d="M1.22541 61.5228c-.2225-.9485.90748-1.5459 1.59638-.857L39.3342 97.1782c.6889.6889.0915 1.8189-.857 1.5964C20.0515 94.4522 5.54779 79.9485 1.22541 61.5228ZM.00189135 46.8891c-.01764375.2833.08887215.5599.28957165.7606L52.3503 99.7085c.2007.2007.4773.3075.7606.2896 2.3692-.1476 4.6938-.46 6.9624-.9259.7645-.157 1.0301-1.0963.4782-1.6481L2.57595 39.4485c-.55186-.5519-1.49117-.2863-1.648174.4782-.465915 2.2686-.77832 4.5932-.92588465 6.9624ZM4.21093 29.7054c-.16649.3738-.08169.8106.20765 1.1l64.77602 64.776c.2894.2894.7262.3742 1.1.2077 1.7861-.7956 3.5171-1.6927 5.1855-2.684.5521-.328.6373-1.0867.1832-1.5407L8.43566 24.3367c-.45409-.4541-1.21271-.3689-1.54074.1832-.99132 1.6684-1.88843 3.3994-2.68399 5.1855ZM12.6587 18.074c-.3701-.3701-.393-.9637-.0443-1.3541C21.7795 6.45931 35.1114 0 49.9519 0 77.5927 0 100 22.4073 100 50.0481c0 14.8405-6.4593 28.1724-16.7199 37.3375-.3903.3487-.984.3258-1.3542-.0443L12.6587 18.074Z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

1
svg/linear.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" width="200" height="200" viewBox="0 0 100 100"><path fill="#222326" d="M1.22541 61.5228c-.2225-.9485.90748-1.5459 1.59638-.857L39.3342 97.1782c.6889.6889.0915 1.8189-.857 1.5964C20.0515 94.4522 5.54779 79.9485 1.22541 61.5228ZM.00189135 46.8891c-.01764375.2833.08887215.5599.28957165.7606L52.3503 99.7085c.2007.2007.4773.3075.7606.2896 2.3692-.1476 4.6938-.46 6.9624-.9259.7645-.157 1.0301-1.0963.4782-1.6481L2.57595 39.4485c-.55186-.5519-1.49117-.2863-1.648174.4782-.465915 2.2686-.77832 4.5932-.92588465 6.9624ZM4.21093 29.7054c-.16649.3738-.08169.8106.20765 1.1l64.77602 64.776c.2894.2894.7262.3742 1.1.2077 1.7861-.7956 3.5171-1.6927 5.1855-2.684.5521-.328.6373-1.0867.1832-1.5407L8.43566 24.3367c-.45409-.4541-1.21271-.3689-1.54074.1832-.99132 1.6684-1.88843 3.3994-2.68399 5.1855ZM12.6587 18.074c-.3701-.3701-.393-.9637-.0443-1.3541C21.7795 6.45931 35.1114 0 49.9519 0 77.5927 0 100 22.4073 100 50.0481c0 14.8405-6.4593 28.1724-16.7199 37.3375-.3903.3487-.984.3258-1.3542-.0443L12.6587 18.074Z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

1
svg/livebook.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

7
svg/mympd.svg Normal file
View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 8.47 8.47">
<ellipse cx="4.2333" cy="4.2333" rx="4.2333" ry="4.2333" fill="#28a745"/>
<path d="m1.5772 4.8257h0.59026v-1.1847h-0.59026z" fill="#fff" stroke-width=".26458"/>
<path d="m3.9382 7.195h0.59025v-5.9233h-0.59025z" fill="#fff" stroke-width=".26458"/>
<path d="m2.7577 6.0103h0.59026v-3.554h-0.59026z" fill="#fff" stroke-width=".26458"/>
<path d="m5.1187 2.4563v3.554l2.7826-1.777z" fill="#fff" stroke-width=".26458"/>
</svg>

After

Width:  |  Height:  |  Size: 499 B

12
svg/opencode-dark.svg Normal file
View File

@@ -0,0 +1,12 @@
<svg width="289" height="50" viewBox="0 0 289 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M264.5 0H288.5V8.5H272.5V16.5H288.5V25H272.5V33H288.5V41.5H264.5V0Z" fill="white"/>
<path d="M248.5 0H224.5V41.5H248.5V33H232.5V8.5H248.5V0Z" fill="white"/>
<path d="M256.5 8.5H248.5V33H256.5V8.5Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M184.5 0H216.5V41.5H184.5V0ZM208.5 8.5H192.5V33H208.5V8.5Z" fill="white"/>
<path d="M144.5 8.5H136.5V41.5H144.5V8.5Z" fill="white"/>
<path d="M136.5 0H112.5V41.5H120.5V8.5H136.5V0Z" fill="white"/>
<path d="M80.5 0H104.5V8.5H88.5V16.5H104.5V25H88.5V33H104.5V41.5H80.5V0Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M40.5 0H72.5V41.5H48.5V49.5H40.5V0ZM64.5 8.5H48.5V33H64.5V8.5Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.5 0H32.5V41.5955H0.5V0ZM24.5 8.5H8.5V33H24.5V8.5Z" fill="white"/>
<path d="M152.5 0H176.5V8.5H160.5V33H176.5V41.5H152.5V0Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 981 B

12
svg/opencode.svg Normal file
View File

@@ -0,0 +1,12 @@
<svg width="289" height="50" viewBox="0 0 289 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M264.5 0H288.5V8.5H272.5V16.5H288.5V25H272.5V33H288.5V41.5H264.5V0Z" fill="black"/>
<path d="M248.5 0H224.5V41.5H248.5V33H232.5V8.5H248.5V0Z" fill="black"/>
<path d="M256.5 8.5H248.5V33H256.5V8.5Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M184.5 0H216.5V41.5H184.5V0ZM208.5 8.5H192.5V33H208.5V8.5Z" fill="black"/>
<path d="M144.5 8.5H136.5V41.5H144.5V8.5Z" fill="black"/>
<path d="M136.5 0H112.5V41.5H120.5V8.5H136.5V0Z" fill="black"/>
<path d="M80.5 0H104.5V8.5H88.5V16.5H104.5V25H88.5V33H104.5V41.5H80.5V0Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M40.5 0H72.5V41.5H48.5V49.5H40.5V0ZM64.5 8.5H48.5V33H64.5V8.5Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.5 0H32.5V41.5955H0.5V0ZM24.5 8.5H8.5V33H24.5V8.5Z" fill="black"/>
<path d="M152.5 0H176.5V8.5H160.5V33H176.5V41.5H152.5V0Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 981 B

24
svg/primal.svg Normal file
View File

@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 256 256">
<g clip-path="url(#clip0_1_943)">
<path d="M155.506 253.036C146.645 254.976 137.44 255.999 127.997 255.999C102.077 255.999 77.9567 248.295 57.8008 235.051C52.7974 227.894 50.5525 223.955 48.915 221.081C48.1036 219.657 47.4413 218.495 46.6664 217.332C39.0311 205.053 35.0362 189.28 34.1651 170.748C31.4666 113.326 66.3642 76.6573 102.015 70.6387C124.613 66.8235 142.572 70.6872 156.347 78.0534C144.169 74.666 129.652 74.4622 113.102 79.2C72.9831 92.1309 59.6091 131.451 65.3414 174.994C75.3453 229.555 128.842 249.111 155.506 253.036Z" fill="url(#paint0_linear_1_943)"/>
<path d="M41.2387 222.111C33.7762 208.86 27.0184 189.088 26.1739 171.123C23.3092 110.164 60.5628 69.5235 100.683 62.7503C155.371 53.5175 185.775 85.8934 196.256 109.923C196.695 109.628 196.873 109.043 196.641 108.539C179.408 71.0662 143.765 45.3331 102.592 45.3331C55.8419 45.3331 14.127 78.8691 0 128.71C0.200633 165.642 16.0426 198.871 41.2387 222.111Z" fill="url(#paint1_linear_1_943)"/>
<path d="M199.997 233.844C190.764 240.137 180.665 245.253 169.916 248.977C164.755 248.078 159.037 246.959 155.011 246.171C153.103 245.797 151.574 245.498 150.666 245.332C126.318 240.885 82.7834 225.195 73.246 173.749C70.5513 153.063 72.4812 134.02 79.3156 118.916C86.0487 104.035 97.6686 92.6275 115.39 86.8682C135.987 81.2567 153.055 84.0378 165.732 90.8469C162.612 90.1887 159.386 89.8437 156.085 89.8437C128.652 89.8437 106.414 113.671 106.414 143.063C106.414 154.799 109.959 165.648 115.966 174.447C115.966 174.447 133.16 206.926 179.966 204.023C221.7 201.434 243.373 163.999 245.956 150.172C247.298 142.986 248 135.575 248 127.999C248 61.7256 194.274 7.99997 128.001 7.99997C77.851 7.99997 34.8866 38.7631 16.9488 82.4478C10.8898 90.3409 5.6727 99.0914 1.46875 108.554C10.8367 47.0899 63.9194 0 128.001 0C198.693 0 256 57.3073 256 127.999C256 171.996 233.803 210.805 199.997 233.844Z" fill="url(#paint2_linear_1_943)"/>
</g>
<defs>
<linearGradient id="paint0_linear_1_943" x1="79.9357" y1="106.044" x2="79.7404" y2="219.805" gradientUnits="userSpaceOnUse">
<stop offset="0.0297309" stop-color="#FA3C3C"/>
<stop offset="1" stop-color="#BC1870"/>
</linearGradient>
<linearGradient id="paint1_linear_1_943" x1="62.5099" y1="52.0175" x2="56.1717" y2="165.81" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF9F2F"/>
<stop offset="1" stop-color="#FA3C3C"/>
</linearGradient>
<linearGradient id="paint2_linear_1_943" x1="151.999" y1="253.332" x2="152.351" y2="121.334" gradientUnits="userSpaceOnUse">
<stop stop-color="#5B09AD"/>
<stop offset="1" stop-color="#BC1870"/>
</linearGradient>
<clipPath id="clip0_1_943">
<rect width="256" height="256" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

11
svg/teamtailor.svg Normal file
View File

@@ -0,0 +1,11 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 150 150">
<g clip-path="url(#clip0_1443_72)">
<rect width="150" height="150" fill="#F43F85"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M51.3033 114.604C53.2758 113.345 55.1061 111.993 56.79 110.541C58.4719 109.096 59.6529 107.858 60.3269 106.829C60.9988 105.801 60.4217 105.522 58.5956 105.99C56.7653 106.459 56.116 105.265 56.6457 102.418C57.1734 99.5708 58.6677 95.7643 61.1204 91.0005C63.5752 86.2387 66.8957 80.8463 71.0818 74.8232C75.2679 68.8001 80.2002 62.7544 85.8806 56.6841C86.3608 56.1232 86.5525 55.5172 86.4577 54.8619C86.3608 54.2107 86.097 53.5308 85.6642 52.8323C85.2313 52.1318 84.6542 51.456 83.9328 50.8007C83.2114 50.1495 82.4653 49.5886 81.6965 49.1203C86.5072 49.0299 91.1756 49.0977 95.6997 49.3298C100.222 49.564 104.313 49.9153 107.972 50.3816C108.932 50.4761 109.775 49.9153 110.499 48.7012C111.222 47.4892 111.774 46.0409 112.16 44.3585C112.543 42.6781 112.712 41.0203 112.665 39.3872C112.615 37.7541 112.255 36.5646 111.583 35.8148C111.001 35.2561 109.27 34.9069 106.382 34.7651C103.495 34.6254 99.9085 34.6254 95.6276 34.7651C91.3425 34.9048 86.6988 35.2335 81.6965 35.747C76.6901 36.2606 71.8073 36.8913 67.042 37.637C62.2767 38.3847 57.9216 39.2722 53.9745 40.2993C50.0275 41.3264 47.0451 42.448 45.0231 43.6601C44.446 43.9394 44.0132 44.6872 43.7246 45.9012C43.4361 47.1153 43.4113 48.3294 43.6525 49.5435C43.8916 50.7575 44.4213 51.7374 45.2395 52.4852C46.0557 53.2329 47.2842 53.3253 48.9228 52.7666C51.9052 51.7395 55.6585 50.9445 60.1826 50.3857C64.7047 49.8249 69.5669 49.4531 74.765 49.2661C72.743 50.8541 70.4325 53.235 67.8355 56.4088C65.2365 59.5847 62.5405 63.1796 59.7498 67.1937C56.959 71.2097 54.2652 75.4374 51.6661 79.8705C49.067 84.3056 46.7071 88.5333 44.5924 92.5473C42.4735 96.5613 40.7896 100.158 39.5385 103.332C38.2853 106.504 37.6608 108.84 37.6608 110.333C37.6608 110.612 37.9721 111.103 38.5986 111.804C39.2232 112.504 40.0167 113.205 40.9813 113.903C41.9418 114.604 43.0012 115.212 44.1575 115.726C44.7932 116.007 45.3996 116.212 45.9772 116.34H48.0739C48.8195 116.082 49.896 115.503 51.3033 114.604Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_1443_72">
<rect width="150" height="150" rx="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

5
svg/topdesk.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0.02 39.6 37.45">
<g class="g" id="colour"><path d="m17.1 22.6984-17.1-17.19996c7.3-7.3 19.1-7.3 26.4 0l3.7 3.7z" fill="#c24530"/><path d="m26.4 32 13.2-13.2-13.2-13.3-13.2 13.3-13.2 13.2c7.3 7.3 19.1 7.3 26.4 0z" fill="#e65038"/></g>
</svg>

After

Width:  |  Height:  |  Size: 318 B

1
svg/wevr-labs.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35533 32000"><defs><linearGradient id="a" x2="17767" y1="18388" y2="18388" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#f5c948"/><stop offset="1" stop-color="#dea61b"/></linearGradient><linearGradient id="b" x1="24455" x2="24455" y2="31990" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#31bc41"/><stop offset="1" stop-color="#169930"/></linearGradient></defs><path d="M17760 22627 0 4777 10835 32000l6932-9430" fill="url(#a)"/><path d="m13376 16587 5088-6707h-60l4547 5678L35533 0l-6991 31990-15164-15465" fill="url(#b)"/></svg>

After

Width:  |  Height:  |  Size: 612 B

105
svg/zomro.svg Normal file
View File

@@ -0,0 +1,105 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="15.84 15.86 831.54 224.4">
<path fill-rule="evenodd" clip-rule="evenodd" d="M165.906 62.664C150.851 53.9586 134.05 51.0237 118.057 53.1742C119.786 51.6647 120.879 49.4425 120.879 46.9648C120.879 45.3661 120.423 43.8739 119.636 42.6109C136.912 40.8902 154.87 44.3787 171.053 53.7359C173.515 55.1593 174.358 58.3118 172.937 60.7773C171.516 63.2427 168.368 64.0874 165.906 62.664ZM104.435 46.9648C104.435 50.5466 106.719 53.5942 109.907 54.7271C90.6345 59.503 73.2541 71.822 62.5431 90.4016C49.8732 112.38 49.445 138.073 59.1398 159.56C58.7196 159.493 58.2887 159.459 57.8499 159.459C54.3547 159.459 51.3689 161.643 50.1793 164.723C38.7387 140.131 39.0557 110.526 53.6286 85.247C65.2629 65.0654 83.824 51.3861 104.568 45.4826C104.481 45.9634 104.435 46.4588 104.435 46.9648ZM56.3564 175.791C63.4748 186.591 73.1418 195.94 85.0917 202.85C87.5535 204.273 90.7018 203.429 92.1231 200.963C93.5444 198.498 92.7003 195.346 90.2386 193.922C79.9972 188 71.6602 180.042 65.4444 170.852C64.2071 173.832 61.2728 175.927 57.8499 175.927C57.3399 175.927 56.8407 175.881 56.3564 175.791Z" fill="url(#paint0_linear_7939_23660)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M57.833 163.376C55.479 163.376 53.5705 165.287 53.5705 167.644C53.5705 170.002 55.479 171.913 57.833 171.913C60.1872 171.913 62.0956 170.002 62.0956 167.644C62.0956 165.287 60.1872 163.376 57.833 163.376ZM45.6523 167.644C45.6523 160.907 51.1058 155.445 57.833 155.445C64.5602 155.445 70.0137 160.907 70.0137 167.644C70.0137 174.382 64.5602 179.843 57.833 179.843C51.1058 179.843 45.6523 174.382 45.6523 167.644Z" fill="#C631BC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M37.6237 74.406C65.8317 25.9362 127.888 9.38718 176.447 37.465C178.341 38.56 180.762 37.9102 181.856 36.0137C182.948 34.1171 182.3 31.6922 180.406 30.5972C127.937 0.258012 60.8447 18.2627 30.5514 70.8119L30.5436 70.8255C33.433 70.8644 35.9952 72.2604 37.6237 74.406ZM30.6241 88.9373C30.5561 88.9388 30.4878 88.9396 30.4194 88.9396C27.5969 88.9396 25.0764 87.6446 23.4179 85.6153C3.84991 135.388 23.0526 193.34 70.7047 220.895C72.5984 221.989 75.0197 221.34 76.1129 219.443C77.2062 217.547 76.5575 215.122 74.6638 214.027C30.5869 188.54 12.7441 135.021 30.6241 88.9373Z" fill="url(#paint1_linear_7939_23660)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.4362 73.5746C26.9721 73.5746 24.1638 76.3871 24.1638 79.8568C24.1638 83.3262 26.9721 86.1383 30.4362 86.1383C33.9004 86.1383 36.7086 83.3262 36.7086 79.8568C36.7086 76.3871 33.9004 73.5746 30.4362 73.5746ZM18.6211 79.8568C18.6211 73.3213 23.9109 68.0234 30.4362 68.0234C36.9616 68.0234 42.2513 73.3213 42.2513 79.8568C42.2513 86.3921 36.9616 91.6895 30.4362 91.6895C23.9109 91.6895 18.6211 86.3921 18.6211 79.8568Z" fill="#ED3795"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M112.673 42.6255C110.319 42.6255 108.41 44.5368 108.41 46.8945C108.41 49.2522 110.319 51.1636 112.673 51.1636C115.027 51.1636 116.935 49.2522 116.935 46.8945C116.935 44.5368 115.027 42.6255 112.673 42.6255ZM100.492 46.8945C100.492 40.1571 105.945 34.6953 112.673 34.6953C119.4 34.6953 124.853 40.1571 124.853 46.8945C124.853 53.632 119.4 59.0938 112.673 59.0938C105.945 59.0938 100.492 53.632 100.492 46.8945Z" fill="#F7579F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M152.258 86.4931C129.304 73.2209 99.9548 81.0973 86.7029 104.085C73.4516 127.073 81.3154 156.466 104.269 169.739C107.109 171.381 108.082 175.019 106.442 177.864C104.802 180.708 101.17 181.683 98.3299 180.04C69.6961 163.483 59.8858 126.814 76.4172 98.137C92.9487 69.4603 129.562 59.6345 158.196 76.191C161.036 77.8334 162.01 81.4708 160.37 84.3154C158.73 87.1608 155.098 88.1354 152.258 86.4931Z" fill="url(#paint2_linear_7939_23660)"/>
<path d="M238.195 209.231V237.714H124.617V215.218L188.561 139.203H126.248V110.72H235.478V133.216L171.533 209.231H238.195ZM520.518 237.714L520.156 170.407L487.55 225.197H471.609L439.184 172.222V237.714H406.035V110.72H435.561L480.123 184.014L523.598 110.72H553.125L553.486 237.714H520.518ZM634.296 203.97H614.732V237.714H578.865V110.72H636.832C648.307 110.72 658.27 112.652 666.72 116.525C675.171 120.272 681.692 125.714 686.284 132.853C690.876 139.865 693.168 148.156 693.168 157.708C693.168 166.897 690.994 174.943 686.647 181.836C682.417 188.613 676.321 193.929 668.351 197.802L695.703 237.714H657.301L634.296 203.97ZM656.938 157.708C656.938 151.784 655.063 147.185 651.323 143.92C647.582 140.654 642.021 139.021 634.658 139.021H614.732V176.212H634.658C642.021 176.212 647.582 174.644 651.323 171.495C655.063 168.231 656.938 163.631 656.938 157.708ZM776.902 240.255C763.497 240.255 751.424 237.415 740.673 231.727C730.049 226.04 721.653 218.185 715.493 208.143C709.452 198.101 706.436 186.798 706.436 174.217C706.436 161.636 709.452 150.333 715.493 140.292C721.653 130.25 730.049 122.395 740.673 116.707C751.424 111.02 763.497 108.18 776.902 108.18C790.307 108.18 802.324 111.02 812.95 116.707C823.703 122.395 832.089 130.25 838.13 140.292C844.29 150.333 847.371 161.636 847.371 174.217C847.371 186.798 844.29 198.101 838.13 208.143C832.089 218.185 823.703 226.04 812.95 231.727C802.324 237.415 790.307 240.255 776.902 240.255ZM776.902 210.501C783 210.58 789.007 209.013 794.295 205.966C799.481 202.945 803.591 198.709 806.608 193.266C809.625 187.706 811.137 181.356 811.137 174.217C811.137 167.078 809.625 160.792 806.608 155.349C803.591 149.789 799.481 145.489 794.295 142.468C789.007 139.421 783 137.854 776.902 137.933C770.803 137.854 764.797 139.421 759.512 142.468C754.286 145.526 750.019 149.989 747.194 155.349C744.178 160.792 742.665 167.078 742.665 174.217C742.665 181.356 744.178 187.706 747.194 193.266C750.21 198.709 754.322 202.945 759.512 205.966C764.797 209.013 770.803 210.58 776.902 210.501Z" fill="url(#paint3_linear_7939_23660)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M321.872 240.246C308.467 240.246 296.393 237.407 285.643 231.719C275.018 226.032 266.623 218.176 260.464 208.135C254.422 198.094 251.406 186.791 251.406 174.209C251.406 161.628 254.422 150.325 260.464 140.284C266.623 130.242 275.018 122.386 285.643 116.698C296.393 111.012 308.467 108.172 321.872 108.172C335.276 108.172 347.295 111.012 357.919 116.698C368.671 122.386 377.057 130.242 383.098 140.284C389.258 150.325 392.337 161.628 392.337 174.209C392.337 186.791 389.258 198.094 383.098 208.135C377.057 218.176 368.671 226.032 357.919 231.719C347.295 237.407 335.276 240.246 321.872 240.246ZM353.798 150.333C355.727 155.24 355.971 160.81 354.486 165.917C358.353 166.48 361.895 168.738 364.385 172.231C366.876 175.723 368.126 180.195 367.881 184.722C367.69 189.118 365.992 193.315 363.072 196.604C360.228 199.707 356.469 201.439 352.566 201.439H295.641C293.023 201.439 290.442 200.786 288.069 199.534C285.696 198.282 283.577 196.45 281.856 194.164C280.135 191.879 278.858 189.193 278.106 186.281C277.355 183.354 277.149 180.312 277.499 177.31C277.843 174.308 278.749 171.414 280.135 168.847C281.521 166.28 283.359 164.085 285.542 162.407C287.725 160.729 290.179 159.622 292.761 159.141C295.34 158.664 297.998 158.835 300.496 159.64C301.075 157.281 302.108 155.095 303.512 153.254C304.916 151.412 306.663 149.971 308.62 149.036C310.576 148.101 312.695 147.693 314.806 147.848C316.951 148.012 319.019 148.724 320.811 149.916C322.831 145.063 326.363 141.289 330.693 139.357C335.021 137.425 339.822 137.488 344.115 139.53C348.409 141.57 351.868 145.426 353.798 150.333Z" fill="url(#paint4_linear_7939_23660)"/>
<defs>
<linearGradient id="paint0_linear_7939_23660" x1="135.664" y1="32.1709" x2="49.8049" y2="182.967" gradientUnits="userSpaceOnUse">
<stop stop-color="#FB67A3"/>
<stop offset="0.397" stop-color="#E72690"/>
<stop offset="1" stop-color="#C630BB"/>
</linearGradient>
<linearGradient id="paint1_linear_7939_23660" x1="134.314" y1="3.09682" x2="24.5961" y2="194.633" gradientUnits="userSpaceOnUse">
<stop stop-color="#FB67A3"/>
<stop offset="0.397" stop-color="#E72690"/>
<stop offset="1" stop-color="#C630BB"/>
</linearGradient>
<linearGradient id="paint2_linear_7939_23660" x1="131.874" y1="67.8373" x2="77.8223" y2="161.317" gradientUnits="userSpaceOnUse">
<stop stop-color="#FB67A3"/>
<stop offset="0.397" stop-color="#E72690"/>
<stop offset="1" stop-color="#C630BB"/>
</linearGradient>
<linearGradient id="paint3_linear_7939_23660" x1="489.624" y1="112.285" x2="489.624" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint4_linear_7939_23660" x1="489.626" y1="112.283" x2="489.626" y2="317.843" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint5_linear_7939_23660" x1="489.625" y1="112.286" x2="489.625" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint6_linear_7939_23660" x1="489.624" y1="112.283" x2="489.624" y2="317.843" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint7_linear_7939_23660" x1="489.624" y1="112.283" x2="489.624" y2="317.843" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint8_linear_7939_23660" x1="489.627" y1="112.286" x2="489.627" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint9_linear_7939_23660" x1="489.624" y1="112.286" x2="489.624" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint10_linear_7939_23660" x1="489.624" y1="112.286" x2="489.624" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint11_linear_7939_23660" x1="489.626" y1="112.283" x2="489.626" y2="317.843" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint12_linear_7939_23660" x1="489.626" y1="112.283" x2="489.626" y2="317.843" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint13_linear_7939_23660" x1="489.627" y1="112.283" x2="489.627" y2="317.843" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint14_linear_7939_23660" x1="489.624" y1="112.286" x2="489.624" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint15_linear_7939_23660" x1="489.627" y1="112.286" x2="489.627" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint16_linear_7939_23660" x1="489.626" y1="112.286" x2="489.626" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint17_linear_7939_23660" x1="489.627" y1="112.286" x2="489.627" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
<linearGradient id="paint18_linear_7939_23660" x1="489.626" y1="112.286" x2="489.626" y2="317.846" gradientUnits="userSpaceOnUse">
<stop stop-color="#4E1E91"/>
<stop offset="1" stop-color="#42197B"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -13,6 +13,7 @@
"5etools.png",
"7zip.png",
"a-mule.png",
"aboard.png",
"act.png",
"activepieces.png",
"actual-budget.png",
@@ -283,6 +284,7 @@
"changedetection.png",
"channels-dvr.png",
"chart-db.png",
"chatbetter.png",
"chatgpt.png",
"chatpad-ai.png",
"chatwoot.png",
@@ -361,6 +363,7 @@
"control-d.png",
"converse-light.png",
"converse.png",
"convertx.png",
"cooler-control.png",
"coolify.png",
"copyparty.png",
@@ -500,6 +503,7 @@
"dream-host-dark.png",
"dream-host.png",
"drone.png",
"drop.png",
"dropbox.png",
"dropout-light.png",
"dropout.png",
@@ -701,6 +705,7 @@
"gameyfin.png",
"gaps.png",
"garage.png",
"garmin-connect.png",
"gaseous.png",
"gatsby.png",
"gatus.png",
@@ -741,6 +746,8 @@
"godaddy-alt.png",
"godaddy.png",
"gogs.png",
"golink-dark.png",
"golink.png",
"gollum.png",
"gomft.png",
"gone-man-switch.png",
@@ -961,6 +968,10 @@
"iredmail.png",
"ispconfig.png",
"ispy.png",
"issabel-pbx-dark.png",
"issabel-pbx-wordmark-dark.png",
"issabel-pbx-wordmark.png",
"issabel-pbx.png",
"it-tools-light.png",
"it-tools.png",
"jackett-light.png",
@@ -1074,6 +1085,7 @@
"lemmy.png",
"lemonldap-ng.png",
"lets-encrypt.png",
"lexmark.png",
"libation.png",
"librechat.png",
"libreddit-light.png",
@@ -1095,6 +1107,8 @@
"lightning-terminal.png",
"lighttpd.png",
"limesurvey.png",
"linear-dark.png",
"linear.png",
"linguacafe.png",
"linkace.png",
"linkding.png",
@@ -1110,6 +1124,7 @@
"liremdb.png",
"listmonk.png",
"littlelink-custom.png",
"livebook.png",
"lldap-dark.png",
"lldap.png",
"lms-mixtape.png",
@@ -1305,6 +1320,7 @@
"myheats-light.png",
"myheats.png",
"mylar.png",
"mympd.png",
"myspeed.png",
"mysql.png",
"mysterium.png",
@@ -1476,6 +1492,8 @@
"openaudible.png",
"openchangelog-light.png",
"openchangelog.png",
"opencode-dark.png",
"opencode.png",
"opencost.png",
"openeats-light.png",
"openeats.png",
@@ -1645,6 +1663,7 @@
"pikvm-light.png",
"pikvm.png",
"pinchflat.png",
"pinepods.png",
"pingdom-light.png",
"pingdom.png",
"pingvin-dark.png",
@@ -1724,6 +1743,7 @@
"premiumize.png",
"pretix.png",
"price-buddy.png",
"primal.png",
"prime-video-alt-dark.png",
"prime-video-alt.png",
"prime-video-light.png",
@@ -2111,6 +2131,7 @@
"teamcity-light.png",
"teamcity.png",
"teamspeak.png",
"teamtailor.png",
"technitium.png",
"teddy-cloud.png",
"teedy.png",
@@ -2166,6 +2187,7 @@
"tolgee.png",
"tooljet-dark.png",
"tooljet.png",
"topdesk.png",
"tor.png",
"torrserver.png",
"touitomamout.png",
@@ -2349,6 +2371,7 @@
"wekan.png",
"western-digital.png",
"wetty.png",
"wevr-labs.png",
"wg-gen-web-light.png",
"wg-gen-web.png",
"wger.png",
@@ -2377,6 +2400,7 @@
"windows-vista.png",
"windows-xp.png",
"wireguard.png",
"wirenboard.png",
"wireshark.png",
"wizarr.png",
"wled.png",
@@ -2452,6 +2476,7 @@
"zitadel.png",
"znc.png",
"zohomail.png",
"zomro.png",
"zoneminder.png",
"zoom-alt.png",
"zoom.png",
@@ -2479,6 +2504,7 @@
"5etools.svg",
"7zip.svg",
"a-mule.svg",
"aboard.svg",
"act.svg",
"activepieces.svg",
"actual-budget.svg",
@@ -2844,6 +2870,7 @@
"draytek.svg",
"dream-host-dark.svg",
"dream-host.svg",
"drop.svg",
"dropbox.svg",
"dropout-light.svg",
"dropout.svg",
@@ -3044,6 +3071,8 @@
"goaccess.svg",
"godaddy-alt.svg",
"godaddy.svg",
"golink-dark.svg",
"golink.svg",
"gollum.svg",
"gomft.svg",
"gonic.svg",
@@ -3241,6 +3270,10 @@
"ipfs-light.svg",
"ipfs.svg",
"ispconfig.svg",
"issabel-pbx-dark.svg",
"issabel-pbx-wordmark-dark.svg",
"issabel-pbx-wordmark.svg",
"issabel-pbx.svg",
"it-tools-light.svg",
"it-tools.svg",
"jackett-light.svg",
@@ -3335,6 +3368,7 @@
"lemmy-light.svg",
"lemmy.svg",
"lets-encrypt.svg",
"lexmark.svg",
"libation.svg",
"librechat.svg",
"libreddit-light.svg",
@@ -3350,6 +3384,8 @@
"lidl.svg",
"lighttpd.svg",
"limesurvey.svg",
"linear-dark.svg",
"linear.svg",
"linguacafe.svg",
"linkace.svg",
"linkding.svg",
@@ -3363,6 +3399,7 @@
"liremdb.svg",
"listmonk.svg",
"littlelink-custom.svg",
"livebook.svg",
"lldap-dark.svg",
"lldap.svg",
"lms-mixtape.svg",
@@ -3523,6 +3560,7 @@
"musicbrainz.svg",
"myheats-light.svg",
"myheats.svg",
"mympd.svg",
"myspeed.svg",
"mysql.svg",
"mysterium.svg",
@@ -3668,6 +3706,8 @@
"openai.svg",
"openchangelog-light.svg",
"openchangelog.svg",
"opencode-dark.svg",
"opencode.svg",
"opencost.svg",
"openeats-light.svg",
"openeats.svg",
@@ -3873,6 +3913,7 @@
"premiumize.svg",
"pretix.svg",
"price-buddy.svg",
"primal.svg",
"prime-video-alt-dark.svg",
"prime-video-alt.svg",
"prime-video-light.svg",
@@ -4159,6 +4200,7 @@
"teamcity-light.svg",
"teamcity.svg",
"teamspeak.svg",
"teamtailor.svg",
"telegraf.svg",
"telegram.svg",
"telekom.svg",
@@ -4203,6 +4245,7 @@
"tolgee.svg",
"tooljet-dark.svg",
"tooljet.svg",
"topdesk.svg",
"touitomamout.svg",
"tp-link.svg",
"tpdb.svg",
@@ -4347,6 +4390,7 @@
"webtrees.svg",
"wekan.svg",
"western-digital.svg",
"wevr-labs.svg",
"wger.svg",
"whats-up-docker.svg",
"whatsapp.svg",
@@ -4428,6 +4472,7 @@
"zitadel-light.svg",
"zitadel.svg",
"zohomail.svg",
"zomro.svg",
"zoom-alt.svg",
"zoom.svg",
"zoraxy.svg",
@@ -4453,6 +4498,7 @@
"5etools.webp",
"7zip.webp",
"a-mule.webp",
"aboard.webp",
"act.webp",
"activepieces.webp",
"actual-budget.webp",
@@ -4723,6 +4769,7 @@
"changedetection.webp",
"channels-dvr.webp",
"chart-db.webp",
"chatbetter.webp",
"chatgpt.webp",
"chatpad-ai.webp",
"chatwoot.webp",
@@ -4801,6 +4848,7 @@
"control-d.webp",
"converse-light.webp",
"converse.webp",
"convertx.webp",
"cooler-control.webp",
"coolify.webp",
"copyparty.webp",
@@ -4940,6 +4988,7 @@
"dream-host-dark.webp",
"dream-host.webp",
"drone.webp",
"drop.webp",
"dropbox.webp",
"dropout-light.webp",
"dropout.webp",
@@ -5141,6 +5190,7 @@
"gameyfin.webp",
"gaps.webp",
"garage.webp",
"garmin-connect.webp",
"gaseous.webp",
"gatsby.webp",
"gatus.webp",
@@ -5181,6 +5231,8 @@
"godaddy-alt.webp",
"godaddy.webp",
"gogs.webp",
"golink-dark.webp",
"golink.webp",
"gollum.webp",
"gomft.webp",
"gone-man-switch.webp",
@@ -5401,6 +5453,10 @@
"iredmail.webp",
"ispconfig.webp",
"ispy.webp",
"issabel-pbx-dark.webp",
"issabel-pbx-wordmark-dark.webp",
"issabel-pbx-wordmark.webp",
"issabel-pbx.webp",
"it-tools-light.webp",
"it-tools.webp",
"jackett-light.webp",
@@ -5514,6 +5570,7 @@
"lemmy.webp",
"lemonldap-ng.webp",
"lets-encrypt.webp",
"lexmark.webp",
"libation.webp",
"librechat.webp",
"libreddit-light.webp",
@@ -5535,6 +5592,8 @@
"lightning-terminal.webp",
"lighttpd.webp",
"limesurvey.webp",
"linear-dark.webp",
"linear.webp",
"linguacafe.webp",
"linkace.webp",
"linkding.webp",
@@ -5550,6 +5609,7 @@
"liremdb.webp",
"listmonk.webp",
"littlelink-custom.webp",
"livebook.webp",
"lldap-dark.webp",
"lldap.webp",
"lms-mixtape.webp",
@@ -5745,6 +5805,7 @@
"myheats-light.webp",
"myheats.webp",
"mylar.webp",
"mympd.webp",
"myspeed.webp",
"mysql.webp",
"mysterium.webp",
@@ -5916,6 +5977,8 @@
"openaudible.webp",
"openchangelog-light.webp",
"openchangelog.webp",
"opencode-dark.webp",
"opencode.webp",
"opencost.webp",
"openeats-light.webp",
"openeats.webp",
@@ -6085,6 +6148,7 @@
"pikvm-light.webp",
"pikvm.webp",
"pinchflat.webp",
"pinepods.webp",
"pingdom-light.webp",
"pingdom.webp",
"pingvin-dark.webp",
@@ -6164,6 +6228,7 @@
"premiumize.webp",
"pretix.webp",
"price-buddy.webp",
"primal.webp",
"prime-video-alt-dark.webp",
"prime-video-alt.webp",
"prime-video-light.webp",
@@ -6551,6 +6616,7 @@
"teamcity-light.webp",
"teamcity.webp",
"teamspeak.webp",
"teamtailor.webp",
"technitium.webp",
"teddy-cloud.webp",
"teedy.webp",
@@ -6606,6 +6672,7 @@
"tolgee.webp",
"tooljet-dark.webp",
"tooljet.webp",
"topdesk.webp",
"tor.webp",
"torrserver.webp",
"touitomamout.webp",
@@ -6789,6 +6856,7 @@
"wekan.webp",
"western-digital.webp",
"wetty.webp",
"wevr-labs.webp",
"wg-gen-web-light.webp",
"wg-gen-web.webp",
"wger.webp",
@@ -6817,6 +6885,7 @@
"windows-vista.webp",
"windows-xp.webp",
"wireguard.webp",
"wirenboard.webp",
"wireshark.webp",
"wizarr.webp",
"wled.webp",
@@ -6892,6 +6961,7 @@
"zitadel.webp",
"znc.webp",
"zohomail.webp",
"zomro.webp",
"zoneminder.webp",
"zoom-alt.webp",
"zoom.webp",

View File

@@ -51,8 +51,8 @@
"motion": "^12.7.3",
"next": "15.4.7",
"next-themes": "^0.4.6",
"posthog-js": "^1.235.6",
"posthog-node": "^4.18.0",
"posthog-js": "^1.261.0",
"posthog-node": "^5.8.1",
"react": "^19.1.0",
"react-day-picker": "8.10.1",
"react-dom": "^19.1.0",
@@ -64,7 +64,7 @@
"tailwindcss-motion": "^1.1.0",
"tw-animate-css": "^1.3.7",
"vaul": "^1.1.2",
"zod": "^3.25.76"
"zod": "^4.1.5"
},
"devDependencies": {
"@biomejs/biome": "1.9.4",

228
web/pnpm-lock.yaml generated
View File

@@ -129,11 +129,11 @@ importers:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
posthog-js:
specifier: ^1.235.6
version: 1.256.1
specifier: ^1.261.0
version: 1.261.7
posthog-node:
specifier: ^4.18.0
version: 4.18.0
specifier: ^5.8.1
version: 5.8.1
react:
specifier: ^19.1.0
version: 19.1.0
@@ -168,8 +168,8 @@ importers:
specifier: ^1.1.2
version: 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
zod:
specifier: ^3.25.76
version: 3.25.76
specifier: ^4.1.5
version: 4.1.5
devDependencies:
'@biomejs/biome':
specifier: 1.9.4
@@ -790,6 +790,9 @@ packages:
cpu: [x64]
os: [win32]
'@posthog/core@1.0.2':
resolution: {integrity: sha512-hWk3rUtJl2crQK0WNmwg13n82hnTwB99BT99/XI5gZSvIlYZ1TPmMZE8H2dhJJ98J/rm9vYJ/UXNzw3RV5HTpQ==}
'@radix-ui/number@1.1.1':
resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
@@ -1588,19 +1591,9 @@ packages:
as-table@1.0.55:
resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==}
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
axios@1.8.4:
resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
blake3-wasm@2.1.5:
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
caniuse-lite@1.0.30001726:
resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==}
@@ -1641,10 +1634,6 @@ packages:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
cookie@0.7.2:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
@@ -1711,10 +1700,6 @@ packages:
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
detect-libc@2.0.4:
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
engines: {node: '>=8'}
@@ -1725,10 +1710,6 @@ packages:
dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
embla-carousel-react@8.6.0:
resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==}
peerDependencies:
@@ -1746,22 +1727,6 @@ packages:
resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
engines: {node: '>=10.13.0'}
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
es-set-tostringtag@2.1.0:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'}
esbuild@0.25.4:
resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==}
engines: {node: '>=18'}
@@ -1784,19 +1749,6 @@ packages:
fflate@0.4.8:
resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==}
follow-redirects@1.15.9:
resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
form-data@4.0.2:
resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
engines: {node: '>= 6'}
framer-motion@12.23.12:
resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==}
peerDependencies:
@@ -1816,46 +1768,19 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
get-intrinsic@1.3.0:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
get-proto@1.0.1:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
get-source@2.0.12:
resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
has-tostringtag@1.0.2:
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
input-otp@1.4.2:
resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==}
peerDependencies:
@@ -1955,18 +1880,6 @@ packages:
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
mime@3.0.0:
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
engines: {node: '>=10.0.0'}
@@ -2070,8 +1983,8 @@ packages:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
posthog-js@1.256.1:
resolution: {integrity: sha512-cBLc3W1BHHzxYlJc6kIDbbPVUFTRbsObG0Cn1CnEG7lcyWKbalmW1XvUw7+lu/yyHYfCf7hwTTBJF7GgGFFMmw==}
posthog-js@1.261.7:
resolution: {integrity: sha512-Fjpbz6VfIMsEbKIN/UyTWhU1DGgVIngqoRjPGRolemIMOVzTfI77OZq8WwiBhMug+rU+wNhGCQhC41qRlR5CxA==}
peerDependencies:
'@rrweb/types': 2.0.0-alpha.17
rrweb-snapshot: 2.0.0-alpha.17
@@ -2081,9 +1994,9 @@ packages:
rrweb-snapshot:
optional: true
posthog-node@4.18.0:
resolution: {integrity: sha512-XROs1h+DNatgKh/AlIlCtDxWzwrKdYDb2mOs58n4yN8BkGN9ewqeQwG5ApS4/IzwCb7HPttUkOVulkYatd2PIw==}
engines: {node: '>=15.0.0'}
posthog-node@5.8.1:
resolution: {integrity: sha512-YJYlYnlpItVjHqM9IhvZx8TzK8gnx2nU+0uhiog4RN47NnV0Z0K1AdC4ul+O8VuvS/jHqKCQvL8iAONRA37+0A==}
engines: {node: '>=20'}
preact@10.26.5:
resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==}
@@ -2094,9 +2007,6 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
react-day-picker@8.10.1:
resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==}
peerDependencies:
@@ -2368,8 +2278,8 @@ packages:
zod@3.22.3:
resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==}
zod@3.25.76:
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
zod@4.1.5:
resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==}
snapshots:
@@ -2767,6 +2677,8 @@ snapshots:
'@next/swc-win32-x64-msvc@15.4.7':
optional: true
'@posthog/core@1.0.2': {}
'@radix-ui/number@1.1.1': {}
'@radix-ui/primitive@1.1.2': {}
@@ -3576,23 +3488,8 @@ snapshots:
dependencies:
printable-characters: 1.0.42
asynckit@0.4.0: {}
axios@1.8.4:
dependencies:
follow-redirects: 1.15.9
form-data: 4.0.2
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
blake3-wasm@2.1.5: {}
call-bind-apply-helpers@1.0.2:
dependencies:
es-errors: 1.3.0
function-bind: 1.1.2
caniuse-lite@1.0.30001726: {}
canvas-confetti@1.9.3: {}
@@ -3635,10 +3532,6 @@ snapshots:
color-convert: 2.0.1
color-string: 1.9.1
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
cookie@0.7.2: {}
core-js@3.41.0: {}
@@ -3691,8 +3584,6 @@ snapshots:
defu@6.1.4: {}
delayed-stream@1.0.0: {}
detect-libc@2.0.4: {}
detect-node-es@1.1.0: {}
@@ -3702,12 +3593,6 @@ snapshots:
'@babel/runtime': 7.27.0
csstype: 3.1.3
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
es-errors: 1.3.0
gopd: 1.2.0
embla-carousel-react@8.6.0(react@19.1.0):
dependencies:
embla-carousel: 8.6.0
@@ -3725,21 +3610,6 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.2.2
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
es-set-tostringtag@2.1.0:
dependencies:
es-errors: 1.3.0
get-intrinsic: 1.3.0
has-tostringtag: 1.0.2
hasown: 2.0.2
esbuild@0.25.4:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.4
@@ -3778,15 +3648,6 @@ snapshots:
fflate@0.4.8: {}
follow-redirects@1.15.9: {}
form-data@4.0.2:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
es-set-tostringtag: 2.1.0
mime-types: 2.1.35
framer-motion@12.23.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
motion-dom: 12.23.12
@@ -3799,28 +3660,8 @@ snapshots:
fsevents@2.3.3:
optional: true
function-bind@1.1.2: {}
get-intrinsic@1.3.0:
dependencies:
call-bind-apply-helpers: 1.0.2
es-define-property: 1.0.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
function-bind: 1.1.2
get-proto: 1.0.1
gopd: 1.2.0
has-symbols: 1.1.0
hasown: 2.0.2
math-intrinsics: 1.1.0
get-nonce@1.0.1: {}
get-proto@1.0.1:
dependencies:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
get-source@2.0.12:
dependencies:
data-uri-to-buffer: 2.0.2
@@ -3828,20 +3669,8 @@ snapshots:
glob-to-regexp@0.4.1: {}
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
has-symbols@1.1.0: {}
has-tostringtag@1.0.2:
dependencies:
has-symbols: 1.1.0
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
input-otp@1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
@@ -3914,14 +3743,6 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.4
math-intrinsics@1.1.0: {}
mime-db@1.52.0: {}
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
mime@3.0.0: {}
miniflare@4.20250617.5:
@@ -4018,18 +3839,17 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
posthog-js@1.256.1:
posthog-js@1.261.7:
dependencies:
'@posthog/core': 1.0.2
core-js: 3.41.0
fflate: 0.4.8
preact: 10.26.5
web-vitals: 4.2.4
posthog-node@4.18.0:
posthog-node@5.8.1:
dependencies:
axios: 1.8.4
transitivePeerDependencies:
- debug
'@posthog/core': 1.0.2
preact@10.26.5: {}
@@ -4041,8 +3861,6 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.1
proxy-from-env@1.1.0: {}
react-day-picker@8.10.1(date-fns@4.1.0)(react@19.1.0):
dependencies:
date-fns: 4.1.0
@@ -4353,4 +4171,4 @@ snapshots:
zod@3.22.3: {}
zod@3.25.76: {}
zod@4.1.5: {}

View File

@@ -7,14 +7,6 @@ export const dynamicParams = false
export async function generateStaticParams() {
const iconsData = await getAllIcons()
if (process.env.CI_MODE === "false") {
// This is meant to speed up the build process in local development
return Object.keys(iconsData)
.slice(0, 5)
.map((icon) => ({
icon,
}))
}
return Object.keys(iconsData).map((icon) => ({
icon,
}))

View File

@@ -0,0 +1,122 @@
import { Button } from "@/components/ui/button";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import { Check, Copy, Download, Github, Link as LinkIcon } from "lucide-react";
import Link from "next/link";
import type React from "react";
export type IconActionsProps = {
imageUrl: string;
githubUrl: string;
iconName: string;
format: string;
variantKey: string;
copiedUrlKey: string | null;
copiedImageKey: string | null;
handleDownload: (event: React.MouseEvent, url: string, filename: string) => Promise<void>;
handleCopyUrl: (url: string, variantKey: string, event?: React.MouseEvent) => void;
handleCopyImage: (imageUrl: string, format: string, variantKey: string, event?: React.MouseEvent) => Promise<void>;
};
export function IconActions({
imageUrl,
githubUrl,
iconName,
format,
variantKey,
copiedUrlKey,
copiedImageKey,
handleDownload,
handleCopyUrl,
handleCopyImage,
}: IconActionsProps) {
const downloadFilename = `${iconName}.${format}`;
const isUrlCopied = copiedUrlKey === variantKey;
const isImageCopied = copiedImageKey === variantKey;
return (
<TooltipProvider delayDuration={300}>
<div className="flex gap-2 mt-3 w-full justify-center">
{/* Download Button */}
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="outline"
size="icon"
className="h-8 w-8 rounded-lg cursor-pointer"
onClick={(e) => handleDownload(e, imageUrl, downloadFilename)}
aria-label={`Download ${iconName} as ${format.toUpperCase()}`}
>
<Download className="w-4 h-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Download {format.toUpperCase()}</p>
</TooltipContent>
</Tooltip>
{/* Copy Image Button */}
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="outline"
size="icon"
className="h-8 w-8 rounded-lg cursor-pointer"
onClick={(e) => handleCopyImage(imageUrl, format, variantKey, e)}
aria-label={`Copy ${iconName} image as ${format.toUpperCase()}`}
>
{isImageCopied ? (
<Check className="w-4 h-4 text-green-500" />
) : (
<Copy className="w-4 h-4" />
)}
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Copy image to clipboard</p>
</TooltipContent>
</Tooltip>
{/* Copy URL Button */}
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="outline"
size="icon"
className="h-8 w-8 rounded-lg cursor-pointer"
onClick={(e) => handleCopyUrl(imageUrl, variantKey, e)}
aria-label={`Copy direct URL for ${iconName} ${format.toUpperCase()}`}
>
{isUrlCopied ? (
<Check className="w-4 h-4 text-green-500" />
) : (
<LinkIcon className="w-4 h-4" />
)}
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Copy direct URL</p>
</TooltipContent>
</Tooltip>
{/* View on GitHub Button */}
<Tooltip>
<TooltipTrigger asChild>
<Button variant="outline" size="icon" className="h-8 w-8 rounded-lg" asChild>
<Link
href={githubUrl}
target="_blank"
rel="noopener noreferrer"
aria-label={`View ${iconName} ${format} file on GitHub`}
>
<Github className="w-4 h-4" />
</Link>
</Button>
</TooltipTrigger>
<TooltipContent>
<p>View on GitHub</p>
</TooltipContent>
</Tooltip>
</div>
</TooltipProvider>
);
}

View File

@@ -4,7 +4,6 @@ import { formatIconName } from "@/lib/utils"
import type { Icon } from "@/types/icons"
import Image from "next/image"
import Link from "next/link"
import { preload } from "react-dom"
export function IconCard({
name,
@@ -21,7 +20,7 @@ export function IconCard({
<Link prefetch={false} href={`/icons/${name}`} className="group flex flex-col items-center p-3 sm:p-4 cursor-pointer">
<div className="relative h-16 w-16 mb-2">
<Image
src={`${BASE_URL}/${iconData.base}/${name}.${iconData.base}`}
src={`${BASE_URL}/${iconData.base}/${iconData.colors?.light || name}.${iconData.base}`}
alt={`${name} icon`}
fill
className="object-contain p-1 group-hover:scale-110 transition-transform duration-300"

View File

@@ -10,16 +10,122 @@ import { formatIconName } from "@/lib/utils"
import type { AuthorData, Icon, IconFile } from "@/types/icons"
import confetti from "canvas-confetti"
import { motion } from "framer-motion"
import { ArrowRight, Check, Copy, Download, FileType, Github, Moon, PaletteIcon, Sun } from "lucide-react"
import dynamic from "next/dynamic"
import { ArrowRight, Check, FileType, Github, Moon, PaletteIcon, Sun, Type } from "lucide-react"
import Image from "next/image"
import Link from "next/link"
import type React from "react"
import { useCallback, useState } from "react"
import { toast } from "sonner"
import { Carbon } from "./carbon"
import { IconActions } from "./icon-actions"
import { MagicCard } from "./magicui/magic-card"
import { Badge } from "./ui/badge"
type RenderVariantFn = (
format: string,
iconName: string,
theme?: "light" | "dark"
) => React.ReactNode
type IconVariantsSectionProps = {
title: string
description: string
iconElement: React.ReactNode
aavailableFormats: string[]
icon: string
iconData: Icon
handleCopy: (url: string, variantKey: string, event?: React.MouseEvent) => void
handleDownload: (event: React.MouseEvent, url: string, filename: string) => Promise<void>
copiedVariants: Record<string, boolean>
theme?: "light" | "dark"
renderVariant: RenderVariantFn
}
function IconVariantsSection({
title,
description,
iconElement,
aavailableFormats,
icon,
iconData,
theme,
renderVariant,
}: IconVariantsSectionProps) {
const iconName = theme && iconData.colors?.[theme] ? iconData.colors[theme] : icon
return (
<div>
<h3 className="text-lg font-semibold flex items-center gap-2 mb-1">
{iconElement}
{title}
</h3>
<p className="text-sm text-muted-foreground mb-4">{description}</p>
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
{aavailableFormats.map((format) => renderVariant(format, iconName, theme))}
</div>
</div>
)
}
type WordmarkSectionProps = {
iconData: Icon
icon: string
aavailableFormats: string[]
handleCopy: (url: string, variantKey: string, event?: React.MouseEvent) => void
handleDownload: (event: React.MouseEvent, url: string, filename: string) => Promise<void>
copiedVariants: Record<string, boolean>
renderVariant: RenderVariantFn
}
function WordmarkSection({
iconData,
aavailableFormats,
renderVariant,
}: WordmarkSectionProps) {
if (!iconData.wordmark) return null
return (
<div>
<h3 className="text-lg font-semibold flex items-center gap-2 mb-1">
<Type className="w-4 h-4 text-green-500" />
Wordmark Variants
</h3>
<p className="text-sm text-muted-foreground mb-4">
Icon variants that include the brand name. Click to copy URL.
</p>
<div className="space-y-6">
{iconData.wordmark.light && (
<div>
<h4 className="text-md font-medium flex items-center gap-2 mb-3">
<Sun className="w-4 h-4 text-amber-500" />
Light Theme Wordmark
</h4>
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
{aavailableFormats.map((format) => {
if (!iconData.wordmark?.light) return null
return renderVariant(format, iconData.wordmark.light, "light")
})}
</div>
</div>
)}
{iconData.wordmark.dark && (
<div>
<h4 className="text-md font-medium flex items-center gap-2 mb-3">
<Moon className="w-4 h-4 text-indigo-500" />
Dark Theme Wordmark
</h4>
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
{aavailableFormats.map((format) => {
if (!iconData.wordmark?.dark) return null
return renderVariant(format, iconData.wordmark.dark, "dark")
})}
</div>
</div>
)}
</div>
</div>
)
}
export type IconDetailsProps = {
icon: string
iconData: Icon
@@ -30,11 +136,13 @@ export type IconDetailsProps = {
export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetailsProps) {
const authorName = authorData.name || authorData.login || ""
const iconColorVariants = iconData.colors
const iconWordmarkVariants = iconData.wordmark
const formattedDate = new Date(iconData.update.timestamp).toLocaleDateString("en-GB", {
day: "numeric",
month: "long",
year: "numeric",
})
const getAvailableFormats = () => {
switch (iconData.base) {
case "svg":
@@ -48,9 +156,12 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
const availableFormats = getAvailableFormats()
const [copiedVariants, setCopiedVariants] = useState<Record<string, boolean>>({})
const [copiedUrlKey, setCopiedUrlKey] = useState<string | null>(null)
const [copiedImageKey, setCopiedImageKey] = useState<string | null>(null)
// Launch confetti from the pointer position
const launchConfetti = useCallback((originX?: number, originY?: number) => {
if (typeof confetti !== "function") return
const defaults = {
startVelocity: 15,
spread: 180,
@@ -60,7 +171,6 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
colors: ["#ff0a54", "#ff477e", "#ff7096", "#ff85a1", "#fbb1bd", "#f9bec7"],
}
// If we have origin coordinates, use them
if (originX !== undefined && originY !== undefined) {
confetti({
...defaults,
@@ -71,7 +181,6 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
},
})
} else {
// Default to center of screen
confetti({
...defaults,
particleCount: 50,
@@ -80,20 +189,13 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
}
}, [])
const handleCopy = (url: string, variantKey: string, event?: React.MouseEvent) => {
const handleCopyUrl = (url: string, variantKey: string, event?: React.MouseEvent) => {
navigator.clipboard.writeText(url)
setCopiedVariants((prev) => ({
...prev,
[variantKey]: true,
}))
setCopiedUrlKey(variantKey)
setTimeout(() => {
setCopiedVariants((prev) => ({
...prev,
[variantKey]: false,
}))
setCopiedUrlKey(null)
}, 2000)
// Launch confetti from click position or center of screen
if (event) {
launchConfetti(event.clientX, event.clientY)
} else {
@@ -105,29 +207,99 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
})
}
const handleCopyImage = async (
imageUrl: string,
format: string,
variantKey: string,
event?: React.MouseEvent
) => {
try {
toast.loading("Copying image...")
if (format === 'svg') {
const response = await fetch(imageUrl)
if (!response.ok) {
throw new Error(`Failed to fetch SVG: ${response.statusText}`)
}
const svgText = await response.text()
await navigator.clipboard.writeText(svgText)
setCopiedImageKey(variantKey)
setTimeout(() => {
setCopiedImageKey(null)
}, 2000)
if (event) {
launchConfetti(event.clientX, event.clientY)
} else {
launchConfetti()
}
toast.dismiss()
toast.success("SVG Markup Copied", {
description: "The SVG code has been copied to your clipboard.",
})
} else if (format === 'png' || format === 'webp') {
const mimeType = `image/${format}`
const response = await fetch(imageUrl)
if (!response.ok) {
throw new Error(`Failed to fetch image: ${response.statusText}`)
}
const blob = await response.blob()
if (!blob) {
throw new Error('Failed to generate image blob')
}
await navigator.clipboard.write([new ClipboardItem({ [mimeType]: blob })]);
setCopiedImageKey(variantKey)
setTimeout(() => {
setCopiedImageKey(null)
}, 2000)
if (event) {
launchConfetti(event.clientX, event.clientY)
} else {
launchConfetti()
}
toast.dismiss()
toast.success("Image copied", {
description: `The ${format.toUpperCase()} image has been copied to your clipboard.`,
})
} else {
throw new Error(`Unsupported format for image copy: ${format}`)
}
} catch (error) {
console.error("Copy error:", error)
toast.dismiss()
let description = "Could not copy. Check console for details."
if (error instanceof Error) {
description = error.message
}
toast.error("Copy failed", { description })
}
}
const handleDownload = async (event: React.MouseEvent, url: string, filename: string) => {
event.preventDefault()
// Launch confetti from download button position
launchConfetti(event.clientX, event.clientY)
try {
// Show loading toast
toast.loading("Preparing download...")
// Fetch the file first as a blob
const response = await fetch(url)
const blob = await response.blob()
// Create a blob URL and use it for download
const blobUrl = URL.createObjectURL(blob)
const link = document.createElement("a")
link.href = blobUrl
link.download = filename
document.body.appendChild(link)
link.click()
// Clean up
document.body.removeChild(link)
setTimeout(() => URL.revokeObjectURL(blobUrl), 100)
@@ -161,7 +333,7 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
className="relative w-28 h-28 mb-3 cursor-pointer rounded-xl overflow-hidden group"
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
onClick={(e) => handleCopy(imageUrl, variantKey, e)}
onClick={(e) => handleCopyUrl(imageUrl, variantKey, e)}
aria-label={`Copy ${format.toUpperCase()} URL for ${iconName}${theme ? ` (${theme} theme)` : ""}`}
>
<div className="absolute inset-0 border-2 border-transparent group-hover:border-primary/20 rounded-xl z-10 transition-colors" />
@@ -205,59 +377,18 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
<p className="text-sm font-medium">{format.toUpperCase()}</p>
<div className="flex gap-2 mt-3 w-full justify-center">
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="outline"
size="icon"
className="h-8 w-8 rounded-lg cursor-pointer"
onClick={(e) => handleDownload(e, imageUrl, `${iconName}.${format}`)}
aria-label={`Download ${iconName} in ${format} format${theme ? ` (${theme} theme)` : ""}`}
>
<Download className="w-4 h-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Download icon file</p>
</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="outline"
size="icon"
className="h-8 w-8 rounded-lg cursor-pointer"
onClick={(e) => handleCopy(imageUrl, `btn-${variantKey}`, e)}
aria-label={`Copy URL for ${iconName} in ${format} format${theme ? ` (${theme} theme)` : ""}`}
>
{copiedVariants[`btn-${variantKey}`] ? <Check className="w-4 h-4 text-green-500" /> : <Copy className="w-4 h-4" />}
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Copy direct URL to clipboard</p>
</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<Button variant="outline" size="icon" className="h-8 w-8 rounded-lg" asChild>
<Link
href={githubUrl}
target="_blank"
rel="noopener noreferrer"
aria-label={`View ${iconName} ${format} file on GitHub`}
>
<Github className="w-4 h-4" />
</Link>
</Button>
</TooltipTrigger>
<TooltipContent>
<p>View on GitHub</p>
</TooltipContent>
</Tooltip>
</div>
<IconActions
imageUrl={imageUrl}
githubUrl={githubUrl}
iconName={iconName}
format={format}
variantKey={variantKey}
copiedUrlKey={copiedUrlKey}
copiedImageKey={copiedImageKey}
handleDownload={handleDownload}
handleCopyUrl={handleCopyUrl}
handleCopyImage={handleCopyImage}
/>
</div>
</MagicCard>
</TooltipProvider>
@@ -269,14 +400,13 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
return (
<main className="container mx-auto pt-12 pb-14 px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-4 gap-6">
{/* Left Column: Icon Info and Author */}
<div className="lg:col-span-1">
<Card className="h-full bg-background/50 border shadow-lg">
<CardHeader className="pb-4">
<div className="flex flex-col items-center">
<div className="relative w-32 h-32 rounded-xl overflow-hidden border flex items-center justify-center p-3">
<Image
src={`${BASE_URL}/${iconData.base}/${icon}.${iconData.base}`}
src={`${BASE_URL}/${iconData.base}/${iconData.colors?.light || icon}.${iconData.base}`}
priority
width={96}
height={96}
@@ -306,7 +436,7 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
<AvatarImage src={authorData.avatar_url} alt={`${authorName}'s avatar`} />
<AvatarFallback>{authorName ? authorName.slice(0, 2).toUpperCase() : "??"}</AvatarFallback>
</Avatar>
{authorData.html_url ? (
{authorData.html_url && (
<Link
href={authorData.html_url}
target="_blank"
@@ -315,7 +445,8 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
>
{authorName}
</Link>
) : (
)}
{!authorData.html_url && (
<span className="text-sm">{authorName}</span>
)}
</div>
@@ -372,6 +503,7 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
: `${availableFormats[0].toUpperCase()} format `}
with a base format of {iconData.base.toUpperCase()}.
{iconData.colors && " Includes both light and dark theme variants for better integration with different UI designs."}
{iconData.wordmark && " Wordmark variants are also available for enhanced branding options."}
</p>
<p>
Perfect for adding to dashboards, app directories, documentation, or anywhere you need the {formatIconName(icon)}{" "}
@@ -384,7 +516,6 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
</Card>
</div>
{/* Middle Column: Icon variants */}
<div className="lg:col-span-2">
<Card className="h-full bg-background/50 shadow-lg">
<CardHeader>
@@ -394,37 +525,70 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
<CardDescription>Click on any icon to copy its URL to your clipboard</CardDescription>
</CardHeader>
<CardContent>
{!iconData.colors ? (
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
{availableFormats.map((format) => renderVariant(format, icon))}
</div>
) : (
<div className="space-y-10">
<div>
<h3 className="text-lg font-semibold flex items-center gap-2">
<Sun className="w-4 h-4 text-amber-500" />
Light theme
</h3>
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 p-3 rounded-lg ">
{availableFormats.map((format) => renderVariant(format, icon, "light"))}
</div>
</div>
<div>
<h3 className="text-lg font-semibold flex items-center gap-2">
<Moon className="w-4 h-4 text-indigo-500" />
Dark theme
</h3>
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 p-3 rounded-lg ">
{availableFormats.map((format) => renderVariant(format, icon, "dark"))}
</div>
</div>
</div>
)}
<div className="space-y-10">
{!iconData.colors && (
<IconVariantsSection
title="Default"
description="Standard icon versions. Click to copy URL."
iconElement={<FileType className="w-4 h-4 text-blue-500" />}
aavailableFormats={availableFormats}
icon={icon}
iconData={iconData}
handleCopy={handleCopyUrl}
handleDownload={handleDownload}
copiedVariants={copiedVariants}
renderVariant={renderVariant}
/>
)}
{iconData.colors && (
<>
<IconVariantsSection
title="Light theme"
description="Icon variants optimized for light backgrounds (typically lighter icon colors). Click to copy URL."
iconElement={<Sun className="w-4 h-4 text-amber-500" />}
aavailableFormats={availableFormats}
icon={icon}
theme="light"
iconData={iconData}
handleCopy={handleCopyUrl}
handleDownload={handleDownload}
copiedVariants={copiedVariants}
renderVariant={renderVariant}
/>
<IconVariantsSection
title="Dark theme"
description="Icon variants optimized for dark backgrounds (typically darker icon colors). Click to copy URL."
iconElement={<Moon className="w-4 h-4 text-indigo-500" />}
aavailableFormats={availableFormats}
icon={icon}
theme="dark"
iconData={iconData}
handleCopy={handleCopyUrl}
handleDownload={handleDownload}
copiedVariants={copiedVariants}
renderVariant={renderVariant}
/>
</>
)}
{iconData.wordmark && (
<WordmarkSection
iconData={iconData}
icon={icon}
aavailableFormats={availableFormats}
handleCopy={handleCopyUrl}
handleDownload={handleDownload}
copiedVariants={copiedVariants}
renderVariant={renderVariant}
/>
)}
</div>
</CardContent>
</Card>
</div>
{/* Right Column: Technical details */}
<div className="lg:col-span-1">
<Card className="h-full bg-background/50 border shadow-lg">
<CardHeader>
@@ -466,6 +630,28 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
</div>
)}
{iconData.wordmark && (
<div className="">
<h3 className="text-sm font-semibold text-muted-foreground">Wordmark variants</h3>
<div className="space-y-2">
{iconData.wordmark.light && (
<div className="flex items-center gap-2">
<Type className="w-4 h-4 text-green-500" />
<span className="capitalize font-medium text-sm">Light:</span>
<code className="border border-border px-2 py-0.5 rounded-lg text-xs">{iconData.wordmark.light}</code>
</div>
)}
{iconData.wordmark.dark && (
<div className="flex items-center gap-2">
<Type className="w-4 h-4 text-green-500" />
<span className="capitalize font-medium text-sm">Dark:</span>
<code className="border border-border px-2 py-0.5 rounded-lg text-xs">{iconData.wordmark.dark}</code>
</div>
)}
</div>
</div>
)}
<div className="">
<h3 className="text-sm font-semibold text-muted-foreground mb-2">Source</h3>
<Button variant="outline" className="w-full" asChild>

View File

@@ -13,12 +13,18 @@ export type IconColors = {
light?: string
}
export type IconWordmarkColors = {
dark?: string
light?: string
}
export type Icon = {
base: string | "svg" | "png" | "webp"
aliases: string[]
categories: string[]
update: IconUpdate
colors?: IconColors
wordmark?: IconWordmarkColors
}
export type IconFile = {

BIN
webp/aboard.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
webp/chatbetter.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
webp/convertx.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
webp/drop.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
webp/garmin-connect.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
webp/golink-dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
webp/golink.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
webp/issabel-pbx-dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
webp/issabel-pbx.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
webp/lexmark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
webp/linear-dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
webp/linear.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
webp/livebook.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
webp/mympd.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
webp/opencode-dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 B

BIN
webp/opencode.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

BIN
webp/pinepods.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
webp/primal.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
webp/teamtailor.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
webp/topdesk.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

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