feat(ui): integrate official Homarr dashboard-icons for workloads and services hub
CI & Build NaxOS Web Dashboard / build (push) Successful in 7m59s

This commit is contained in:
Lukas Holzner
2026-09-04 12:16:42 +02:00
parent cb7a7e3e43
commit 7ae0b3aad4
36 changed files with 371 additions and 24 deletions
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M244-12C165.9-12 71.8 6.4-5.8 46.8c0 87.2-1 304.6 249.8 453.2C494.8 351.4 493.8 134 493.8 46.8 416.2 6.4 322.1-12 244-12" style="fill-rule:evenodd;clip-rule:evenodd;fill:#68bc71" transform="translate(12 12)"/><path d="M243.7 499.8C-6.8 351.3-5.8 134-5.8 46.8 71.7 6.4 165.7-12 243.7-12z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#67b279" transform="translate(12 12)"/><path d="m234.9 329.6 151-203.6c-11.1-8.9-20.8-2.6-26.1 2.2h-.2l-125.9 131-47.4-57.1c-22.6-26.2-53.4-6.2-60.6-.9z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff" transform="translate(12 12)"/></svg>

After

Width:  |  Height:  |  Size: 672 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="-0.07 71.3 511.97 369.5"><path d="M501.4 212.3c-11.5-8-38-11-58.6-7-2.4-20-13.5-37.5-32.7-53l-11-8-7.7 11.5c-9.6 15-14.4 36-13 56 .5 7 2.9 19.5 10.1 30.5-6.7 4-20.7 9-38.9 9H2.3l-1 4c-3.4 20-3.4 82.5 36 130.5 29.8 36.5 74 55 132.1 55 125.9 0 219.1-60.5 262.8-170 17.3.5 54.3 0 73-37.5.5-1 1.4-3 4.8-10.5l1.9-4zM280 71.3h-52.8v50H280zm0 60h-52.8v50H280zm-62.5 0h-52.8v50h52.8zm-62.4 0h-52.8v50h52.8zm-62.5 60H39.8v50h52.8zm62.5 0h-52.8v50h52.8zm62.4 0h-52.8v50h52.8zm62.5 0h-52.8v50H280zm62.4 0h-52.8v50h52.8z" style="fill:#2396ed"/></svg>

After

