Compare commits

...

16 Commits

Author SHA1 Message Date
Dashboard Icons Manager
9128b24048 feat(icons): update jellystat 2025-04-28 18:59:43 +00:00
dashboard-icons-manager[bot]
cad8572707 feat(icons): add zen-browser (#1325)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-28 20:19:09 +02:00
dashboard-icons-manager[bot]
b175292f61 feat(icons): add zorin-linux (#1327)
* feat(icons): add zorin-linux

* fix(icons): trim empty spacing

Signed-off-by: Bjorn Lammers <bjorn@lammers.media>

---------

Signed-off-by: Bjorn Lammers <bjorn@lammers.media>
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
Co-authored-by: Bjorn Lammers <bjorn@lammers.media>
2025-04-28 20:18:00 +02:00
dashboard-icons-manager[bot]
3bdb95f8f7 feat(icons): add vitalpbx (#1330)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-28 20:15:29 +02:00
dashboard-icons-manager[bot]
65a8e4619d feat(icons): update wireguard (#1328)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-28 20:05:02 +02:00
dashboard-icons-manager[bot]
1900721aa3 feat(icons): add uptimerobot (#1329)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-28 20:04:34 +02:00
dashboard-icons-manager[bot]
d0f45e6bbb feat(icons): add cup (#1316)
* feat(icons): add cup

* fix(icons): trim empty spacing

Signed-off-by: Bjorn Lammers <bjorn@lammers.media>

---------

Signed-off-by: Bjorn Lammers <bjorn@lammers.media>
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
Co-authored-by: Bjorn Lammers <bjorn@lammers.media>
2025-04-28 19:37:31 +02:00
dashboard-icons-manager[bot]
4138e10265 feat(icons): add nzbgeek (#1318)
* feat(icons): add nzbgeek

* fix(icons): trim empty spacing

Signed-off-by: Bjorn Lammers <bjorn@lammers.media>

---------

Signed-off-by: Bjorn Lammers <bjorn@lammers.media>
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
Co-authored-by: Bjorn Lammers <bjorn@lammers.media>
2025-04-28 19:34:56 +02:00
Thomas Camlong
321e969f6c Merge pull request #1320 from homarr-labs/feat/related-refine 2025-04-28 16:21:21 +02:00
Thomas Camlong
ea9b96ad6d fix(icons): Remove non-existing alternate URL (#1324) 2025-04-28 16:19:23 +02:00
Thomas Camlong
59ad9344b7 feat: make DISABLE_POSTHOG public (#1323)
For client side availabilty
2025-04-28 15:46:42 +02:00
Bjorn Lammers
50c3a92b29 fix(web): Run Biome checks and apply fixes 2025-04-27 22:59:33 +02:00
Bjorn Lammers
575dee0580 feat(icons/[id]): Refine related icons relevance, display limits, and styling 2025-04-27 22:57:56 +02:00
dashboard-icons-manager[bot]
23462d2980 feat(icons): add reactjs (#1300)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-27 17:29:48 +02:00
dashboard-icons-manager[bot]
832a4b76ae feat(icons): add viber (#1317)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-27 17:12:48 +02:00
dashboard-icons-manager[bot]
267b6d4400 feat(icons): add mailpit (#1315)
Co-authored-by: Dashboard Icons Manager <193821040+dashboard-icons-manager[bot]@users.noreply.github.com>
2025-04-27 17:12:30 +02:00
59 changed files with 575 additions and 95 deletions

12
meta/cup.json Normal file
View File

@@ -0,0 +1,12 @@
{
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-04-27T15:11:25.174121",
"author": {
"id": 77530549,
"login": "sergi0g"
}
}
}

View File

@@ -3,10 +3,14 @@
"aliases": [],
"categories": [],
"update": {
"timestamp": "2023-05-26T20:42:05Z",
"timestamp": "2025-04-28T18:59:35.544514",
"author": {
"id": 71191962,
"name": "walkxcode"
"login": "lammersbjorn"
}
},
"colors": {
"light": "jellystat",
"dark": "jellystat-dark"
}
}

14
meta/mailpit.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-04-27T15:11:19.986638",
"author": {
"id": 10742906,
"login": "zackad"
}
}
}

12
meta/nzbgeek.json Normal file
View File

@@ -0,0 +1,12 @@
{
"base": "png",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-04-27T15:13:05.869706",
"author": {
"id": 39389502,
"login": "TeHtloTs"
}
}
}

16
meta/reactjs.json Normal file
View File

@@ -0,0 +1,16 @@
{
"base": "svg",
"aliases": [
"react-js"
],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-04-26T23:03:30.306984",
"author": {
"id": 61716607,
"login": "lesolski"
}
}
}

16
meta/uptimerobot.json Normal file
View File

@@ -0,0 +1,16 @@
{
"base": "svg",
"aliases": [
"uptime-robot"
],
"categories": [
"Cloud"
],
"update": {
"timestamp": "2025-04-28T18:02:44.073299",
"author": {
"id": 69894187,
"login": "bunnypranav"
}
}
}

17
meta/viber.json Normal file
View File

@@ -0,0 +1,17 @@
{
"base": "svg",
"aliases": [
"viber-app",
"viber-messaging"
],
"categories": [
"Communication"
],
"update": {
"timestamp": "2025-04-27T15:12:16.037327",
"author": {
"id": 61716607,
"login": "lesolski"
}
}
}

14
meta/vitalpbx.json Normal file
View File

@@ -0,0 +1,14 @@
{
"base": "svg",
"aliases": [],
"categories": [
"Communication"
],
"update": {
"timestamp": "2025-04-28T18:04:39.889816",
"author": {
"id": 10834935,
"login": "djrarky"
}
}
}

View File

@@ -3,10 +3,10 @@
"aliases": [],
"categories": [],
"update": {
"timestamp": "2022-09-09T09:57:08Z",
"timestamp": "2025-04-28T18:01:22.158852",
"author": {
"id": 15933,
"name": "fabricionaweb"
"id": 77530549,
"login": "sergi0g"
}
}
}

18
meta/zen-browser.json Normal file
View File

@@ -0,0 +1,18 @@
{
"base": "svg",
"aliases": [
"zen"
],
"categories": [],
"update": {
"timestamp": "2025-04-28T17:40:35.244653",
"author": {
"id": 120695243,
"login": "theoneand33"
}
},
"colors": {
"light": "zen-browser",
"dark": "zen-browser-dark"
}
}

15
meta/zorin-linux.json Normal file
View File

@@ -0,0 +1,15 @@
{
"base": "svg",
"aliases": [
"zorin-os",
"zorin"
],
"categories": [],
"update": {
"timestamp": "2025-04-28T18:00:29.340232",
"author": {
"id": 57258250,
"login": "AnttiNannimus"
}
}
}

View File

@@ -198,6 +198,20 @@
}
}
},
"mailpit": {
"base": "svg",
"aliases": [],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-04-27T15:11:19.986638",
"author": {
"id": 10742906,
"login": "zackad"
}
}
},
"phoneinfoga": {
"base": "svg",
"aliases": [],
@@ -2004,6 +2018,21 @@
}
}
},
"zorin-linux": {
"base": "svg",
"aliases": [
"zorin-os",
"zorin"
],
"categories": [],
"update": {
"timestamp": "2025-04-28T18:00:29.340232",
"author": {
"id": 57258250,
"login": "AnttiNannimus"
}
}
},
"series-troxide": {
"base": "svg",
"aliases": [],
@@ -3123,6 +3152,18 @@
"light": "libreddit-light"
}
},
"nzbgeek": {
"base": "png",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-04-27T15:13:05.869706",
"author": {
"id": 39389502,
"login": "TeHtloTs"
}
}
},
"seelf": {
"base": "svg",
"aliases": [
@@ -3914,6 +3955,24 @@
}
}
},
"zen-browser": {
"base": "svg",
"aliases": [
"zen"
],
"categories": [],
"update": {
"timestamp": "2025-04-28T17:40:35.244653",
"author": {
"id": 120695243,
"login": "theoneand33"
}
},
"colors": {
"light": "zen-browser",
"dark": "zen-browser-dark"
}
},
"zipline": {
"base": "svg",
"aliases": [
@@ -6603,11 +6662,15 @@
"aliases": [],
"categories": [],
"update": {
"timestamp": "2023-05-26T20:42:05Z",
"timestamp": "2025-04-28T18:59:35.544514",
"author": {
"id": 71191962,
"name": "walkxcode"
"login": "lammersbjorn"
}
},
"colors": {
"light": "jellystat",
"dark": "jellystat-dark"
}
},
"xmrig": {
@@ -9985,6 +10048,20 @@
}
}
},
"vitalpbx": {
"base": "svg",
"aliases": [],
"categories": [
"Communication"
],
"update": {
"timestamp": "2025-04-28T18:04:39.889816",
"author": {
"id": 10834935,
"login": "djrarky"
}
}
},
"passwordpusher": {
"base": "png",
"aliases": [
@@ -11031,6 +11108,18 @@
}
}
},
"cup": {
"base": "svg",
"aliases": [],
"categories": [],
"update": {
"timestamp": "2025-04-27T15:11:25.174121",
"author": {
"id": 77530549,
"login": "sergi0g"
}
}
},
"private-internet-access": {
"base": "svg",
"aliases": [
@@ -11367,6 +11456,22 @@
}
}
},
"reactjs": {
"base": "svg",
"aliases": [
"react-js"
],
"categories": [
"Development"
],
"update": {
"timestamp": "2025-04-26T23:03:30.306984",
"author": {
"id": 61716607,
"login": "lesolski"
}
}
},
"hotio": {
"base": "svg",
"aliases": [],
@@ -13023,10 +13128,10 @@
"aliases": [],
"categories": [],
"update": {
"timestamp": "2022-09-09T09:57:08Z",
"timestamp": "2025-04-28T18:01:22.158852",
"author": {
"id": 15933,
"name": "fabricionaweb"
"id": 77530549,
"login": "sergi0g"
}
}
},
@@ -17528,6 +17633,22 @@
}
}
},
"uptimerobot": {
"base": "svg",
"aliases": [
"uptime-robot"
],
"categories": [
"Cloud"
],
"update": {
"timestamp": "2025-04-28T18:02:44.073299",
"author": {
"id": 69894187,
"login": "bunnypranav"
}
}
},
"infoblox": {
"base": "svg",
"aliases": [],
@@ -19467,6 +19588,23 @@
}
}
},
"viber": {
"base": "svg",
"aliases": [
"viber-app",
"viber-messaging"
],
"categories": [
"Communication"
],
"update": {
"timestamp": "2025-04-27T15:12:16.037327",
"author": {
"id": 61716607,
"login": "lesolski"
}
}
},
"docker-amd": {
"base": "png",
"aliases": [],

BIN
png/cup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 12 KiB

BIN
png/jellystat-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 12 KiB

BIN
png/mailpit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
png/nzbgeek.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
png/reactjs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
png/uptimerobot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
png/viber.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
png/vitalpbx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 25 KiB

BIN
png/zen-browser-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
png/zen-browser.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
png/zorin-linux.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

29
svg/cup.svg Normal file
View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
<path style="fill:#A6CFD6;" d="M65.12,17.55c-17.6-0.53-34.75,5.6-34.83,14.36c-0.04,5.2,1.37,18.6,3.62,48.68s2.25,33.58,3.5,34.95
c1.25,1.37,10.02,8.8,25.75,8.8s25.93-6.43,26.93-8.05c0.48-0.78,1.83-17.89,3.5-37.07c1.81-20.84,3.91-43.9,3.99-45.06
C97.82,30.66,94.2,18.43,65.12,17.55z"/>
<path style="fill:#DCEDF6;" d="M41.4,45.29c-0.12,0.62,1.23,24.16,2.32,27.94c1.99,6.92,9.29,7.38,10.23,4.16
c0.9-3.07-0.38-29.29-0.38-29.29s-3.66-0.3-6.43-0.84C44,46.63,41.4,45.29,41.4,45.29z"/>
<path style="fill:#6CA4AE;" d="M33.74,32.61c-0.26,8.83,20.02,12.28,30.19,12.22c13.56-0.09,29.48-4.29,29.8-11.7
S79.53,21.1,63.35,21.1C49.6,21.1,33.96,25.19,33.74,32.61z"/>
<path style="fill:#DC0D27;" d="M84.85,13.1c-0.58,0.64-9.67,30.75-9.67,30.75s2.01-0.33,4-0.79c2.63-0.61,3.76-1.06,3.76-1.06
s7.19-22.19,7.64-23.09c0.45-0.9,21.61-7.61,22.31-7.93c0.7-0.32,1.39-0.4,1.46-0.78c0.06-0.38-2.34-6.73-3.11-6.73
C110.47,3.47,86.08,11.74,84.85,13.1z"/>
<path style="fill:#8A1F0F;" d="M110.55,7.79c1.04,2.73,2.8,3.09,3.55,2.77c0.45-0.19,1.25-1.84,0.01-4.47
c-0.99-2.09-2.17-2.74-2.93-2.61C110.42,3.6,109.69,5.53,110.55,7.79z"/>
<g>
<path style="fill:#8A1F0F;" d="M91.94,18.34c-0.22,0-0.44-0.11-0.58-0.3l-3.99-5.77c-0.22-0.32-0.14-0.75,0.18-0.97
c0.32-0.22,0.76-0.14,0.97,0.18l3.99,5.77c0.22,0.32,0.14,0.75-0.18,0.97C92.21,18.3,92.07,18.34,91.94,18.34z"/>
</g>
<g>
<path style="fill:#8A1F0F;" d="M90.28,19.43c-0.18,0-0.35-0.07-0.49-0.2l-5.26-5.12c-0.28-0.27-0.28-0.71-0.01-0.99
c0.27-0.28,0.71-0.28,0.99-0.01l5.26,5.12c0.28,0.27,0.28,0.71,0.01,0.99C90.64,19.36,90.46,19.43,90.28,19.43z"/>
</g>
<g>
<path style="fill:#8A1F0F;" d="M89.35,21.22c-0.12,0-0.25-0.03-0.36-0.1l-5.6-3.39c-0.33-0.2-0.44-0.63-0.24-0.96
c0.2-0.33,0.63-0.44,0.96-0.24l5.6,3.39c0.33,0.2,0.44,0.63,0.24,0.96C89.82,21.1,89.59,21.22,89.35,21.22z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

13
svg/jellystat-dark.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

6
svg/mailpit.svg Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="500" height="460" viewBox="0 0 132.292 121.708" version="1.1" id="svg6" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<defs id="defs10"/>
<path d="M12.321 0l53.861 53.918L120.365 0zM5.155 9.025l60.842 59.673 61.211-59.489-.185 36.835L66.921 70.54l15.164 12.616-8.137 5.986-41.609.184c-4.838-.022-25.877-18.34-27.185-41.255z" fill-opacity=".941" fill="#2d4a5f" id="path2" style="fill:#ffffff;fill-opacity:1"/>
<path d="M78.385 72.049l53.907-21.679-8.031 57.318-11.845-9.132c-21.727 23.171-45.255 26.289-67.997 20.837S12.281 98.39 5.155 83.8-.67 53.116 2.843 38.769c1.13 10.511-1.313 16.316 6.38 33.612 6.31 11.399 14.413 20.417 25.89 24.956 13.9 6.195 32.247 3.357 41.701-3.039l14.24-12.156z" fill="#00b786" id="path4"/>
</svg>

After

Width:  |  Height:  |  Size: 828 B

9
svg/reactjs.svg Normal file
View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348">
<title>React Logo</title>
<circle cx="0" cy="0" r="2.05" fill="#61dafb"/>
<g stroke="#61dafb" stroke-width="1" fill="none">
<ellipse rx="11" ry="4.2"/>
<ellipse rx="11" ry="4.2" transform="rotate(60)"/>
<ellipse rx="11" ry="4.2" transform="rotate(120)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 366 B

1
svg/uptimerobot.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="298" height="298"><g fill="#3BD771" transform="translate(.9 .9)"><circle cx="148.1" cy="148.1" r="148.1" opacity=".3"/><circle cx="148.1" cy="148.1" r="98.9"/></g></svg>

After

Width:  |  Height:  |  Size: 216 B

1
svg/viber.svg Normal file
View File

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 631.99 666.43"><defs><style>.cls-1{fill:#7360f2;}.cls-2{fill:none;stroke:#7360f2;stroke-linecap:round;stroke-linejoin:round;stroke-width:16.86px;}</style></defs><title>Artboard 6</title><path class="cls-1" d="M560.65,65C544.09,49.72,477.17,1.14,328.11.48c0,0-175.78-10.6-261.47,68C18.94,116.19,2.16,186,.39,272.55S-3.67,521.3,152.68,565.28l.15,0-.1,67.11s-1,27.17,16.89,32.71c21.64,6.72,34.34-13.93,55-36.19,11.34-12.22,27-30.17,38.8-43.89,106.93,9,189.17-11.57,198.51-14.61,21.59-7,143.76-22.66,163.63-184.84C646.07,218.4,615.64,112.66,560.65,65Zm18.12,308.58C562,509,462.91,517.51,444.64,523.37c-7.77,2.5-80,20.47-170.83,14.54,0,0-67.68,81.65-88.82,102.88-3.3,3.32-7.18,4.66-9.77,4-3.64-.89-4.64-5.2-4.6-11.5.06-9,.58-111.52.58-111.52s-.08,0,0,0C38.94,485.05,46.65,347,48.15,274.71S63.23,143.2,103.57,103.37c72.48-65.65,221.79-55.84,221.79-55.84,126.09.55,186.51,38.52,200.52,51.24C572.4,138.6,596.1,233.91,578.77,373.54Z"/><path class="cls-2" d="M389.47,268.77q-2.46-49.59-50.38-52.09"/><path class="cls-2" d="M432.72,283.27q1-46.2-27.37-77.2c-19-20.74-45.3-32.16-79.05-34.63"/><path class="cls-2" d="M477,300.59q-.61-80.17-47.91-126.28t-117.65-46.6"/><path class="cls-1" d="M340.76,381.68s11.85,1,18.23-6.86l12.44-15.65c6-7.76,20.48-12.71,34.66-4.81A366.67,366.67,0,0,1,437,374.1c9.41,6.92,28.68,23,28.74,23,9.18,7.75,11.3,19.13,5.05,31.13,0,.07-.05.19-.05.25a129.81,129.81,0,0,1-25.89,31.88c-.12.06-.12.12-.23.18q-13.38,11.18-26.29,12.71a17.39,17.39,0,0,1-3.84.24,35,35,0,0,1-11.18-1.72l-.28-.41c-13.26-3.74-35.4-13.1-72.27-33.44a430.39,430.39,0,0,1-60.72-40.11,318.31,318.31,0,0,1-27.31-24.22l-.92-.92-.92-.92h0l-.92-.92c-.31-.3-.61-.61-.92-.92a318.31,318.31,0,0,1-24.22-27.31,430.83,430.83,0,0,1-40.11-60.71c-20.34-36.88-29.7-59-33.44-72.28l-.41-.28a35,35,0,0,1-1.71-11.18,16.87,16.87,0,0,1,.23-3.84Q141,181.42,152.12,168c.06-.11.12-.11.18-.23a129.53,129.53,0,0,1,31.88-25.88c.06,0,.18-.06.25-.06,12-6.25,23.38-4.13,31.12,5,.06.06,16.11,19.33,23,28.74a366.67,366.67,0,0,1,19.74,30.94c7.9,14.17,2.95,28.68-4.81,34.66l-15.65,12.44c-7.9,6.38-6.86,18.23-6.86,18.23S254.15,359.57,340.76,381.68Z"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

1
svg/vitalpbx.svg Normal file
View File

@@ -0,0 +1 @@
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 1280"><title>vitalpbx icon</title><path d="M533.64,28.83S-30.79,225.59,42.28,573.93c0,0,39.87,483.76,1162.14,677.24,0,0-1075.84-677.24,39.83-1109.43,0,0-1002.73,109.62-710.61,754.6C113.68,673.42,225,262.7,533.64,28.83Z" style="fill:#8ebf34;fill-rule:evenodd"/></svg>

After

Width:  |  Height:  |  Size: 357 B

View File

@@ -1 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" version="1.1" viewBox="0 0 512 512"><style>.st1{fill:#82201e}</style><g id="wireguard_svg__g327" transform="scale(.16)"><ellipse cx="1634.6" cy="1599.8" rx="206.5" ry="251.4" style="fill:#fff"/><path id="wireguard_svg__path80" d="M3197.2 1552.6S3271.2 0 1564.8 0C55.7 0 8.6 1489.4 8.6 1489.4s-222 1710.6 1591 1710.6c1738.9 0 1597.6-1647.4 1597.6-1647.4m-2109.8-542.5c320.2-195.9 729.2-76.2 882.5 218.4 29 55.8 32.7 141.8 14.3 200.3-63.5 202.2-213.5 315.6-419.3 363.8 60.7-51.9 109-110.9 124.4-192.3 16.2-78-1.4-159.2-48.5-223.5-74.9-103-209-143.8-328.6-100.2-126.7 48.1-196.2 163.8-183.6 306 11.6 132.1 111.8 217.7 299.3 250.2-28 14.8-49.6 25.7-70.7 37.5a682.4 682.4 0 0 0-219.1 190.6c-19 25.7-32.1 27.8-61.1 10-377-230.5-401.2-809 10.4-1060.8M805.3 2434.4c-60.6 15.4-119.2 38.1-181.1 58.4 30.3-204.3 269.5-392.4 471.8-371-58.6 80.7-92.8 176.6-98.6 276.2-67.3 12.5-130.6 20.8-192.1 36.4M2093.7 440c59.8 2.2 119.8 1.3 179.7 2.7 14.9 1 29.8 3.1 44.4 6.2-13.4 20.6-28.5 40-45.2 58-21.4 19.9-45.6 39.4-76.4 9.1-7.4-7.3-24.9-5.6-37.9-5.8-59.5-.8-119.2-2.7-178.6-.4-51.6 1.7-103 6.9-153.9 15.7-9.5 1.7-23.8 33.4-19.4 45.1 10.3 27.6 25.4 58 47.8 75.6 82.6 65.2 170.4 123.7 253.3 188.4 80.6 62.9 155.6 131.8 201.3 226.7 59.6 123.6 61.3 253.3 35.6 383.5-42.9 217.4-152.9 397.4-331 528.2-71.8 52.7-160.6 82.6-242.8 120.5-72.3 33.3-146.7 62-219.2 94.9-130.7 59.4-204.1 201.2-182.5 348.7 19.8 135.3 138.5 248.2 274.5 271.5 163.1 28 331.4-78 371.3-243.8 44.9-186.4-56.4-352.9-246-403.3-8.4-2.2-16.7-4.3-34.1-8.8 50.7-22.7 94.5-38.8 135-61.1 70.5-38.8 139.8-79.9 207.8-123.3 20-12.8 30.8-12.8 47.9 1.9 130.4 112.7 208.2 253 230 425 36.1 284.6-98.6 546.1-352.8 680.1-393.2 207.4-874.3-28.7-961.1-464.5-74.4-373.4 189.1-712 506.3-777.4 136.4-28.1 261.1-84.9 358.1-189.9 62.6-67.8 92.9-125.9 103.2-152.2 19.2-49.2 29.1-101.5 29-154.3-2.1-45.7-12.8-90.6-31.6-132.2-33.1-75.5-159.9-195.5-191.3-220.8l-298.7-233.8c-10.5-8.7-22.4-8-48.1-6.3-30.5 2.1-108.5 6.4-142.2-2.4 27.2-20.6 101.5-50.6 133.3-74.7-96.8-65.4-207.3-41.8-308.7-61.3 23.4-43.7 139.5-110.8 205.5-118.3-3.9-36.9-9.9-73.5-18-109.7-4-14.8-20.6-29.2-35.1-37.7-35.1-20.6-72.2-37.5-112.5-58 36.1-23.3 77.9-36.3 120.9-37.4 40.7-1.5 81.4 2.4 121 11.8 71.9 16.4 129.3 5.7 186.5-43.2-45-18.1-90.1-34.7-133.7-54.3-43-19.6-85-41.5-125.6-65.7 113.3 15.7 222.9 58.2 338.7 42.7l3-15.8L1432.3 57c160.4-14.7 309.8-17.1 451.2 51.8 39.8 19.4 81.4 35.4 119.6 57.6 18.6 10.8 31.1 32.1 46.4 48.6 12.1 13.1 21.9 30.8 36.8 38.7 56.5 30.1 118.8 31.2 182.2 29.7l1.4-21.3c63.8 19.9 135.6 93.5 135.5 147.3-103.4 0-206.7-.4-309.9.6-11 .1-22 8.2-33 12.5 10.3 6.1 20.6 17.1 31.2 17.5" class="st1"/><path id="wireguard_svg__path82" d="M1960.4 287c-7.4 4.6-9.6 14.4-5 21.8.8 1.3 1.8 2.5 3 3.5 6.5 11.4 21 15.4 32.5 8.9.1-.1.2-.1.3-.2 10-5 19.7-10.4 31.7-16.7-9.7-8.3-17.5-15.1-25.5-21.7-14.1-11.5-25.7-4.2-37 4.4" class="st1"/></g></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 300.00378 299.99999"
id="svg39"
width="300.00378"
height="300"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<style
id="style1">.a{fill:#88171a;}.b{fill:#231f20;}</style>
</defs>
<title
id="title1">wireguard</title>
<path
d="m 299.74526,145.56 c 0,0 6.9396,-145.56 -153.04,-145.56 C 5.2252602,0 0.80526022,139.63 0.80526022,139.63 c 0,0 -20.81100022,160.37 149.15999978,160.37 163.02,0 149.78,-154.44 149.78,-154.44 z"
id="path37"
style="fill:#88171a;fill-opacity:1" />
<path
id="path1"
style="fill:#ffffff;fill-opacity:1"
d="m 101.94526,94.697 c 30.017,-18.364 68.366,-7.1401 82.735,20.476 2.7233,5.2338 3.0694,13.291 1.3447,18.782 -5.9546,18.956 -20.014,29.587 -39.312,34.103 5.6892,-4.8707 10.218,-10.394 11.659,-18.025 a 26.402,26.402 0 0 0 -4.5425,-20.956 26.76,26.76 0 0 0 -30.811,-9.3892 c -11.881,4.5111 -18.389,15.354 -17.216,28.683 1.0898,12.381 10.484,20.405 28.061,23.453 -2.627,1.3904 -4.6503,2.4144 -6.6299,3.5172 a 63.918,63.918 0 0 0 -20.544,17.868 c -1.7839,2.4084 -3.0104,2.6024 -5.727,0.94116 -35.338,-21.61 -37.609,-75.844 0.98226,-99.453 z m -26.449,133.53 c -5.6769,1.441 -11.178,3.5742 -16.981,5.4775 2.8385,-19.151 25.265,-36.788 44.23,-34.776 a 48.881,48.881 0 0 0 -9.242,25.893 c -6.302,1.1606 -12.241,1.9414 -18.007,3.405 z m 120.79,-186.98 c 5.6099,0.20612 11.23,0.12091 16.844,0.25378 a 29.052,29.052 0 0 1 4.1674,0.58069 40.607,40.607 0 0 1 -4.2357,5.4332 c -2.007,1.8701 -4.2745,3.6986 -7.1661,0.856 -0.6955,-0.68372 -2.3386,-0.52679 -3.5487,-0.54272 -5.5823,-0.07336 -11.172,-0.25177 -16.746,-0.04132 a 104.04,104.04 0 0 0 -14.425,1.473 c -0.89368,0.16046 -2.2299,3.1315 -1.8191,4.227 0.9693,2.5853 2.3833,5.4363 4.4779,7.0898 7.7403,6.11 15.972,11.596 23.748,17.664 7.556,5.8966 14.589,12.358 18.875,21.253 5.5843,11.59 5.747,23.743 3.3388,35.95 -4.0203,20.378 -14.333,37.261 -31.032,49.524 -6.7288,4.941 -15.06,7.7451 -22.767,11.295 -6.778,3.1225 -13.755,5.8115 -20.549,8.9008 -12.249,5.5695 -19.133,18.865 -17.108,32.688 1.8585,12.685 12.987,23.271 25.735,25.456 15.292,2.6216 31.071,-7.3163 34.812,-22.86 4.2067,-17.478 -5.2898,-33.083 -23.065,-37.813 -0.78271,-0.20831 -1.5684,-0.40552 -3.2012,-0.8269 4.7549,-2.1245 8.8614,-3.6381 12.653,-5.7244 q 9.9213,-5.4594 19.481,-11.562 c 1.8742,-1.199 2.8868,-1.1996 4.4852,0.18225 12.225,10.57 19.518,23.718 21.563,39.839 3.3845,26.684 -9.2471,51.198 -33.072,63.762 -36.86,19.439 -81.965,-2.6864 -90.106,-43.552 -6.9738,-35.003 17.73,-66.754 47.462,-72.884 12.787,-2.6364 24.48,-7.9596 33.57,-17.807 5.8652,-6.3541 8.7084,-11.806 9.6772,-14.266 a 39.565,39.565 0 0 0 2.7211,-14.469 33.867,33.867 0 0 0 -2.9654,-12.398 c -3.104,-7.075 -14.995,-18.33 -17.939,-20.704 l -28,-21.921 c -0.98761,-0.81256 -2.0994,-0.75366 -4.5079,-0.59045 -2.8611,0.19391 -10.175,0.59888 -13.331,-0.22815 2.553,-1.9321 9.5132,-4.7451 12.502,-7.007 -9.0734,-6.1297 -19.43,-3.9158 -28.941,-5.7461 2.1992,-4.0959 13.081,-10.39 19.27,-11.091 a 91.533,91.533 0 0 0 -1.6876,-10.281 c -0.37781,-1.3917 -1.9312,-2.7408 -3.2864,-3.5355 -3.286,-1.9267 -6.7694,-3.5167 -10.549,-5.4327 a 21.936,21.936 0 0 1 11.332,-3.5055 42.316,42.316 0 0 1 11.348,1.1056 c 6.7422,1.5405 12.124,0.53491 17.488,-4.048 -4.222,-1.7002 -8.4435,-3.2535 -12.538,-5.0907 a 123.04,123.04 0 0 1 -11.779,-6.1583 c 10.622,1.4755 20.896,5.4585 31.757,4.0034 q 0.1387,-0.74048 0.27728,-1.4809 c -8.1194,-1.8899 -16.239,-3.7798 -25.229,-5.8724 15.04,-1.3769 29.042,-1.604 42.301,4.8541 3.731,1.8173 7.6348,3.3215 11.211,5.3972 1.7443,1.0124 2.9186,3.0078 4.3496,4.5594 1.1366,1.2325 2.0495,2.8837 3.446,3.6264 5.3,2.8184 11.134,2.9291 17.078,2.7879 0.0444,-0.67694 0.0861,-1.3114 0.1308,-1.9933 5.9821,1.8693 12.715,8.7679 12.704,13.806 -9.6911,0 -19.374,-0.037 -29.056,0.05389 -1.0348,0.0097 -2.0626,0.76563 -3.0936,1.1754 0.97986,0.57067 1.9428,1.5994 2.9423,1.6362 z" />
<path
class="a"
d="m 183.78526,26.906 a 1.4806,1.4806 0 0 0 -0.18927,2.3686 2.2326,2.2326 0 0 0 3.0724,0.8219 c 0.9328,-0.47052 1.8478,-0.97137 2.975,-1.5665 -0.9079,-0.775 -1.6362,-1.4148 -2.3857,-2.0324 -1.318,-1.086 -2.411,-0.40386 -3.4724,0.40833 z"
id="path38"
style="display:inline" />
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

27
svg/zen-browser-dark.svg Normal file
View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="82 82 860 860">
<g filter="url(#filter0_dd_637_5954)">
<rect x="82" y="82" width="860" height="860" rx="155.371" fill="#202020"/>
</g>
<circle cx="512.439" cy="512.439" r="113.02" stroke="#F2F0E3" stroke-width="25.1953"/>
<circle cx="512.439" cy="512.439" r="197.737" stroke="#F2F0E3" stroke-width="41.9922"/>
<circle cx="512.439" cy="512.439" r="298.266" stroke="#F2F0E3" stroke-width="58.7891"/>
<defs>
<filter id="filter0_dd_637_5954" x="74.4414" y="80.3203" width="875.117" height="878.477" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.839844" operator="dilate" in="SourceAlpha" result="effect1_dropShadow_637_5954"/>
<feOffset dy="5.87891"/>
<feGaussianBlur stdDeviation="3.35938"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_637_5954"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="10.0781"/>
<feGaussianBlur stdDeviation="3.35938"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_637_5954" result="effect2_dropShadow_637_5954"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_637_5954" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

27
svg/zen-browser.svg Normal file
View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="82 82 860 860">
<g filter="url(#filter0_dd_637_6627)">
<rect x="82" y="82" width="860" height="860" rx="155.371" fill="#F2F0E3"/>
</g>
<circle cx="512.439" cy="512.439" r="113.02" stroke="#202020" stroke-width="25.1953"/>
<circle cx="512.439" cy="512.439" r="197.737" stroke="#202020" stroke-width="41.9922"/>
<circle cx="512.439" cy="512.439" r="298.266" stroke="#202020" stroke-width="58.7891"/>
<defs>
<filter id="filter0_dd_637_6627" x="74.4414" y="80.3203" width="875.117" height="878.477" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.839844" operator="dilate" in="SourceAlpha" result="effect1_dropShadow_637_6627"/>
<feOffset dy="5.87891"/>
<feGaussianBlur stdDeviation="3.35938"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_637_6627"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="10.0781"/>
<feGaussianBlur stdDeviation="3.35938"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_637_6627" result="effect2_dropShadow_637_6627"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_637_6627" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

4
svg/zorin-linux.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 34.13 512 443.74">
<path d="m85.333 404.139 42.567 73.728h256.198l42.569-73.728H85.333ZM512 255.999l-42.938 74.412H196.608l272.454-148.822L512 255.999Zm-512 .003 42.938-74.412h272.454L42.938 330.41 0 256.002Zm85.333-148.14 42.567-73.73h256.198l42.569 73.728-341.334.002Z" fill="#15A6F0"/>
<path d="M85.334 107.861 42.938 181.59h272.454L42.938 330.41l42.395 73.729h341.334l42.395-73.728H196.608l272.454-148.822-42.395-73.728H85.334Z" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 516 B

View File

@@ -357,6 +357,7 @@
"css-light.png",
"css.png",
"ctfreak.png",
"cup.png",
"cups-light.png",
"cups.png",
"cura.png",
@@ -905,6 +906,7 @@
"jellyfin-vue.png",
"jellyfin.png",
"jellyseerr.png",
"jellystat-dark.png",
"jellystat.png",
"jelu.png",
"jenkins.png",
@@ -1065,6 +1067,7 @@
"mailgun.png",
"mailhog.png",
"mailjet.png",
"mailpit.png",
"mailu.png",
"mainsail.png",
"maintainerr.png",
@@ -1306,6 +1309,7 @@
"nvidia.png",
"nxfilter.png",
"nxlog.png",
"nzbgeek.png",
"nzbget.png",
"nzbhydra.png",
"nzbhydra2-light.png",
@@ -1641,6 +1645,7 @@
"rdt-client.png",
"reactive-resume-light.png",
"reactive-resume.png",
"reactjs.png",
"readarr.png",
"readeck.png",
"readthedocs-light.png",
@@ -2047,6 +2052,7 @@
"ups.png",
"upsnap.png",
"uptime-kuma.png",
"uptimerobot.png",
"upvote-rss.png",
"urbackup-server.png",
"urbackup.png",
@@ -2062,6 +2068,7 @@
"vercel.png",
"verizon.png",
"vi.png",
"viber.png",
"victoriametrics-light.png",
"victoriametrics.png",
"vidzy.png",
@@ -2073,6 +2080,7 @@
"viseron-light.png",
"viseron.png",
"visual-studio-code.png",
"vitalpbx.png",
"vite.png",
"vivaldi.png",
"vmware-esxi.png",
@@ -2219,6 +2227,8 @@
"zabbix.png",
"zabka.png",
"zammad.png",
"zen-browser-dark.png",
"zen-browser.png",
"zenarmor.png",
"zendesk.png",
"zerotier-light.png",
@@ -2236,6 +2246,7 @@
"zoom-alt.png",
"zoom.png",
"zoraxy.png",
"zorin-linux.png",
"zulip.png",
"zwavejs2mqtt.png",
"zyxel-communications-light.png",
@@ -2519,6 +2530,7 @@
"css-light.svg",
"css.svg",
"ctfreak.svg",
"cup.svg",
"cups-light.svg",
"cups.svg",
"cura.svg",
@@ -2977,6 +2989,7 @@
"jellyfin-vue.svg",
"jellyfin.svg",
"jellyseerr.svg",
"jellystat-dark.svg",
"jellystat.svg",
"jelu.svg",
"jenkins.svg",
@@ -3111,6 +3124,7 @@
"mailfence.svg",
"mailgun.svg",
"mailjet.svg",
"mailpit.svg",
"mainsail.svg",
"maintainerr.svg",
"manjaro-linux.svg",
@@ -3585,6 +3599,7 @@
"rdt-client.svg",
"reactive-resume-light.svg",
"reactive-resume.svg",
"reactjs.svg",
"readarr.svg",
"readeck.svg",
"readthedocs-light.svg",
@@ -3888,6 +3903,7 @@
"ups.svg",
"upsnap.svg",
"uptime-kuma.svg",
"uptimerobot.svg",
"upvote-rss.svg",
"valetudo.svg",
"valkey.svg",
@@ -3901,6 +3917,7 @@
"vercel.svg",
"verizon.svg",
"vi.svg",
"viber.svg",
"victoriametrics-light.svg",
"victoriametrics.svg",
"vidzy.svg",
@@ -3911,6 +3928,7 @@
"viseron-light.svg",
"viseron.svg",
"visual-studio-code.svg",
"vitalpbx.svg",
"vite.svg",
"vivaldi.svg",
"vmware-esxi.svg",
@@ -4020,6 +4038,8 @@
"zabbix.svg",
"zabka.svg",
"zammad.svg",
"zen-browser-dark.svg",
"zen-browser.svg",
"zenarmor.svg",
"zendesk.svg",
"zerotier-light.svg",
@@ -4035,6 +4055,7 @@
"zoom-alt.svg",
"zoom.svg",
"zoraxy.svg",
"zorin-linux.svg",
"zulip.svg",
"zyxel-communications-light.svg",
"zyxel-communications.svg",
@@ -4399,6 +4420,7 @@
"css-light.webp",
"css.webp",
"ctfreak.webp",
"cup.webp",
"cups-light.webp",
"cups.webp",
"cura.webp",
@@ -4947,6 +4969,7 @@
"jellyfin-vue.webp",
"jellyfin.webp",
"jellyseerr.webp",
"jellystat-dark.webp",
"jellystat.webp",
"jelu.webp",
"jenkins.webp",
@@ -5107,6 +5130,7 @@
"mailgun.webp",
"mailhog.webp",
"mailjet.webp",
"mailpit.webp",
"mailu.webp",
"mainsail.webp",
"maintainerr.webp",
@@ -5348,6 +5372,7 @@
"nvidia.webp",
"nxfilter.webp",
"nxlog.webp",
"nzbgeek.webp",
"nzbget.webp",
"nzbhydra.webp",
"nzbhydra2-light.webp",
@@ -5683,6 +5708,7 @@
"rdt-client.webp",
"reactive-resume-light.webp",
"reactive-resume.webp",
"reactjs.webp",
"readarr.webp",
"readeck.webp",
"readthedocs-light.webp",
@@ -6089,6 +6115,7 @@
"ups.webp",
"upsnap.webp",
"uptime-kuma.webp",
"uptimerobot.webp",
"upvote-rss.webp",
"urbackup-server.webp",
"urbackup.webp",
@@ -6104,6 +6131,7 @@
"vercel.webp",
"verizon.webp",
"vi.webp",
"viber.webp",
"victoriametrics-light.webp",
"victoriametrics.webp",
"vidzy.webp",
@@ -6115,6 +6143,7 @@
"viseron-light.webp",
"viseron.webp",
"visual-studio-code.webp",
"vitalpbx.webp",
"vite.webp",
"vivaldi.webp",
"vmware-esxi.webp",
@@ -6261,6 +6290,8 @@
"zabbix.webp",
"zabka.webp",
"zammad.webp",
"zen-browser-dark.webp",
"zen-browser.webp",
"zenarmor.webp",
"zendesk.webp",
"zerotier-light.webp",
@@ -6278,6 +6309,7 @@
"zoom-alt.webp",
"zoom.webp",
"zoraxy.webp",
"zorin-linux.webp",
"zulip.webp",
"zwavejs2mqtt.webp",
"zyxel-communications-light.webp",

View File

@@ -85,7 +85,6 @@ export async function generateMetadata({ params, searchParams }: Props, parent:
description: `Download the ${formattedIconName} icon in SVG, PNG, and WEBP formats for FREE. Part of a collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`,
},
alternates: {
canonical: pageUrl,
media: {
png: `${BASE_URL}/png/${icon}.png`,
svg: `${BASE_URL}/svg/${icon}.svg`,

View File

@@ -7,7 +7,7 @@ import { Suspense, useEffect } from "react"
export function PostHogProvider({ children }: { children: React.ReactNode }) {
useEffect(() => {
if (process.env.DISABLE_POSTHOG === "true") return
if (process.env.NEXT_PUBLIC_DISABLE_POSTHOG === "true") return
// biome-ignore lint/style/noNonNullAssertion: The NEXT_PUBLIC_POSTHOG_KEY environment variable is guaranteed to be set in production.
posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
ui_host: "https://eu.posthog.com",

View File

@@ -1,13 +1,13 @@
"use client"
import { Badge } from "@/components/ui/badge"
import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"
import { useMediaQuery } from "@/hooks/use-media-query"
import { formatIconName, fuzzySearch, filterAndSortIcons } from "@/lib/utils"
import { useRouter } from "next/navigation"
import { useCallback, useEffect, useState, useMemo } from "react"
import { filterAndSortIcons, formatIconName, fuzzySearch } from "@/lib/utils"
import type { IconWithName } from "@/types/icons"
import { Tag, Search as SearchIcon, Info } from "lucide-react"
import { Badge } from "@/components/ui/badge"
import { Info, Search as SearchIcon, Tag } from "lucide-react"
import { useRouter } from "next/navigation"
import { useCallback, useEffect, useMemo, useState } from "react"
interface CommandMenuProps {
icons: IconWithName[]
@@ -37,10 +37,7 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
[externalOnOpenChange],
)
const filteredIcons = useMemo(() =>
filterAndSortIcons({ icons, query, limit: 20 }),
[icons, query]
)
const filteredIcons = useMemo(() => filterAndSortIcons({ icons, query, limit: 20 }), [icons, query])
const totalIcons = icons.length
@@ -70,11 +67,7 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
}
return (
<CommandDialog
open={isOpen}
onOpenChange={setIsOpen}
contentClassName="bg-background/90 backdrop-blur-sm border border-border/60"
>
<CommandDialog open={isOpen} onOpenChange={setIsOpen} contentClassName="bg-background/90 backdrop-blur-sm border border-border/60">
<CommandInput
placeholder={`Search our collection of ${totalIcons} icons by name or category...`}
value={query}
@@ -83,7 +76,7 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
<CommandList className="max-h-[300px]">
{/* Icon Results */}
<CommandGroup heading="Icons">
{filteredIcons.length > 0 && (
{filteredIcons.length > 0 &&
filteredIcons.map(({ name, data }) => {
const formatedIconName = formatIconName(name)
const hasCategories = data.categories && data.categories.length > 0
@@ -97,7 +90,9 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
>
<div className="flex-shrink-0 h-5 w-5 relative">
<div className="h-full w-full bg-primary/10 dark:bg-primary/20 rounded-md flex items-center justify-center">
<span className="text-[9px] font-medium text-primary dark:text-primary-foreground">{name.substring(0, 2).toUpperCase()}</span>
<span className="text-[9px] font-medium text-primary dark:text-primary-foreground">
{name.substring(0, 2).toUpperCase()}
</span>
</div>
</div>
<span className="flex-grow capitalize font-medium text-sm">{formatedIconName}</span>
@@ -110,9 +105,7 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
className="text-xs font-normal inline-flex items-center gap-1 whitespace-nowrap max-w-[120px] overflow-hidden"
>
<Tag size={8} className="mr-1 flex-shrink-0" />
<span className="truncate">
{data.categories[0].replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())}
</span>
<span className="truncate">{data.categories[0].replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())}</span>
</Badge>
{/* "+N" badge if more than one category */}
{data.categories.length > 1 && (
@@ -124,8 +117,7 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
)}
</CommandItem>
)
})
)}
})}
</CommandGroup>
<CommandEmpty>
{/* Minimal empty state */}
@@ -138,12 +130,10 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
{/* Separator and Browse section - Styled div outside CommandList */}
<div className="border-t border-border/40 pt-1 mt-1 px-1 pb-1">
<div
role="button"
tabIndex={0}
className="flex items-center gap-2 cursor-pointer rounded-sm px-2 py-1 text-sm outline-none hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground"
<button
type="button"
className="flex items-center gap-2 cursor-pointer rounded-sm px-2 py-1 text-sm outline-none hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground w-full"
onClick={handleBrowseAll}
onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleBrowseAll() }}
>
<div className="flex-shrink-0 h-5 w-5 relative">
<div className="h-full w-full bg-primary/80 dark:bg-primary/40 rounded-md flex items-center justify-center">
@@ -151,7 +141,7 @@ export function CommandMenu({ icons, open: externalOpen, onOpenChange: externalO
</div>
</div>
<span className="flex-grow text-sm">Browse all icons {totalIcons} available</span>
</div>
</button>
</div>
</CommandDialog>
)

View File

@@ -10,7 +10,7 @@ import { formatIconName } from "@/lib/utils"
import type { AuthorData, Icon, IconFile } from "@/types/icons"
import confetti from "canvas-confetti"
import { motion } from "framer-motion"
import { Check, Copy, Download, FileType, Github, Moon, PaletteIcon, Sun } from "lucide-react"
import { ArrowRight, Check, Copy, Download, FileType, Github, Moon, PaletteIcon, Sun } from "lucide-react"
import dynamic from "next/dynamic"
import Image from "next/image"
import Link from "next/link"
@@ -479,31 +479,63 @@ export function IconDetails({ icon, iconData, authorData, allIcons }: IconDetail
</Card>
</div>
</div>
{iconData.categories && iconData.categories.length > 0 && (
<section className="container mx-auto mt-12" aria-labelledby="related-icons-title">
<Card className="bg-background/50 border shadow-lg">
<CardHeader>
<CardTitle>
<h2 id="related-icons-title">Related Icons</h2>
</CardTitle>
<CardDescription>
Other icons from {iconData.categories.map((cat) => cat.replace(/-/g, " ")).join(", ")} categories
</CardDescription>
</CardHeader>
<CardContent>
<IconsGrid
filteredIcons={Object.entries(allIcons)
.filter(([name, data]) => {
if (name === icon) return false
return data.categories?.some((cat) => iconData.categories?.includes(cat))
})
.map(([name, data]) => ({ name, data }))}
matchedAliases={{}}
/>
</CardContent>
</Card>
</section>
)}
{iconData.categories &&
iconData.categories.length > 0 &&
(() => {
const MAX_RELATED_ICONS = 16
const currentCategories = iconData.categories || []
const relatedIconsWithScore = Object.entries(allIcons)
.map(([name, data]) => {
if (name === icon) return null // Exclude the current icon
const otherCategories = data.categories || []
const commonCategories = currentCategories.filter((cat) => otherCategories.includes(cat))
const score = commonCategories.length
return score > 0 ? { name, data, score } : null
})
.filter((item): item is { name: string; data: Icon; score: number } => item !== null) // Type guard
.sort((a, b) => b.score - a.score) // Sort by score DESC
const topRelatedIcons = relatedIconsWithScore.slice(0, MAX_RELATED_ICONS)
const viewMoreUrl = `/icons?${currentCategories.map((cat) => `category=${encodeURIComponent(cat)}`).join("&")}`
if (topRelatedIcons.length === 0) return null
return (
<section className="container mx-auto mt-12" aria-labelledby="related-icons-title">
<Card className="bg-background/50 border shadow-lg">
<CardHeader>
<CardTitle>
<h2 id="related-icons-title">Related Icons</h2>
</CardTitle>
<CardDescription>
Other icons from {currentCategories.map((cat) => cat.replace(/-/g, " ")).join(", ")} categories
</CardDescription>
</CardHeader>
<CardContent>
<IconsGrid filteredIcons={topRelatedIcons} matchedAliases={{}} />
{relatedIconsWithScore.length > MAX_RELATED_ICONS && (
<div className="mt-6 text-center">
<Button
asChild
variant="link"
className="text-muted-foreground hover:text-primary transition-colors duration-200 hover:no-underline"
>
<Link href={viewMoreUrl} className="no-underline">
View all related icons
<ArrowRight className="ml-2 h-4 w-4" />
</Link>
</Button>
</div>
)}
</CardContent>
</Card>
</section>
)
})()}
</main>
)
}