Width:  |  Height:  |  Size: 608 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="svg44" width="560" height="560" style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" version="1.1"><defs id="defs4"><style id="style2" type="text/css">.fil1{fill:#fefefe}.fil6{fill:#006498}.fil5{fill:#bdeaff}</style></defs><g id="g85" transform="translate(-70 -70)"><path id="path9" d="M350 71c154 0 279 125 279 279S504 629 350 629 71 504 71 350 196 71 350 71" class="fil1" style="fill:#fefefe"/><path id="path11" d="m475 236 118 151c3 116-149 252-292 198l-76-99 114-156s138-95 136-94" style="fill:#332c2b;fill-opacity:.14902003"/><path id="path13" d="M231 211h208l38 24v246c0 5-3 8-8 8H231c-5 0-8-3-8-8V219c0-5 3-8 8-8" style="fill:#2bbcff"/><path id="path15" d="M231 211h208l38 24v2l-37-23H231c-4 0-7 3-7 7v263c-1-1-1-2-1-3V219c0-5 3-8 8-8" style="fill:#53c6fc"/><path id="polygon17" d="M305 212h113v98H305z" class="fil5" style="fill:#bdeaff"/><path id="path19" d="M255 363h189c3 0 5 2 5 4v116H250V367c0-2 2-4 5-4" class="fil5" style="fill:#bdeaff"/><path id="polygon21" d="M250 470h199v13H250z" class="fil6" style="fill:#006498"/><path id="path23" d="M380 226h10c3 0 6 2 6 5v40c0 3-3 6-6 6h-10c-3 0-6-3-6-6v-40c0-3 3-5 6-5" class="fil6" style="fill:#006498"/><path id="path25" d="M254 226c10 0 17 7 17 17 0 9-7 16-17 16-9 0-17-7-17-16 0-10 8-17 17-17" class="fil1" style="fill:#fefefe"/><path id="path27" d="M267 448h165q3 0 3 3c0 1-1 3-3 3H267c-2 0-3-2-3-3q0-3 3-3" class="fil6" style="fill:#006498"/><path id="path29" d="M267 415h165q3 0 3 3c0 1-1 2-3 2H267c-2 0-3-1-3-2q0-3 3-3" class="fil6" style="fill:#006498"/><path id="path31" d="M267 381h165c2 0 3 2 3 3q0 3-3 3H267q-3 0-3-3c0-1 1-3 3-3" class="fil6" style="fill:#006498"/><path id="path33" d="M236 472c3 0 5 2 5 5 0 2-2 4-5 4s-5-2-5-4c0-3 2-5 5-5" class="fil1" style="fill:#fefefe"/><path id="path35" d="M463 472c3 0 5 2 5 5 0 2-2 4-5 4s-5-2-5-4c0-3 2-5 5-5" class="fil1" style="fill:#fefefe"/><path id="polygon37" d="M305 212h-21v98h21z" class="fil6" style="fill:#006498"/><path id="path39" d="M477 479v2c0 5-3 8-8 8H231c-5 0-8-3-8-8v-2c0 4 3 8 8 8h238c5 0 8-4 8-8" style="fill:#0ea5eb"/><path id="path41" d="M350 70c155 0 280 125 280 280S505 630 350 630 70 505 70 350 195 70 350 70m0 46c129 0 234 105 234 234S479 584 350 584 116 479 116 350s105-234 234-234" style="fill:#2979ff"/></g></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="1.45 18.97 197.1 162.08"><path stroke="#000" stroke-width="1.357" d="M149.083 19.651c-6.938.304-8.437.573-12.624 1.148a192 192 0 0 0-17.513 3.228c-5.76 1.345-11.42 3.088-17.069 4.843-7.437 2.31-14.802 4.85-22.133 7.476-5.22 1.87-10.065 6.652-15.558 5.892-4.338-.6-6.828-5.52-10.56-7.813-4.626-2.843-9.49-5.368-14.563-7.305-4.676-1.784-9.574-2.993-14.493-3.92-3.414-.643-6.888-1.154-10.363-1.129-3.442.025-12.833-1.154-10.249 1.27 9.854 9.243 10.76 28.896 9.73 34.882-1.433 8.33-8.053 15.78-9.936 24.338-1.787 8.116-1.987 16.639-1.14 24.906.745 7.272 2.426 14.581 5.425 21.248 3.37 7.489 11.194 17.344 13.82 20.395l-11.66 23.607s5.683-3.953 18.391-15.526c2.678 3.125 8.756 7.34 13.568 10.39 3.85 2.439 7.874 4.693 12.152 6.265 8.748 3.216 17.944 5.598 27.235 6.332 7.006.553 14.15-.065 21.031-1.492 5.505-1.142 10.795-3.265 15.91-5.595 4.999-2.278 9.784-5.055 14.326-8.145 4.334-2.948 8.52-6.179 12.25-9.862a78.7 78.7 0 0 0 10.185-12.332c2.688-4.037 5.035-8.349 6.78-12.873.91-2.358.207-5.457 1.887-7.345 2.162-2.427 6.216-2.006 9.102-3.503 3.224-1.674 6.314-3.682 9.059-6.062 3.42-2.966 6.632-6.293 9.075-10.106 2.053-3.206 3.461-6.83 4.529-10.485 1.072-3.668 1.738-7.497 1.84-11.317.04-1.632 1.044-4.427-.528-4.869-2.637-.741-2.991 4.665-5.012 6.515-3.473 3.18-7.59 5.722-11.91 7.593-3.621 1.568-7.62 2.073-11.472 2.926-2.425.538-5.412.131-7.323 1.381-4.42 3.142-2.058 8.624-6.225 8.264-3.86-2.9-2.214-5.932-4.766-7.352-2.649-1.474-6.062-.195-9.093-.178-3.423.02-6.845.538-10.26.318-3.176-.204-6.553-.157-9.43-1.518-1.704-.806-5.35-2.223-4.235-3.743 1.234-1.682 7.495-9.74 13.122-16.14-10.657-1.46-16.34-2.645-26.902-5.574-.61-.17.417-1.454 1.034-1.593 10.451-2.362 10.003-2.482 31.261-6.547 11.93-23.238 12.088-33.337 13.305-40.893zm-42.292 81.852s1.056 1.249 1.625 1.837c2.425 2.512 4.879 5.02 7.601 7.207 3.954 3.175 7.952 6.506 12.605 8.523 5.367 2.327 11.01 3.65 17.111 3.891-.127 5.148-2.282 9.367-4.678 13.475a25.7 25.7 0 0 1-6.456 7.333c-2.473 1.907-5.331 3.492-8.373 4.196-3.986.923-8.253.642-12.274-.117-3.157-.596-6.186-1.893-9.008-3.43-2.506-1.364-5.136-2.824-6.9-5.067-1.602-2.038-2.48-4.637-2.994-7.177-.498-2.459-.313-5.032-.031-7.525.312-2.742.934-5.472 1.89-8.062 1.096-2.97 2.611-5.802 4.36-8.442 1.59-2.4 5.52-6.642 5.52-6.642z" opacity=".748"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="main_outline" x="0" y="0" version="1.1" viewBox="-0.05 98.32 512.15 315.48"><style>.st1{fill:#609926}</style><path id="teabag" d="m317.8 376-103.4-49.7c-10.2-4.9-14.6-17.3-9.6-27.5l49.7-103.4c4.9-10.2 17.3-14.6 27.5-9.6 14 6.8 22.1 10.6 22.1 10.6l-.1-88.9 13.6-.1.1 95.4s46.8 19.7 67.7 32.7c3 1.9 8.3 5.5 10.5 11.7 1.7 5 1.6 10.7-.8 15.7l-49.7 103.4c-5 10.3-17.4 14.7-27.6 9.7" style="fill:#fff"/><path d="M502.6 103.7c-3.3-3.3-7.8-3.3-7.8-3.3s-95.5 5.4-144.9 6.5c-10.8.2-21.6.5-32.3.6V203c-4.5-2.1-9-4.3-13.5-6.4 0-29.6-.1-88.9-.1-88.9-23.6.3-72.7-1.8-72.7-1.8s-115.2-5.8-127.7-6.9c-8-.5-18.3-1.7-31.8 1.2-7.1 1.5-27.3 6-43.8 21.9C-8.7 154.8.7 206.7 1.9 214.5c1.4 9.5 5.6 36 25.8 59 37.3 45.7 117.6 44.6 117.6 44.6s9.9 23.5 24.9 45.2c20.4 27 41.3 48 61.7 50.5 51.3 0 153.9-.1 153.9-.1s9.8.1 23-8.4c11.4-6.9 21.6-19.1 21.6-19.1s10.5-11.2 25.2-36.9c4.5-7.9 8.2-15.6 11.5-22.8 0 0 45-95.4 45-188.2-1-28-7.9-33-9.5-34.6M97.7 269.9c-21.1-6.9-30.1-15.2-30.1-15.2S52 243.8 44.2 222.3c-13.4-36-1.1-58-1.1-58s6.8-18.3 31.4-24.4c11.2-3 25.2-2.5 25.2-2.5s5.8 48.4 12.8 76.7c5.9 23.8 20.2 63.3 20.2 63.3s-21.3-2.6-35-7.5m244.6 87.6s-5 11.8-16 12.5c-4.7.3-8.4-1-8.4-1s-.2-.1-4.3-1.7l-92-44.8s-8.9-4.6-10.4-12.7c-1.8-6.6 2.2-14.7 2.2-14.7l44.2-91.1s3.9-7.9 9.9-10.6c.5-.2 1.9-.8 3.7-1.2 6.6-1.7 14.7 2.3 14.7 2.3l90.2 43.7s10.3 4.6 12.5 13.2c1.5 6-.4 11.4-1.5 14-5.2 12.6-44.8 92.1-44.8 92.1" class="st1"/><path d="M261.6 291.2c-6.7.1-12.5 4.7-14.1 11.2-1.5 6.5 1.6 13.3 7.4 16.3 6.3 3.3 14.3 1.5 18.5-4.4 4.2-5.8 3.5-13.8-1.5-18.8l19.5-40c1.2.1 3 .2 5-.4 3.3-.7 5.8-2.9 5.8-2.9 3.4 1.5 7 3.1 10.8 5 3.9 2 7.6 4 10.9 5.9.7.4 1.5.9 2.3 1.5 1.3 1.1 2.8 2.5 3.8 4.5 1.5 4.5-1.5 12.1-1.5 12.1-1.9 6.2-15 33.1-15 33.1-6.6-.2-12.5 4.1-14.4 10.2-2.1 6.6.9 14.1 7.2 17.3 6.4 3.3 14.2 1.4 18.3-4.3 4.1-5.5 3.7-13.3-.9-18.4l4.6-9.2c4.1-8.5 11-24.8 11-24.8.7-1.4 4.6-8.4 2.2-17.3-2-9.3-10.3-13.6-10.3-13.6-9.9-6.4-23.8-12.4-23.8-12.4s0-3.3-.9-5.8-2.3-4.2-3.2-5.1c3.8-7.9 7.7-15.7 11.5-23.6-3.3-1.6-6.6-3.3-9.9-5-3.9 8-7.9 16-11.8 24-5.5-.1-10.5 2.9-13.1 7.7-2.8 5.1-2.2 11.5 1.5 16.1-6.6 13.8-13.3 27.5-19.9 41.1" class="st1"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><linearGradient id="a" x1="256" x2="256" y1="359.964" y2="4.738" gradientTransform="matrix(1 0 0 -1 0 513)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#f05a28"/><stop offset="1" style="stop-color:#fbca0a"/></linearGradient><path d="M490.8 226c-.8-8.6-2.3-18.5-5.1-29.5-2.8-10.9-7.1-22.8-13.3-35.3-6.2-12.4-14.2-25.2-24.7-37.8-4.1-4.9-8.6-9.7-13.4-14.4 7.2-28.6-8.7-53.5-8.7-53.5-27.5-1.7-45 8.6-51.5 13.3-1.1-.4-2.1-1-3.2-1.4-4.7-1.8-9.5-3.7-14.5-5.2-4.9-1.6-10-3-15.2-4.2-5.2-1.3-10.4-2.3-15.8-3.1-1-.1-1.8-.3-2.8-.4C310.6 16.1 276.1 0 276.1 0c-38.5 24.4-45.7 58.5-45.7 58.5s-.1.7-.4 2c-2.1.6-4.2 1.3-6.3 1.8-3 .8-5.9 2-8.7 3.1-3 1.1-5.8 2.3-8.7 3.5-5.8 2.5-11.6 5.4-17.2 8.5-5.5 3.1-10.9 6.5-16.1 10l-1.4-.6C118.2 66.6 70.9 91 70.9 91c-4.4 56.7 21.3 92.4 26.4 98.9-1.3 3.5-2.4 7.1-3.5 10.6-3.9 12.8-6.9 26-8.7 39.6-.3 2-.6 3.9-.7 5.9-49.4 24.4-63.9 74.2-63.9 74.2 41 47.3 89 50.2 89 50.2l.1-.1q9.15 16.35 21 30.9c3.4 4.1 6.8 7.9 10.4 11.7-15 42.9 2.1 78.4 2.1 78.4 45.7 1.7 75.7-20 82.1-25 4.5 1.6 9.2 3 13.8 4.1 14.1 3.7 28.5 5.8 42.9 6.3 3.5.1 7.2.3 10.7.1h5.1l2.3-.1v.1c21.6 30.7 59.4 35.1 59.4 35.1 26.9-28.4 28.5-56.6 28.5-62.6v-2.5c5.6-3.9 11-8.2 16.1-12.8 10.7-9.7 20.2-20.9 28.1-32.9.7-1.1 1.4-2.3 2.1-3.4 30.5 1.7 52-18.9 52-18.9-5.1-31.7-23.1-47.3-26.9-50.2 0 0-.1-.1-.4-.3-.3-.1-.3-.3-.3-.3-.1-.1-.4-.3-.7-.4.1-2 .3-3.8.4-5.8.3-3.4.3-6.9.3-10.3v-5.3l-.1-2.1-.1-2.8c0-1-.1-1.8-.3-2.7s-.1-1.8-.3-2.7l-.3-2.7-.4-2.7c-.6-3.5-1.1-6.9-2-10.4-3.2-13.7-8.6-26.7-15.5-38.4-7.1-11.7-15.8-22-25.8-30.7-9.9-8.7-21-15.8-32.6-21-11.7-5.2-23.8-8.6-36-10.2-6.1-.8-12.1-1.1-18.2-1h-4.6l-2.3.1c-.8 0-1.7.1-2.4.1-3.1.3-6.2.7-9.2 1.3-12.1 2.3-23.6 6.6-33.6 12.7s-18.8 13.5-25.8 22c-7.1 8.5-12.6 17.9-16.4 27.6s-5.9 19.9-6.5 29.6c-.1 2.4-.1 4.9-.1 7.3v1.8l.1 2c.1 1.1.1 2.4.3 3.5.4 4.9 1.4 9.7 2.7 14.2 2.7 9.2 6.9 17.5 12.1 24.5 5.2 7.1 11.6 12.8 18.2 17.5 6.6 4.5 13.8 7.8 20.9 9.9s14.1 3 20.7 3h3.7c.5 0 .8 0 1.3-.1.7 0 1.4-.1 2.1-.1.1 0 .4 0 .6-.1l.7-.1c.4 0 .8-.1 1.3-.1.8-.1 1.6-.3 2.4-.4s1.6-.3 2.3-.6c1.6-.3 3-.8 4.4-1.3 2.8-1 5.6-2.1 8-3.4 2.5-1.3 4.8-2.8 7.1-4.2.6-.4 1.3-.8 1.8-1.4 2.3-1.8 2.7-5.2.8-7.5-1.6-2-4.4-2.5-6.6-1.3-.6.3-1.1.6-1.7.8-2 1-3.9 1.8-6.1 2.5-2.1.7-4.4 1.3-6.6 1.7-1.1.1-2.3.3-3.5.4-.6 0-1.1.1-1.8.1h-3.4c-.7 0-1.4 0-2.1-.1h-.8c-.3 0-.7 0-1-.1-.7-.1-1.3-.1-2-.3-5.2-.7-10.4-2.3-15.4-4.5-5.1-2.3-9.9-5.4-14.2-9.3s-8.2-8.6-11.1-14c-3-5.4-5.1-11.3-6.1-17.5-.4-3.1-.7-6.3-.6-9.5 0-.8.1-1.7.1-2.5v-1.1c0-.4.1-.8.1-1.3.1-1.7.4-3.4.7-5.1 2.4-13.5 9.2-26.8 19.6-36.8 2.7-2.5 5.5-4.8 8.5-6.9s6.2-3.9 9.6-5.5 6.8-2.8 10.4-3.8c3.5-1 7.2-1.6 11-2 1.8-.1 3.7-.3 5.6-.3h4.4l1.6.1c4.1.3 8 .8 12 1.8 7.9 1.7 15.7 4.7 22.8 8.6 14.4 8 26.7 20.5 34.1 35.4 3.8 7.5 6.5 15.5 7.8 23.8.3 2.1.6 4.2.7 6.3l.1 1.6.1 1.6v6.2c0 1-.1 2.7-.1 3.7-.1 2.3-.4 4.7-.7 6.9-.3 2.3-.7 4.5-1.1 6.8s-1 4.5-1.6 6.6c-1.1 4.4-2.5 8.7-4.2 13.1-3.4 8.5-7.9 16.6-13.3 24.1-10.9 15-25.7 27.1-42.6 34.8-8.5 3.8-17.3 6.6-26.5 8-4.5.8-9.2 1.3-13.8 1.4h-7c-2.5 0-4.9-.1-7.5-.4-9.9-.7-19.6-2.5-29.2-5.2-9.5-2.7-18.6-6.5-27.4-11-17.3-9.3-33-22-45.1-37.4-6.1-7.6-11.4-15.9-15.8-24.5s-7.9-17.8-10.4-26.9c-2.5-9.3-4.1-18.8-4.8-28.4l-.1-1.8v-12.2c.1-4.7.6-9.6 1.1-14.4.6-4.8 1.4-9.7 2.4-14.5s2.1-9.6 3.5-14.4c2.7-9.5 6.1-18.6 10-27.2 8-17.2 18.5-32.6 31-44.9 3.1-3.1 6.3-5.9 9.7-8.7 3.4-2.7 6.9-5.2 10.6-7.6 3.5-2.4 7.3-4.5 11.1-6.5 1.8-1 3.8-2 5.8-2.8 1-.4 2-.8 3-1.3 1-.4 2-.8 3-1.3 3.9-1.7 8-3.1 12.3-4.4 1-.3 2.1-.6 3.1-1 1-.3 2.1-.6 3.1-.8 2.1-.6 4.2-1.1 6.3-1.6 1-.3 2.1-.4 3.2-.7s2.1-.4 3.2-.7c1.1-.1 2.1-.4 3.2-.6l1.6-.3 1.7-.3c1.1-.1 2.1-.3 3.2-.4 1.3-.1 2.4-.3 3.7-.4 1-.1 2.7-.3 3.7-.4.7-.1 1.6-.1 2.3-.3l1.6-.1.7-.1h.8c1.3-.1 2.4-.1 3.7-.3l1.8-.1h1.3c1 0 2.1-.1 3.1-.1 4.1-.1 8.3-.1 12.4 0 8.2.3 16.2 1.3 24 2.7 15.7 3 30.3 7.9 43.7 14.5 13.4 6.5 25.2 14.5 35.7 23.3.7.6 1.3 1.1 2 1.7.6.6 1.3 1.1 1.8 1.7 1.3 1.1 2.4 2.3 3.7 3.4s2.4 2.3 3.5 3.4 2.3 2.3 3.4 3.5c4.4 4.7 8.5 9.3 12.1 14.1 7.3 9.5 13.3 19 17.9 28.1.3.6.6 1.1.8 1.7.3.6.6 1.1.8 1.7.6 1.1 1.1 2.3 1.6 3.4.6 1.1 1 2.1 1.6 3.2.4 1.1 1 2.1 1.4 3.2 1.7 4.2 3.4 8.3 4.7 12.1 2.1 6.2 3.7 11.7 4.9 16.5.4 2 2.3 3.2 4.2 3 2.1-.1 3.7-1.8 3.7-3.9.4-5.4.2-11.4-.5-18.3" style="fill:url(#a)"/></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M512 473.3c0 17.6-14.4 32-32 32H32c-17.6 0-32-14.4-32-32v-192c0-17.6 10.2-42.2 22.6-54.6L233.4 16c12.4-12.4 32.8-12.4 45.2 0l210.8 210.8c12.4 12.4 22.6 37 22.6 54.6z" style="fill:#f2f4f9"/><path d="M489.4 226.7 278.6 16c-12.4-12.4-32.8-12.4-45.2 0L22.6 226.7C10.2 239.1 0 263.7 0 281.3v192c0 17.6 14.4 32 32 32h196.8l-86.7-86.7c-4.5 1.5-9.2 2.4-14.2 2.4-24.1 0-43.7-19.6-43.7-43.7s19.6-43.7 43.7-43.7 43.7 19.6 43.7 43.7c0 5-.9 9.7-2.4 14.2l67.5 67.5V211.8c-14.5-7.1-24.5-22-24.5-39.2 0-24.1 19.6-43.7 43.7-43.7s43.7 19.6 43.7 43.7c0 17.2-10 32.1-24.5 39.2v173.4l67.1-67.1c-1.3-4.2-2-8.6-2-13.2 0-24.1 19.6-43.7 43.7-43.7s43.7 19.6 43.7 43.7-19.6 43.7-43.7 43.7c-5.3 0-10.4-1-15.1-2.8l-93.7 93.7v65.9H480c17.6 0 32-14.4 32-32v-192c0-17.6-10.2-42.2-22.6-54.7" style="fill:#18bcf2"/></svg>

After

Width:  |  Height:  |  Size: 879 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M238.8 155.5c33.5 29.7 60.5 61.5 77.9 91.5 29.9-53.4 49.8-116.9 50.1-157.3v-.8c0-59.8-59.7-83.1-111.1-83.1S144.6 29 144.6 88.8V92c28.7 12.8 62.6 35.6 94.2 63.5" style="fill:#fa2921"/><path d="M55.9 318.6c21-23.3 53.1-48.6 89.4-69.9 38.6-22.7 77.2-38.6 111.1-45.8-41.6-44.9-95.8-83.5-134.1-96.2-.3-.1-.5-.2-.7-.2-57-18.7-97.6 30.9-113.5 79.8S-4.1 299.1 52.8 317.6c.8.2 1.8.6 3.1 1" style="fill:#ed79b5"/><path d="M503.9 185.4C488 136.6 447.4 87 390.5 105.5c-.8.3-1.8.6-3.1 1-3.3 31.2-14.4 70.5-31.2 109.1-17.9 41.1-39.8 76.6-62.9 102.4 60 11.9 126.5 11.3 165.1-1 .3-.1.5-.2.7-.2 57-18.6 60.6-82.5 44.8-131.4" style="fill:#ffb400"/><path d="M205 366.3c-9.7-43.7-12.8-85.3-9.3-119.8-55.5 25.7-109 65.3-133 97.8-.2.2-.3.4-.5.6-35.2 48.4-.6 102.3 41 132.5s103.5 46.4 138.7-1.9c.5-.7 1.1-1.5 1.9-2.6-15.6-27.1-29.7-65.5-38.8-106.6" style="fill:#1e83f7"/><path d="M448.8 341.9c-30.7 6.5-71.5 8.1-113.4 4-44.6-4.3-85.1-14.2-116.8-28.2 7.2 60.8 28.4 123.8 51.9 156.7.2.2.3.4.5.6 35.2 48.4 97.1 32.2 138.7 1.9 41.6-30.2 76.2-84.1 41-132.5-.5-.6-1.1-1.4-1.9-2.5" style="fill:#18c249"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><linearGradient id="a" x1="97.508" x2="522.069" y1="308.135" y2="63.019" gradientTransform="matrix(1 0 0 -1 0 514)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#aa5cc3"/><stop offset="1" style="stop-color:#00a4dc"/></linearGradient><path d="M256 196.2c-22.4 0-94.8 131.3-83.8 153.4s156.8 21.9 167.7 0-61.3-153.4-83.9-153.4" style="fill:url(#a)"/><linearGradient id="b" x1="94.193" x2="518.754" y1="302.394" y2="57.278" gradientTransform="matrix(1 0 0 -1 0 514)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#aa5cc3"/><stop offset="1" style="stop-color:#00a4dc"/></linearGradient><path d="M256 0C188.3 0-29.8 395.4 3.4 462.2s472.3 66 505.2 0S323.8 0 256 0m165.6 404.3c-21.6 43.2-309.3 43.8-331.1 0S211.7 101.4 256 101.4 443.2 361 421.6 404.3" style="fill:url(#b)"/></svg>

After

Width:  |  Height:  |  Size: 896 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 139.3 512.2 233.5"><path d="M256 139.3c-53 0-97.9 35.8-112.1 84.4-12.2-25.5-38.2-43.4-68.2-43.4C34.2 180.2 0 214.4 0 256s34.2 75.8 75.8 75.8c30 0 55.9-17.9 68.2-43.4 14.1 48.6 59.1 84.4 112.1 84.4S354 337 368.2 288.4c12.2 25.5 38.2 43.4 68.2 43.4 41.6 0 75.8-34.2 75.8-75.8s-34.2-75.8-75.8-75.8c-30 0-55.9 17.9-68.2 43.4-14.3-48.5-59.2-84.3-112.2-84.3m0 45c39.9 0 71.7 31.8 71.7 71.7s-31.8 71.7-71.7 71.7-71.7-31.8-71.7-71.7 31.8-71.7 71.7-71.7m-180.2 41c17.2 0 30.7 13.5 30.7 30.7S93 286.7 75.8 286.7 45.1 273.2 45.1 256s13.4-30.7 30.7-30.7m360.4 0c17.2 0 30.7 13.5 30.7 30.7s-13.5 30.7-30.7 30.7-30.7-13.5-30.7-30.7 13.5-30.7 30.7-30.7" style="fill:#3784c9"/></svg>

After

Width:  |  Height:  |  Size: 739 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="43.38 0.14 425.32 512.02"><path d="M136.8 459.6c-2.3-10.8-6.9-32.5-7.4-32.5-96.5-57.7-85.1-157.6-53.1-214.7 6.9 71.9 134.2 121.6 60 209.6-.6 1.1 3.4 14.8 6.9 27.4 14.8-25.1 37.1-55.4 36-58.2-91.4-222.7 194.1-239.8 253.5-378 26.8 133.6-13.7 340.3-243.3 392.9-1.1.6-41.7 71.9-43.4 72.5 0-1.1-17.1-.6-14.8-6.3 1.1-3.6 3.3-8.1 5.6-12.7m56.6-98.8c-36-85.1 69.7-178.7 122.2-202.1C208.2 254.6 189.9 326 193.4 360.8M134 405.9c29.1-33.7-5.1-91.4-25.7-110.2 34.8 60 32.5 94.8 25.7 110.2" style="fill:#17541f" transform="translate(-15.306 -14.379)scale(1.10017)"/></svg>

After

Width:  |  Height:  |  Size: 629 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 266 266"><linearGradient id="a" x1="45.042" x2="231.718" y1="36.282" y2="222.958" gradientTransform="matrix(1 0 0 -1 -5.38 262.62)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#fff"/><stop offset="0" style="stop-color:#b8edff"/><stop offset="1" style="stop-color:#d4b8ff"/></linearGradient><circle cx="133" cy="133" r="132" style="fill:url(#a)"/><path d="m224.2 176.5-4 24.2M41.9 177.5l14.8 14m95.8-137.7L56.6 191.3v.1h.1l163.4 9.4s.1 0 .1-.1v-.1L152.6 53.9c0-.1-.1-.1-.1-.1zm-19.8-13.2L41.8 177.3c0 .1 0 .1.1.2h.1l182.2-.8c.1 0 .1-.1.1-.1v-.1L132.9 40.6c0-.1-.1-.1-.2 0q.15-.15 0 0zm.1-.2 19.8 13.3" style="fill:none;stroke:#1d1d1b;stroke-width:6;stroke-miterlimit:10"/></svg>

After

Width:  |  Height:  |  Size: 773 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" version="1.1" viewBox="82 0 348 512"><style>.st1{fill:#91180c}.st2{fill:#f42e1c}</style><linearGradient id="SVGID_1_" x1="313.659" x2="1028.964" y1="62.878" y2="62.878" gradientTransform="matrix(.3694 0 0 -.3694 -23.212 102.238)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#12b212"/><stop offset="1" style="stop-color:#0f0"/></linearGradient><path d="M226.1 157.3C162.1 150.5 97.7 102.2 92.7 0 191.8 0 244.9 58.7 250 151.8c18.8-111.6 106.7-98.5 106.7-98.5 4.2 63.2-47.8 101.6-106.7 104.8-16.5-35-115.7-120.5-115.7-120.5-.1-.1-.3-.1-.4 0q-.15.15 0 .3s95.7 83.4 92.2 119.4" style="fill:url(#SVGID_1_)"/><path d="M256 512c-6.2-.4-63.9-2.6-67.4-67.4-2.8-39.4 28.3-68.5 28.3-106.7-7.1-95.4-134.9-83.6-134.9 0-.1 20.9 8.2 40.9 23 55.7l95.2 95.3c14.8 14.8 34.8 23 55.7 23" class="st1"/><path d="M430 337.9c-.4 6.2-2.6 63.9-67.4 67.4-39.4 2.8-68.5-28.3-106.7-28.3-95.4 7.1-83.6 134.8 0 134.8 20.9.1 40.9-8.2 55.7-23l95.3-95.2c14.8-14.8 23-34.8 23-55.7" class="st2"/><path d="M256 163.9c6.2.4 63.9 2.6 67.4 67.4 2.8 39.4-28.3 68.5-28.3 106.7 7.1 95.4 134.8 83.6 134.8 0 .1-20.9-8.2-40.9-23-55.7L311.7 187c-14.8-14.8-34.8-23-55.7-23" class="st1"/><path d="M82.3 337.9c.4-6.2 2.6-63.9 67.4-67.4 39.4-2.8 68.5 28.3 106.7 28.3 95.4-7.2 83.6-134.8 0-134.8-20.9-.1-40.9 8.2-55.7 23l-95.3 95.3c-14.8 14.8-23 34.8-23 55.7" class="st2"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect width="512" height="512" fill="#282a2d" rx="15%"/><path fill="#e5a00d" d="M256 70H148l108 186-108 186h108l108-186z"/></svg>

After

Width:  |  Height:  |  Size: 191 B

+11
View File
@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0.72 0 168.18 218.62">
<g clip-path="url(#clip0_261_120684)">
<path d="M0.724609 0H80.925C136.261 0 168.905 17.2947 168.905 73.6996V75.627C168.905 132.207 136.331 149.327 80.9951 149.327H63.4901V218.05H0.724609V0ZM77.2453 101.14C94.3823 101.14 103.406 94.7791 103.406 75.7672V73.5769C103.406 54.6526 94.3823 48.1693 77.2453 48.1693H63.5077V101.122H77.2453V101.14Z" fill="black"/>
<path d="M117.222 167.329H168.642V218.618H117.222V167.329Z" fill="#FF80F2"/>
</g>
<defs>
<clipPath id="clip0_261_120684">
<rect width="168.414" height="218.719" fill="white" transform="translate(0.724609)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 675 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0m0 479.1c-40.2 0-72.8-26.9-72.8-60h145.7c-.1 33.1-32.7 60-72.9 60m120.3-79.9H135.7v-43.6h240.6zm-.9-66h-239c-.8-.9-1.6-1.8-2.4-2.8-24.6-29.9-30.4-45.5-36.1-61.4-.1-.5 29.9 6.1 51.1 10.9 0 0 10.9 2.5 26.9 5.4-15.3-18-24.5-40.9-24.5-64.2 0-51.3 39.4-96.2 25.2-132.4 13.8 1.1 28.6 29.2 29.6 73 14.7-20.3 20.8-57.4 20.8-80.1 0-23.5 15.5-50.9 31-51.8-13.8 22.8 3.6 42.3 19.1 90.8 5.8 18.2 5.1 48.8 9.5 68.3 1.5-40.4 8.4-99.2 34-119.6-11.3 25.6 1.7 57.6 10.5 73 14.3 24.8 23 43.7 23 79.3 0 23.9-8.8 46.3-23.7 63.9 16.9-3.2 28.6-6 28.6-6l54.9-10.7c.2 0-7.8 32.8-38.5 64.4" style="fill:#e6522c"/></svg>

After

Width:  |  Height:  |  Size: 764 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 1024 1024"><linearGradient id="a" x1="-446.298" x2="-445.875" y1="1052.924" y2="1052.156" gradientTransform="matrix(992 0 0 -992 442993 1044565)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#72b4f5"/><stop offset="1" style="stop-color:#356ebf"/></linearGradient><circle cx="512" cy="512" r="496" style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#a);stroke:#daefff;stroke-width:32"/><path d="M712.9 332.4c44.4 0 78.9 15.2 103.4 45.7 24.7 30.2 37 73.1 37 128.7 0 55.5-12.4 98.8-37.3 129.6-24.7 30.7-59 46-103.1 46-22 0-42.2-4-60.5-12-18.1-8.2-33.3-20.8-45.7-37.6H603l-10.8 43.5h-36.7V196h51.2v116.6c0 26.1-.8 49.6-2.5 70.4h2.5c23.9-33.7 59.3-50.6 106.2-50.6m-7.4 42.9c-35 0-60.2 10.1-75.6 30.2-15.4 20-23.1 53.7-23.1 101.2s7.9 81.6 23.8 102.1c15.8 20.4 41.2 30.5 76.2 30.5 31.5 0 54.9-11.4 70.4-34.3 15.4-23 23.1-56.1 23.1-99.1q0-66-23.1-98.4c-15.5-21.4-39.4-32.2-71.7-32.2" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/><path d="M317.3 639.5c34.2 0 59-9.2 74.7-27.5 15.6-18.3 24-49.2 25-92.6V508c0-47.3-8-81.4-24.1-102.1-16-20.8-41.5-31.2-76.2-31.2-30 0-53.1 11.7-69.1 35.2-15.8 23.2-23.8 56.2-23.8 98.8s7.8 75.1 23.5 97.5c15.8 22.1 39.1 33.2 70 33.3m-7.7 42.8c-43.6 0-77.7-15.3-102.1-46-24.5-30.7-36.7-73.4-36.7-128.4 0-55.3 12.3-98.5 37-129.6s59-46.6 103.1-46.6q69.45 0 106.8 52.5h2.8l7.4-46.3h40.4v490h-51.2V683.3c0-20.6 1.1-38.1 3.4-52.5h-4c-23.8 34.4-59.4 51.5-106.9 51.5" style="fill-rule:evenodd;clip-rule:evenodd;fill:#c8e8ff"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" version="1.1" viewBox="0 0 118 118"><style>.st1{fill:none;stroke:#fff;stroke-width:6;stroke-miterlimit:10}.st2{fill:#fff}</style><linearGradient id="SVGID_1_" x1="59.05" x2="59.05" y1="2.95" y2="120.35" gradientTransform="matrix(1 0 0 -1 0 120.7)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#0882c8"/><stop offset="1" style="stop-color:#26b6db"/></linearGradient><circle cx="59" cy="59" r="58.7" style="fill:url(#SVGID_1_)"/><circle cx="59" cy="58.8" r="43.7" class="st1"/><path d="M95 48.1c4.7 1.6 9.8-.9 11.4-5.6s-.9-9.8-5.6-11.4-9.8.9-11.4 5.7.9 9.7 5.6 11.3" class="st2"/><path d="m97.9 39.8-30.1 25" class="st1"/><path d="M77.9 91.3c-.4 4.9 3.2 9.3 8.2 9.8 5 .4 9.3-3.2 9.8-8.2.4-4.9-3.2-9.3-8.2-9.8-4.9-.3-9.4 3.2-9.8 8.2" class="st2"/><path d="m86.8 92.2-19-27.4" class="st1"/><path d="M60.3 69.7c2.7 4.2 8.3 5.4 12.4 2.7 4.2-2.7 5.4-8.3 2.7-12.4-2.7-4.2-8.3-5.4-12.4-2.7-4.2 2.5-5.4 8.1-2.7 12.4m-38.8-7.9c-4.3-2.5-9.8-1.1-12.3 3.1-2.5 4.3-1.1 9.8 3.1 12.3 4.3 2.5 9.8 1.1 12.3-3.1 2.5-4.3 1.1-9.8-3.1-12.3" class="st2"/><path d="m16.9 69.4 50.9-4.6" class="st1"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+1
View File
@@ -0,0 +1 @@
<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>.st0{opacity:.2;enable-background:new}</style><path d="M65.6 127.7c35.3 0 63.9-28.6 63.9-63.9S100.9 0 65.6 0 1.8 28.6 1.8 63.9s28.6 63.8 63.8 63.8" class="st0"/><path d="M65.6 318.1c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9S1.8 219 1.8 254.2s28.6 63.9 63.8 63.9"/><path d="M65.6 512c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.8 28.7-63.8 63.9S30.4 512 65.6 512" class="st0"/><path d="M257.2 318.1c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9m0 193.9c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9"/><path d="M257.2 127.7c35.3 0 63.9-28.6 63.9-63.9S292.5 0 257.2 0s-63.9 28.6-63.9 63.9 28.6 63.8 63.9 63.8m189.2 0c35.3 0 63.9-28.6 63.9-63.9S481.6 0 446.4 0c-35.3 0-63.9 28.6-63.9 63.9s28.6 63.8 63.9 63.8" class="st0"/><path d="M446.4 318.1c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9"/><path d="M446.4 512c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9" class="st0"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.8 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 10 90 71"><g fill="none"><path fill="#31BEEC" d="M90 38.197v19.137L48.942 80.999V61.864z"/><path fill="#0095D5" d="M41.086 61.863V81L0 57.333V38.197l18.566 10.687q.03.025.067.04z"/><path fill="#AEADAE" d="m61.621 45.506-16.607 9.576-16.622-9.576 16.622-9.575z"/><path fill="#0095D5" d="M86.086 31.416 69.464 40.99 48.942 29.15V10z"/><path fill="#31BEEC" d="M41.086 10v19.15l-20.55 11.827-16.621-9.561z"/></g></svg>

After

Width:  |  Height:  |  Size: 465 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 622 622"><g transform="translate(320 320)"><linearGradient id="a" x1="-82.404" x2="121.666" y1="38.077" y2="-157.263" gradientTransform="matrix(1 0 0 -1 .001 -16)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#5cdd8b"/><stop offset="1" style="stop-color:#86e6a9"/></linearGradient><path d="M161.4-93.4c53.7 122.7 53.7 199.7 0 230.9-80.5 46.7-290.4 61-350.9-10.9-40.3-47.9-40.3-121.2 0-220 41-67.5 99.2-101.2 174.6-101.2 75.5 0 134.3 33.8 176.3 101.2z" style="fill:url(#a);stroke:#f2f2f2;stroke-width:200;stroke-opacity:.51"/></g></svg>

After

Width:  |  Height:  |  Size: 630 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

+30
View File
@@ -0,0 +1,30 @@
<?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>

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 99 KiB

+13 -5
View File
@@ -164,11 +164,19 @@ function getFallbackData(endpoint: string, options?: RequestInit): any {
if (endpoint.startsWith('/apps/catalog')) { if (endpoint.startsWith('/apps/catalog')) {
return { return {
catalog: [ catalog: [
{ id: 'immich', name: 'Immich Photo Hub', category: 'Media', description: 'Self-hosted photo and video backup with Intel QuickSync / OpenCL ML acceleration.', icon: 'Image', defaultPort: 2283, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' }, { id: 'immich', name: 'Immich Photo Hub', category: 'Media', description: 'Self-hosted photo and video backup with Intel QuickSync / OpenCL ML acceleration.', icon: 'immich', defaultPort: 2283, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' },
{ id: 'nextcloud', name: 'Nextcloud Hub', category: 'Productivity', description: 'Productivity platform for files, documents, and calendars.', icon: 'Cloud', defaultPort: 8080, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'docker' }, { id: 'jellyfin', name: 'Jellyfin Media Server', category: 'Media', description: '4K HDR media streaming system with hardware transcoding.', icon: 'jellyfin', defaultPort: 8096, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'docker' },
{ id: 'jellyfin', name: 'Jellyfin Media Server', category: 'Media', description: 'Media streaming system with hardware transcoding.', icon: 'Film', defaultPort: 8096, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'docker' }, { id: 'nextcloud', name: 'Nextcloud Hub', category: 'Productivity', description: 'Productivity platform for files, documents, and calendars.', icon: 'nextcloud', defaultPort: 8080, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'docker' },
{ id: 'paperless', name: 'Paperless-ngx', category: 'Productivity', description: 'Document archiving system with automated OCR & scanner ingestion.', icon: 'FileText', defaultPort: 28981, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' }, { id: 'paperless', name: 'Paperless-ngx', category: 'Productivity', description: 'Document archiving system with automated OCR & scanner ingestion.', icon: 'paperless-ngx', defaultPort: 28981, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' },
{ id: 'vaultwarden', name: 'Vaultwarden', category: 'Security', description: 'Lightweight Bitwarden password vault.', icon: 'Lock', defaultPort: 8222, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' }, { id: 'vaultwarden', name: 'Vaultwarden', category: 'Security', description: 'Lightweight Bitwarden-compatible password vault in Rust.', icon: 'vaultwarden', defaultPort: 8222, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' },
{ id: 'home-assistant', name: 'Home Assistant Core', category: 'Automation', description: 'Local home automation and smart device controller.', icon: 'home-assistant', defaultPort: 8123, supportedRuntimes: ['docker', 'k3s'], recommendedRuntime: 'docker' },
{ id: 'plex', name: 'Plex Media Server', category: 'Media', description: 'Organize personal video, audio, and photo collections.', icon: 'plex', defaultPort: 32400, supportedRuntimes: ['docker'], recommendedRuntime: 'docker' },
{ id: 'qbittorrent', name: 'qBittorrent Web', category: 'Network', description: 'Fast, headless BitTorrent client with feature-rich web management.', icon: 'qbittorrent', defaultPort: 8085, supportedRuntimes: ['docker', 'systemd'], recommendedRuntime: 'docker' },
{ id: 'tailscale', name: 'Tailscale Mesh VPN', category: 'Network', description: 'Zero-config peer-to-peer VPN connecting nodes across networks.', icon: 'tailscale', defaultPort: 41641, supportedRuntimes: ['systemd'], recommendedRuntime: 'systemd' },
{ id: 'syncthing', name: 'Syncthing P2P', category: 'Productivity', description: 'Continuous decentralized file synchronization between devices.', icon: 'syncthing', defaultPort: 8384, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' },
{ id: 'uptime-kuma', name: 'Uptime Kuma', category: 'Monitoring', description: 'Self-hosted monitoring tool for HTTP, TCP, and ping healthchecks.', icon: 'uptime-kuma', defaultPort: 3001, supportedRuntimes: ['docker'], recommendedRuntime: 'docker' },
{ id: 'adguard-home', name: 'AdGuard Home', category: 'Network', description: 'Network-wide software for blocking ads & tracking via DNS.', icon: 'adguard-home', defaultPort: 3000, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' },
{ id: 'filebrowser', name: 'FileBrowser Quantum', category: 'Storage', description: 'Web-based file manager with upload, download, and instant preview.', icon: 'filebrowser', defaultPort: 8082, supportedRuntimes: ['systemd', 'docker'], recommendedRuntime: 'systemd' },
], ],
}; };
} }
+124
View File
@@ -0,0 +1,124 @@
import React, { useState } from 'react';
import {
Layers,
Image as ImageIcon,
Cloud,
Film,
FileText,
Lock,
Home,
Shield,
Activity,
FolderSync,
} from 'lucide-react';
interface AppIconProps {
name: string;
className?: string;
alt?: string;
}
const ICON_MAP: Record<string, string> = {
immich: 'immich',
image: 'immich',
nextcloud: 'nextcloud',
cloud: 'nextcloud',
jellyfin: 'jellyfin',
film: 'jellyfin',
paperless: 'paperless-ngx',
'paperless-ngx': 'paperless-ngx',
filetext: 'paperless-ngx',
vaultwarden: 'vaultwarden',
bitwarden: 'vaultwarden',
lock: 'vaultwarden',
'home-assistant': 'home-assistant',
homeassistant: 'home-assistant',
home: 'home-assistant',
plex: 'plex',
qbittorrent: 'qbittorrent',
transmission: 'transmission',
tailscale: 'tailscale',
wireguard: 'wireguard',
syncthing: 'syncthing',
gitea: 'gitea',
prometheus: 'prometheus',
grafana: 'grafana',
perses: 'grafana',
portainer: 'portainer',
docker: 'docker',
'adguard-home': 'adguard-home',
adguard: 'adguard-home',
'pi-hole': 'pi-hole',
pihole: 'pi-hole',
'uptime-kuma': 'uptime-kuma',
uptimekuma: 'uptime-kuma',
photoprism: 'photoprism',
filebrowser: 'filebrowser',
truenas: 'truenas',
freenas: 'freenas',
};
export const AppIcon: React.FC<AppIconProps> = ({ name, className = 'h-7 w-7', alt }) => {
const [hasError, setHasError] = useState(false);
const [useCdn, setUseCdn] = useState(false);
const cleanKey = (name || '').toLowerCase().trim();
const iconFileName = ICON_MAP[cleanKey] || cleanKey;
const localSrc = `/icons/${iconFileName}.svg`;
const cdnSrc = `https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/${iconFileName}.svg`;
const handleError = () => {
if (!useCdn) {
setUseCdn(true);
} else {
setHasError(true);
}
};
if (hasError) {
switch (cleanKey) {
case 'immich':
case 'image':
return <ImageIcon className={`${className} text-emerald-400`} />;
case 'nextcloud':
case 'cloud':
return <Cloud className={`${className} text-sky-400`} />;
case 'jellyfin':
case 'film':
return <Film className={`${className} text-indigo-400`} />;
case 'paperless':
case 'paperless-ngx':
case 'filetext':
return <FileText className={`${className} text-amber-400`} />;
case 'vaultwarden':
case 'lock':
return <Lock className={`${className} text-rose-400`} />;
case 'home-assistant':
case 'homeassistant':
case 'home':
return <Home className={`${className} text-blue-400`} />;
case 'tailscale':
case 'wireguard':
return <Shield className={`${className} text-emerald-400`} />;
case 'perses':
case 'prometheus':
case 'grafana':
return <Activity className={`${className} text-teal-400`} />;
case 'syncthing':
return <FolderSync className={`${className} text-purple-400`} />;
default:
return <Layers className={`${className} text-slate-400`} />;
}
}
return (
<img
src={useCdn ? cdnSrc : localSrc}
alt={alt || name}
className={`${className} object-contain`}
onError={handleError}
loading="lazy"
/>
);
};
+1 -1
View File
@@ -63,7 +63,7 @@ export type AppRuntime = 'systemd' | 'docker' | 'k3s';
export interface AppCatalogItem { export interface AppCatalogItem {
id: string; id: string;
name: string; name: string;
category: 'Media' | 'Storage' | 'Productivity' | 'Security' | 'Automation'; category: 'Media' | 'Storage' | 'Productivity' | 'Security' | 'Automation' | 'Network' | 'Monitoring';
description: string; description: string;
icon: string; icon: string;
defaultPort: number; defaultPort: number;
+5 -15
View File
@@ -15,6 +15,7 @@ import {
Home, Home,
CheckCircle2, CheckCircle2,
} from 'lucide-react'; } from 'lucide-react';
import { AppIcon } from '../components/AppIcon.js';
import type { AppCatalogItem, InstalledApp, AppRuntime } from '../types/index.js'; import type { AppCatalogItem, InstalledApp, AppRuntime } from '../types/index.js';
interface AppsViewProps { interface AppsViewProps {
@@ -42,17 +43,6 @@ export const AppsView: React.FC<AppsViewProps> = ({
vaultwarden: 'systemd', vaultwarden: 'systemd',
}); });
const getIcon = (iconName: string) => {
switch (iconName) {
case 'Image': return <Image className="h-6 w-6 text-emerald-400" />;
case 'Cloud': return <Cloud className="h-6 w-6 text-sky-400" />;
case 'Film': return <Film className="h-6 w-6 text-indigo-400" />;
case 'FileText': return <FileText className="h-6 w-6 text-amber-400" />;
case 'Lock': return <Lock className="h-6 w-6 text-rose-400" />;
default: return <Home className="h-6 w-6 text-purple-400" />;
}
};
const handleInstall = async (appId: string) => { const handleInstall = async (appId: string) => {
setInstallingId(appId); setInstallingId(appId);
try { try {
@@ -109,8 +99,8 @@ export const AppsView: React.FC<AppsViewProps> = ({
> >
<div> <div>
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
<div className="p-2.5 rounded-xl bg-slate-950 border border-slate-800"> <div className="p-2.5 rounded-xl bg-slate-950 border border-slate-800 flex items-center justify-center shadow-inner">
{getIcon(item.icon)} <AppIcon name={item.icon || item.id} className="h-8 w-8" />
</div> </div>
<span className="px-2 py-0.5 rounded-full text-[10px] font-semibold bg-slate-800 text-slate-300 font-mono"> <span className="px-2 py-0.5 rounded-full text-[10px] font-semibold bg-slate-800 text-slate-300 font-mono">
{item.category} {item.category}
@@ -180,8 +170,8 @@ export const AppsView: React.FC<AppsViewProps> = ({
{installedApps.map((app) => ( {installedApps.map((app) => (
<div key={app.id} className="p-5 flex flex-col md:flex-row md:items-center justify-between gap-4 hover:bg-slate-800/20 transition"> <div key={app.id} className="p-5 flex flex-col md:flex-row md:items-center justify-between gap-4 hover:bg-slate-800/20 transition">
<div className="flex items-center gap-3.5"> <div className="flex items-center gap-3.5">
<div className="h-10 w-10 rounded-xl bg-slate-950 border border-slate-800 flex items-center justify-center shrink-0"> <div className="h-12 w-12 rounded-xl bg-slate-950 border border-slate-800 flex items-center justify-center shrink-0 p-2 shadow-inner">
<Server className="h-5 w-5 text-emerald-400" /> <AppIcon name={app.appId} className="h-8 w-8" />
</div> </div>
<div> <div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
+165 -3
View File
@@ -9,6 +9,7 @@ import {
ArrowUpRight, ArrowUpRight,
TrendingUp, TrendingUp,
} from 'lucide-react'; } from 'lucide-react';
import { AppIcon } from '../components/AppIcon.js';
import type { SystemStatus, ZfsPool, InstalledApp } from '../types/index.js'; import type { SystemStatus, ZfsPool, InstalledApp } from '../types/index.js';
interface OverviewViewProps { interface OverviewViewProps {
@@ -112,9 +113,20 @@ export const OverviewView: React.FC<OverviewViewProps> = ({
<div className="text-2xl font-bold text-white tracking-tight"> <div className="text-2xl font-bold text-white tracking-tight">
{apps.length || 2} <span className="text-xs text-slate-400 font-normal">Active Services</span> {apps.length || 2} <span className="text-xs text-slate-400 font-normal">Active Services</span>
</div> </div>
<p className="text-xs text-slate-400 mt-1"> <div className="flex items-center gap-1.5 mt-2.5">
Immich (Systemd), Jellyfin (Docker) <div className="p-1 rounded-lg bg-slate-950 border border-slate-800" title="Immich Photo Hub">
</p> <AppIcon name="immich" className="h-5 w-5" />
</div>
<div className="p-1 rounded-lg bg-slate-950 border border-slate-800" title="Jellyfin Media Server">
<AppIcon name="jellyfin" className="h-5 w-5" />
</div>
<div className="p-1 rounded-lg bg-slate-950 border border-slate-800" title="CNCF Perses Telemetry">
<AppIcon name="grafana" className="h-5 w-5" />
</div>
<div className="p-1 rounded-lg bg-slate-950 border border-slate-800" title="Docker Engine">
<AppIcon name="docker" className="h-5 w-5" />
</div>
</div>
</div> </div>
<div className="mt-3 text-[11px] text-slate-400"> <div className="mt-3 text-[11px] text-slate-400">
Runtime Engine: <span className="text-slate-200">Docker + Systemd</span> Runtime Engine: <span className="text-slate-200">Docker + Systemd</span>
@@ -141,6 +153,156 @@ export const OverviewView: React.FC<OverviewViewProps> = ({
</div> </div>
</div> </div>
{/* Homarr-Style Active Services & Workloads Hub */}
<div className="p-6 rounded-2xl bg-slate-900/70 border border-slate-800">
<div className="flex items-center justify-between mb-4">
<div className="flex items-center gap-2">
<Layers className="h-4 w-4 text-emerald-400" />
<h3 className="text-sm font-semibold text-white">Appliance Services & Workloads</h3>
<span className="px-2 py-0.5 rounded-full text-[10px] font-semibold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
Homarr Dashboard
</span>
</div>
<button
onClick={() => onNavigate('apps')}
className="text-xs text-emerald-400 hover:text-emerald-300 font-medium flex items-center gap-1"
>
<span>App Store & Workload Engine</span>
<ArrowUpRight className="h-3.5 w-3.5" />
</button>
</div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
{/* Workload 1: Immich Photo Hub */}
<div className="p-4 rounded-xl bg-slate-950/70 border border-slate-800/90 hover:border-slate-700 transition flex flex-col justify-between group">
<div>
<div className="flex items-start justify-between">
<div className="p-2.5 rounded-xl bg-slate-900 border border-slate-800 shadow-inner group-hover:scale-105 transition-transform">
<AppIcon name="immich" className="h-8 w-8" />
</div>
<div className="flex items-center gap-1.5">
<span className="h-2 w-2 rounded-full bg-emerald-400 animate-pulse" />
<span className="text-[10px] font-mono text-emerald-400 font-medium">ONLINE</span>
</div>
</div>
<h4 className="text-sm font-bold text-white mt-3">Immich Photo Hub</h4>
<p className="text-xs text-slate-400 mt-0.5 line-clamp-2">
Hardware-accelerated photo & video backup with Intel QuickSync ML
</p>
</div>
<div className="mt-4 pt-3 border-t border-slate-800/80 flex items-center justify-between">
<span className="text-[11px] font-mono text-slate-400 bg-slate-900 px-2 py-0.5 rounded border border-slate-800">
:2283
</span>
<a
href="http://naxos.local:2283"
target="_blank"
rel="noreferrer"
className="flex items-center gap-1 text-xs text-emerald-400 hover:text-emerald-300 font-medium"
>
<span>Launch</span>
<ArrowUpRight className="h-3 w-3" />
</a>
</div>
</div>
{/* Workload 2: Jellyfin Media Server */}
<div className="p-4 rounded-xl bg-slate-950/70 border border-slate-800/90 hover:border-slate-700 transition flex flex-col justify-between group">
<div>
<div className="flex items-start justify-between">
<div className="p-2.5 rounded-xl bg-slate-900 border border-slate-800 shadow-inner group-hover:scale-105 transition-transform">
<AppIcon name="jellyfin" className="h-8 w-8" />
</div>
<div className="flex items-center gap-1.5">
<span className="h-2 w-2 rounded-full bg-emerald-400 animate-pulse" />
<span className="text-[10px] font-mono text-emerald-400 font-medium">ONLINE</span>
</div>
</div>
<h4 className="text-sm font-bold text-white mt-3">Jellyfin Media Server</h4>
<p className="text-xs text-slate-400 mt-0.5 line-clamp-2">
4K HDR media streaming with hardware transcoding & DLNA
</p>
</div>
<div className="mt-4 pt-3 border-t border-slate-800/80 flex items-center justify-between">
<span className="text-[11px] font-mono text-slate-400 bg-slate-900 px-2 py-0.5 rounded border border-slate-800">
:8096
</span>
<a
href="http://naxos.local:8096"
target="_blank"
rel="noreferrer"
className="flex items-center gap-1 text-xs text-emerald-400 hover:text-emerald-300 font-medium"
>
<span>Launch</span>
<ArrowUpRight className="h-3 w-3" />
</a>
</div>
</div>
{/* Workload 3: CNCF Perses Analytics */}
<div className="p-4 rounded-xl bg-slate-950/70 border border-slate-800/90 hover:border-slate-700 transition flex flex-col justify-between group">
<div>
<div className="flex items-start justify-between">
<div className="p-2.5 rounded-xl bg-slate-900 border border-slate-800 shadow-inner group-hover:scale-105 transition-transform">
<AppIcon name="grafana" className="h-8 w-8" />
</div>
<div className="flex items-center gap-1.5">
<span className="h-2 w-2 rounded-full bg-emerald-400 animate-pulse" />
<span className="text-[10px] font-mono text-emerald-400 font-medium">ONLINE</span>
</div>
</div>
<h4 className="text-sm font-bold text-white mt-3">CNCF Perses Telemetry</h4>
<p className="text-xs text-slate-400 mt-0.5 line-clamp-2">
Declarative visualization for ZFS I/O, ARC caching, and host metrics
</p>
</div>
<div className="mt-4 pt-3 border-t border-slate-800/80 flex items-center justify-between">
<span className="text-[11px] font-mono text-slate-400 bg-slate-900 px-2 py-0.5 rounded border border-slate-800">
:8080
</span>
<button
onClick={() => onNavigate('analytics')}
className="flex items-center gap-1 text-xs text-emerald-400 hover:text-emerald-300 font-medium"
>
<span>Open</span>
<ArrowUpRight className="h-3 w-3" />
</button>
</div>
</div>
{/* Workload 4: Nextcloud Hub */}
<div className="p-4 rounded-xl bg-slate-950/70 border border-slate-800/90 hover:border-slate-700 transition flex flex-col justify-between group">
<div>
<div className="flex items-start justify-between">
<div className="p-2.5 rounded-xl bg-slate-900 border border-slate-800 shadow-inner group-hover:scale-105 transition-transform">
<AppIcon name="nextcloud" className="h-8 w-8" />
</div>
<div className="flex items-center gap-1.5">
<span className="h-2 w-2 rounded-full bg-slate-500" />
<span className="text-[10px] font-mono text-slate-400 font-medium">READY</span>
</div>
</div>
<h4 className="text-sm font-bold text-white mt-3">Nextcloud Hub</h4>
<p className="text-xs text-slate-400 mt-0.5 line-clamp-2">
Collaborative office, encrypted file sync, and calendar sharing
</p>
</div>
<div className="mt-4 pt-3 border-t border-slate-800/80 flex items-center justify-between">
<span className="text-[11px] font-mono text-slate-400 bg-slate-900 px-2 py-0.5 rounded border border-slate-800">
Catalog
</span>
<button
onClick={() => onNavigate('apps')}
className="flex items-center gap-1 text-xs text-sky-400 hover:text-sky-300 font-medium"
>
<span>Deploy</span>
<ArrowUpRight className="h-3 w-3" />
</button>
</div>
</div>
</div>
</div>
{/* Embedded Native Perses Analytics Panel */} {/* Embedded Native Perses Analytics Panel */}
<div className="p-6 rounded-2xl bg-slate-900/70 border border-slate-800"> <div className="p-6 rounded-2xl bg-slate-900/70 border border-slate-800">
<div className="flex items-center justify-between mb-4"> <div className="flex items-center justify-between mb-4">