View File

@@ -17,6 +17,7 @@ import {
} from "@/components/ui/dropdown-menu"
import { Input } from "@/components/ui/input"
import { Separator } from "@/components/ui/separator"
import { type SortOption, filterAndSortIcons } from "@/lib/utils"
import type { IconSearchProps } from "@/types/icons"
import { ArrowDownAZ, ArrowUpZA, Calendar, Filter, Search, SortAsc, X } from "lucide-react"
import { useTheme } from "next-themes"
@@ -24,7 +25,6 @@ import { usePathname, useRouter, useSearchParams } from "next/navigation"
import posthog from "posthog-js"
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
import { toast } from "sonner"
import { filterAndSortIcons, SortOption } from "@/lib/utils"
export function IconSearch({ icons }: IconSearchProps) {
const searchParams = useSearchParams()

View File

@@ -1,6 +1,6 @@
import type { IconWithName } from "@/types/icons"
import { type ClassValue, clsx } from "clsx"
import { twMerge } from "tailwind-merge"
import type { IconWithName } from "@/types/icons"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
@@ -173,41 +173,40 @@ export function filterAndSortIcons({
// Filter by categories if any are selected
if (categories.length > 0) {
filtered = filtered.filter(({ data }) =>
data.categories.some((cat) =>
categories.some((selectedCat) => cat.toLowerCase() === selectedCat.toLowerCase()),
),
data.categories.some((cat) => categories.some((selectedCat) => cat.toLowerCase() === selectedCat.toLowerCase())),
)
}
if (query.trim()) {
const queryWords = query.toLowerCase().split(/\s+/)
const scored = filtered.map((icon) => {
const nameScore = fuzzySearch(icon.name, query) * NAME_WEIGHT
const aliasScore =
icon.data.aliases && icon.data.aliases.length > 0
? Math.max(...icon.data.aliases.map((alias) => fuzzySearch(alias, query))) * ALIAS_WEIGHT
: 0
const categoryScore =
icon.data.categories && icon.data.categories.length > 0
? Math.max(...icon.data.categories.map((category) => fuzzySearch(category, query))) * CATEGORY_WEIGHT
: 0
const scored = filtered
.map((icon) => {
const nameScore = fuzzySearch(icon.name, query) * NAME_WEIGHT
const aliasScore =
icon.data.aliases && icon.data.aliases.length > 0
? Math.max(...icon.data.aliases.map((alias) => fuzzySearch(alias, query))) * ALIAS_WEIGHT
: 0
const categoryScore =
icon.data.categories && icon.data.categories.length > 0
? Math.max(...icon.data.categories.map((category) => fuzzySearch(category, query))) * CATEGORY_WEIGHT
: 0
const maxScore = Math.max(nameScore, aliasScore, categoryScore)
const maxScore = Math.max(nameScore, aliasScore, categoryScore)
// Penalize if only category matches
const onlyCategoryMatch =
categoryScore > 0.7 && nameScore < 0.5 && aliasScore < 0.5
const finalScore = onlyCategoryMatch ? maxScore * CATEGORY_PENALTY : maxScore
// Penalize if only category matches
const onlyCategoryMatch = categoryScore > 0.7 && nameScore < 0.5 && aliasScore < 0.5
const finalScore = onlyCategoryMatch ? maxScore * CATEGORY_PENALTY : maxScore
// Require all query words to be present in at least one field
const allWordsPresent = queryWords.every((word) =>
icon.name.toLowerCase().includes(word) ||
icon.data.aliases.some((alias) => alias.toLowerCase().includes(word)) ||
icon.data.categories.some((cat) => cat.toLowerCase().includes(word))
)
// Require all query words to be present in at least one field
const allWordsPresent = queryWords.every(
(word) =>
icon.name.toLowerCase().includes(word) ||
icon.data.aliases.some((alias) => alias.toLowerCase().includes(word)) ||
icon.data.categories.some((cat) => cat.toLowerCase().includes(word)),
)
return { icon, score: allWordsPresent ? finalScore : finalScore * 0.4 }
})
return { icon, score: allWordsPresent ? finalScore : finalScore * 0.4 }
})
.filter((item) => item.score > 0.7)
.sort((a, b) => {
if (b.score !== a.score) return b.score - a.score

BIN
webp/cup.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
webp/jellystat-dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 B

After

Width:  |  Height:  |  Size: 28 KiB

BIN
webp/mailpit.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
webp/nzbgeek.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
webp/reactjs.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
webp/uptimerobot.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
webp/viber.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
webp/vitalpbx.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 70 KiB

BIN
webp/zen-browser-dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
webp/zen-browser.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
webp/zorin-linux.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB