diff --git a/README.md b/README.md index ffd7eeab..88556dbc 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,21 @@ > [!WARNING] -> The repository has been migrated from `walkxcode` to `homarr-labs`, because I do not have the capacity/time to keep maintaining it. The Homarr team will take over all management and maintenance, whilst keeping all functionality for you, the user, the same. The project will always be usable outside of Homarr itself and breaking changes will not be made. ^Bjorn +> The repository has been migrated from `walkxcode` to `homarr-labs` as I no longer have the capacity to maintain it. The Homarr team will now handle management and maintenance, ensuring that functionality remains unchanged. The project will always be usable outside of Homarr and no breaking changes will be introduced. +> ― *Bjorn* > -> The license and guidelines have changed, so please review them. If you want to help with maintenance, reach out to [homarr-labs@proton.me](mailto:homarr-labs@proton.me). +> The license and guidelines have been updated, so please review them. To help with maintenance, contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). [![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/homarr-labs/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/homarr-labs/dashboard-icons) [![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/walkxcode/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/walkxcode/dashboard-icons) +[https://icons.homarr.dev](https://icons.homarr.dev) + ## Dashboard Icons -The best source for dashboard icons.
-[**View icons →**](ICONS.md) +Your definitive source for dashboard icons. +[**View icons →**](https://icons.homarr.dev) ## Table of Contents + - [Dashboard Icons](#dashboard-icons) - [Table of Contents](#table-of-contents) - [Icon Requests](#icon-requests) @@ -19,19 +23,19 @@ The best source for dashboard icons.
- [Usage and Details](#usage-and-details) - [Direct Links](#direct-links) - [Base URL](#base-url) - - [Name](#name) + - [Icon Name](#icon-name) - [Formats](#formats) - - [Dark/Light Versions](#darklight-versions) + - [Dark/Light Variants](#darklight-variants) - [Downloading Icons](#downloading-icons) - [Disclaimer](#disclaimer) ## Icon Requests -If you're looking to add a new icon, please read the [Contribution Guidelines](CONTRIBUTING.md). Afterwards, submit a Pull Request or open an issue. +If you’d like to add a new icon, please review our [Contribution Guidelines](CONTRIBUTING.md) and then submit a request using [our issue templates](https://github.com/homarr-labs/dashboard-icons/issues/new/choose). ## Supported Dashboards -Several dashboards offer seamless integration with Dashboard Icons. Here are some of the most popular options: +Dashboard Icons integrate seamlessly with several popular dashboards, including: - [Homarr](https://github.com/ajnart/homarr) - [Homepage](https://github.com/gethomepage/homepage) @@ -41,76 +45,72 @@ Several dashboards offer seamless integration with Dashboard Icons. Here are som ### Direct Links -Icons can be used directly from either GitHub or jsDelivr (recommended). Links consist of three components, each described below: +You can use icons directly from GitHub or through the lightning-fast jsDelivr CDN. The structure of a direct link is as follows: -- **Base URL** -- **Name** -- **Format** +``` +https:////. +``` -A complete link will look like this: +For example, the WEBP version of the Nextcloud Calendar icon is available at: - https:////. - -For example, the icon URL for the WEBP version of Nextcloud Calendar would be: - - https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/webp/nextcloud-calendar.webp +``` +https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/webp/nextcloud-calendar.webp +``` #### Base URL -We recommend using jsDelivr, a free and fast CDN: +We recommend using jsDelivr: - `https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons` -Alternatively, you can use direct links to the repository: +Alternatively, you can reference the repository directly: - `https://raw.githubusercontent.com/homarr-labs/dashboard-icons/refs/heads/main` -#### Name +#### Icon Name -Icons are named using kebab case (lowercase words separated by hyphens). For example, "Nextcloud Calendar" becomes `nextcloud-calendar`. +Icons follow kebab-case formatting (all lowercase words separated by hyphens). For example, "Nextcloud Calendar" becomes `nextcloud-calendar`. #### Formats -Icons are available in the following formats: +Icons are available in these formats: - SVG - PNG - WEBP -All icons are generated from the SVG file as the base. +*All icons are generated from the base SVG file. For more details, see the [Contribution Guidelines](CONTRIBUTING.md).* -*Read more about the specifics and standards of icons in the [Contribution Guidelines](CONTRIBUTING.md).* +### Dark/Light Variants -### Dark/Light Versions +Some icons may have very light or dark colors, which might reduce visibility on certain backgrounds. In such cases, a `-light` or `-dark` suffix is appended—for instance, "2fauth" becomes `2fauth-light`. -In some cases, an icon might have very light or dark colors, making it hard to see on certain backgrounds. In this situation, a `-light` or `-dark` version will be added to the end of the icon's name, with colors adjusted accordingly. - -For example, "2fauth" becomes `2fauth-light`. - -*Read more about the specifics and standards of icons in the [Contribution Guidelines](CONTRIBUTING.md).* +*More specifics are available in the [Contribution Guidelines](CONTRIBUTING.md).* ### Downloading Icons -To download icons from the [icons page](ICONS.md), simply Right-click the icon link and select "Save link as". +1. **Browse & Download:** + Visit [https://icons.homarr.dev](https://icons.homarr.dev) to easily view and download icons. -**Warning**: Visiting the icons page will load every icon in the repository. This may result in: +2. **Using the Browser:** + On the icons page ([ICONS.md](ICONS.md)), right-click any icon link and select "Save link as". + **Note:** Loading the icons page displays every icon in the repository, which may lead to high data usage, slow performance, or even browser crashes on less powerful devices. For faster access, use the direct links or download icons individually. -- High data usage. -- System slowdowns. -- Browser crashes on some devices. +3. **Using the Terminal:** + Download icons via `curl` or `wget` by using the following structure: -If you prefer not to load all icons at once, consider using the direct links or downloading icons individually. + ```bash + curl -O https:////. + ``` + + or -To download icons using the terminal, use `curl` or `wget`. Refer to [Direct Links](#direct-links) for details on the link structure. - - curl -O https:////. - -or - - wget https:////. + ```bash + wget https:////. + ``` ## Disclaimer -Unless otherwise indicated, all images and assets in this repository, including product names, trademarks, and registered trademarks, are the property of their respective owners. These images and assets are used for identification purposes only, and their use does not imply endorsement. +Unless stated otherwise, all images and assets in this repository—including product names, trademarks, and registered trademarks—belong to their respective owners and are used solely for identification purposes. Their inclusion does not imply endorsement. -Read the [LICENSE](LICENSE) for more information about the project itself. For questions or concerns, contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). +For more details, please review the [LICENSE](LICENSE). If you have any questions or concerns, contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). diff --git a/metadata.json b/metadata.json index 8be971b7..ea1319bf 100644 --- a/metadata.json +++ b/metadata.json @@ -1,8 +1,8 @@ { "passwork": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Password Manager"], + "categories": ["Password-Managers", "Security"], "update": { "timestamp": "2023-10-30T09:21:07Z", "author": { @@ -13,8 +13,8 @@ }, "netmaker": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Network Maker"], + "categories": ["Networking-Tools", "Developper-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -26,7 +26,7 @@ "piaware": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Monitoring-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -37,8 +37,8 @@ }, "openstreetmap": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["OSM"], + "categories": ["Web-Browsers", "Networking-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -49,8 +49,8 @@ }, "frigate": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["NVR"], + "categories": ["Home-Automation", "Monitoring-Tools"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -66,7 +66,7 @@ "tar1090": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Monitoring-Tools"], "update": { "timestamp": "2024-10-20T18:50:18Z", "author": { @@ -77,8 +77,8 @@ }, "mayan-edms": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["EDMS"], + "categories": ["Office-Suites", "File-Sharing-&-Sync"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -94,7 +94,7 @@ "php": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Programming-Languages", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -109,8 +109,8 @@ }, "nextpvr": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["PVR"], + "categories": ["Media-Servers", "Home-Automation"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -121,8 +121,8 @@ }, "private-internet-access": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["PIA"], + "categories": ["VPN", "Security"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -133,8 +133,8 @@ }, "sagemcom": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Router"], + "categories": ["Networking-Tools", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -145,8 +145,8 @@ }, "rabbitmq": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Message Broker"], + "categories": ["Developper-Tools", "Networking-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -157,8 +157,8 @@ }, "freshrss": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["RSS Reader", "Feed Reader"], + "categories": ["Web-Browsers", "News"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -170,7 +170,7 @@ "scrypted": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Home-Automation"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -182,7 +182,7 @@ "spiderfoot": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Monitoring-Tools", "Security"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -194,7 +194,7 @@ "invoice-ninja": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["E-commerce-Platforms", "Finance-&-Banking"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -209,8 +209,8 @@ }, "swarmpit": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Docker Swarm UI"], + "categories": ["Containerization-&-Orchestration", "Monitoring-Tools"], "update": { "timestamp": "2023-07-05T16:00:19Z", "author": { @@ -221,8 +221,8 @@ }, "signal": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Messaging App"], + "categories": ["Social-Media", "Security"], "update": { "timestamp": "2023-09-16T20:31:13Z", "author": { @@ -234,7 +234,7 @@ "linkstack": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Developper-Tools"], "update": { "timestamp": "2024-01-01T19:31:33Z", "author": { @@ -245,8 +245,8 @@ }, "paperless-ng": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Document Management"], + "categories": ["Office-Suites", "File-Sharing-&-Sync"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -258,7 +258,7 @@ "obitalk": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Networking-Tools", "Communication"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -269,8 +269,8 @@ }, "privacyidea": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["2FA"], + "categories": ["Password-Managers", "Security"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -281,8 +281,8 @@ }, "firefly-iii": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Finance Manager"], + "categories": ["Finance-&-Banking"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -293,8 +293,8 @@ }, "synology-mail-plus": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Mail Server"], + "categories": ["Email-Providers", "Server-Panels"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -306,7 +306,7 @@ "ads-b-exchange": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Monitoring-Tools"], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -317,8 +317,8 @@ }, "google-keep": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Note Taking"], + "categories": ["Note-taking-Apps", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -329,8 +329,8 @@ }, "traggo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Activity Tracking"], + "categories": ["Monitoring-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -341,8 +341,8 @@ }, "nginx": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Server"], + "categories": ["Web-Browsers", "Server-Panels", "Networking-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -354,7 +354,7 @@ "hollo": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Social-Media"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -369,8 +369,8 @@ }, "synology-webstation": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Web Hosting"], + "categories": ["Web-Browsers", "Server-Panels"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -381,8 +381,8 @@ }, "idrac": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Remote Access"], + "categories": ["Server-Panels", "Networking-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -393,8 +393,8 @@ }, "yuno-host": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Server OS"], + "categories": ["Operating-Systems", "Server-Panels", "Linux-Distributions"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -409,8 +409,8 @@ }, "google-assistant": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Voice Assistant"], + "categories": ["Smart-Home", "AI-&-LLM-Platforms"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -421,8 +421,8 @@ }, "tandoor-recipes": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Recipe Manager"], + "categories": ["Home-Automation"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -433,8 +433,8 @@ }, "infomaniak-k": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Storage"], + "categories": ["Cloud-Computing", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-02-07T08:47:33Z", "author": { @@ -446,7 +446,7 @@ "keila": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Home-Automation"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -457,8 +457,8 @@ }, "zitadel": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Identity Management"], + "categories": ["Security", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -473,8 +473,8 @@ }, "qinglong": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Automation Platform"], + "categories": ["Home-Automation", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -486,7 +486,7 @@ "android-auto": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Smart-Home"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -501,8 +501,8 @@ }, "sympa": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Mailing List"], + "categories": ["Email-Providers", "Communication"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -514,7 +514,7 @@ "dub": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -530,7 +530,7 @@ "docking-station": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Hardware"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -541,8 +541,8 @@ }, "infomaniak-kdrive": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Drive", "Kdrive"], + "categories": ["Cloud-Computing", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-02-07T08:47:33Z", "author": { @@ -557,8 +557,8 @@ }, "canonical": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Ubuntu Company"], + "categories": ["Operating-Systems", "Linux-Distributions"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -569,8 +569,8 @@ }, "backrest": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Backup Tool"], + "categories": ["Databases", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -585,8 +585,8 @@ }, "raneto": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Wiki Engine"], + "categories": ["Note-taking-Apps", "Web-Browsers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -597,8 +597,8 @@ }, "office-365": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Microsoft 365"], + "categories": ["Office-Suites", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -609,8 +609,8 @@ }, "patreon": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Content Creator Platform"], + "categories": ["Social-Media", "E-commerce-Platforms"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -625,10 +625,8 @@ }, "embraer": { "base": "svg", - "aliases": [], - "categories": [ - "Travel" - ], + "aliases": ["Aircraft Manufacturer"], + "categories": ["Travel"], "update": { "timestamp": "2025-03-04T20:48:19.664648", "author": { @@ -640,7 +638,7 @@ "mergeable": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -655,8 +653,8 @@ }, "organizr": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Dashboard"], + "categories": ["Home-Automation", "Web-Browsers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -667,8 +665,8 @@ }, "biedronka": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Supermarket"], + "categories": ["E-commerce-Platforms"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -679,8 +677,8 @@ }, "nginx-proxy-manager": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Reverse Proxy UI"], + "categories": ["Networking-Tools", "Server-Panels"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -691,8 +689,8 @@ }, "glpi": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["IT Asset Management"], + "categories": ["Office-Suites", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -704,7 +702,7 @@ "ruby": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Programming-Languages", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -716,7 +714,7 @@ "smartfox": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Gaming-Platforms", "Developper-Tools"], "update": { "timestamp": "2024-10-18T21:08:39Z", "author": { @@ -727,8 +725,8 @@ }, "baikal": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["CalDAV Server"], + "categories": ["Server-Panels", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -739,8 +737,8 @@ }, "mumble": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Voice Chat"], + "categories": ["Communication", "Gaming-Platforms"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -755,8 +753,8 @@ }, "redis": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["In-Memory Database"], + "categories": ["Databases", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -767,8 +765,8 @@ }, "bytestash": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["File Uploader"], + "categories": ["File-Sharing-&-Sync", "Developper-Tools"], "update": { "timestamp": "2025-01-05T01:06:46Z", "author": { @@ -779,8 +777,8 @@ }, "docker-volume-backup": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Volume Backup"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -791,8 +789,8 @@ }, "opentalk": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["VoIP Server"], + "categories": ["Networking-Tools", "Communication"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -803,10 +801,8 @@ }, "pluralsight": { "base": "svg", - "aliases": [], - "categories": [ - "Education" - ], + "aliases": ["Learning Platform"], + "categories": ["Education", "Developper-Tools"], "update": { "timestamp": "2025-04-06T16:45:32.125339", "author": { @@ -817,8 +813,8 @@ }, "netcam-studio": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["CCTV Software"], + "categories": ["Monitoring-Tools", "Home-Automation"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -829,8 +825,8 @@ }, "serviio": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Media Server"], + "categories": ["Media-Servers", "Home-Automation"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -845,8 +841,8 @@ }, "rathole": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Tunneling Tool"], + "categories": ["Networking-Tools", "Developper-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -857,8 +853,8 @@ }, "chatpad-ai": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["AI Chatbot"], + "categories": ["AI-&-LLM-Platforms"], "update": { "timestamp": "2024-01-29T22:26:51Z", "author": { @@ -869,8 +865,8 @@ }, "step-ca": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Certificate Authority"], + "categories": ["Security", "Networking-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -881,8 +877,8 @@ }, "eweka": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Usenet Provider"], + "categories": ["Download-Managers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -893,8 +889,8 @@ }, "vi": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Text Editor"], + "categories": ["Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -905,8 +901,8 @@ }, "filestash": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web File Manager"], + "categories": ["File-Sharing-&-Sync", "Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -917,8 +913,8 @@ }, "pritunl": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["VPN Server"], + "categories": ["VPN", "Networking-Tools", "Security"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -929,8 +925,8 @@ }, "dashdot": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Server Dashboard"], + "categories": ["Monitoring-Tools", "Server-Panels"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -941,12 +937,8 @@ }, "kubecraft": { "base": "png", - "aliases": [ - "kube-craft" - ], - "categories": [ - "Organization" - ], + "aliases": ["kube-craft"], + "categories": ["Containerization-&-Orchestration"], "update": { "timestamp": "2025-03-31T19:22:27.794388", "author": { @@ -957,8 +949,8 @@ }, "apache-cassandra": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["NoSQL Database"], + "categories": ["Databases"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -970,7 +962,7 @@ "pioneer": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Hardware"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -985,8 +977,8 @@ }, "openpanel": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Server Control Panel"], + "categories": ["Server-Panels"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1001,8 +993,8 @@ }, "pingvin-share": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["File Sharing"], + "categories": ["File-Sharing-&-Sync"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1017,8 +1009,8 @@ }, "self-hosted-gateway": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["API Gateway"], + "categories": ["Developper-Tools", "Networking-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1029,8 +1021,8 @@ }, "sandstorm": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Application Platform"], + "categories": ["Server-Panels", "Web-Browsers"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1041,8 +1033,8 @@ }, "shell-tips": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Command Line Tips"], + "categories": ["Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1057,8 +1049,8 @@ }, "codeberg": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Code Hosting"], + "categories": ["Version-Control-Systems", "Developper-Tools"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -1069,8 +1061,8 @@ }, "nodebb": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Forum Software"], + "categories": ["Web-Browsers", "Social-Media"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1081,8 +1073,8 @@ }, "photoprism": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Photo Management"], + "categories": ["Media-Servers", "File-Sharing-&-Sync"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1097,8 +1089,8 @@ }, "tinypilot": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["KVM over IP"], + "categories": ["Networking-Tools", "Hardware"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1109,8 +1101,8 @@ }, "samsung-internet": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Browser"], + "categories": ["Web-Browsers"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -1121,8 +1113,8 @@ }, "longhorn": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Distributed Block Storage"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1133,8 +1125,8 @@ }, "nu-nl": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["News Website"], + "categories": ["News", "Web-Browsers"], "update": { "timestamp": "2025-04-08T16:51:47.581779", "author": { @@ -1145,10 +1137,10 @@ }, "tautulli": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Plex Stats"], + "categories": ["Monitoring-Tools", "Media-Servers"], "update": { - "timestamp": "2022-08-16T17:22:56Z", + "timestamp": "2022-08-16T17:22:56", "author": { "id": 71191962, "name": "walkxcode" @@ -1157,8 +1149,8 @@ }, "wizarr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Setup Wizard"], + "categories": ["Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1169,8 +1161,8 @@ }, "openhab": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Home Automation"], + "categories": ["Home-Automation", "Smart-Home"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1181,8 +1173,8 @@ }, "libremdb": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Movie Database"], + "categories": ["Media-Servers", "Databases"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1193,8 +1185,8 @@ }, "docspell": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Document Indexer"], + "categories": ["Office-Suites", "File-Sharing-&-Sync"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1205,8 +1197,8 @@ }, "plexdrive": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Cloud Mount"], + "categories": ["File-Sharing-&-Sync", "Cloud-Computing"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1217,8 +1209,8 @@ }, "consul": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Service Discovery"], + "categories": ["Networking-Tools", "Developper-Tools"], "update": { "timestamp": "2024-01-01T11:20:28Z", "author": { @@ -1230,7 +1222,7 @@ "chromecast": { "base": "png", "aliases": [], - "categories": [], + "categories": ["Media-Servers", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1245,8 +1237,8 @@ }, "cinny": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Matrix Client"], + "categories": ["Communication", "Social-Media"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1262,7 +1254,7 @@ "openvpn": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["VPN", "Networking-Tools", "Security"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1273,8 +1265,8 @@ }, "dropout": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Streaming Service"], + "categories": ["Video-Streaming", "Gaming-Platforms"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1289,8 +1281,8 @@ }, "alltube": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Download Manager"], + "categories": ["Download-Managers"], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -1305,8 +1297,8 @@ }, "homebridge": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Smart Home Bridge"], + "categories": ["Home-Automation", "Smart-Home"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -1317,8 +1309,8 @@ }, "fossil": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Version Control"], + "categories": ["Version-Control-Systems", "Developper-Tools"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -1329,8 +1321,8 @@ }, "kubernetes": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["K8s"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools", "Cloud-Computing"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -1341,8 +1333,8 @@ }, "keenetic-new": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Router"], + "categories": ["Networking-Tools", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1353,8 +1345,8 @@ }, "wikipedia": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Online Encyclopedia"], + "categories": ["Web-Browsers", "Education"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1369,8 +1361,8 @@ }, "gameyfin": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Game Server Panel"], + "categories": ["Gaming-Platforms", "Server-Panels"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1385,8 +1377,8 @@ }, "seafile": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Storage", "File Sync"], + "categories": ["File-Sharing-&-Sync", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1397,8 +1389,8 @@ }, "jenkins": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["CI/CD"], + "categories": ["Developper-Tools", "DevOps"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1409,8 +1401,8 @@ }, "gollum": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Wiki"], + "categories": ["Note-taking-Apps", "Developper-Tools"], "update": { "timestamp": "2024-06-01T17:38:50Z", "author": { @@ -1421,8 +1413,8 @@ }, "openvas": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Vulnerability Scanner"], + "categories": ["Security", "Monitoring-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1433,8 +1425,8 @@ }, "librewolf": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Browser"], + "categories": ["Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1445,8 +1437,8 @@ }, "dietpi": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Lightweight OS"], + "categories": ["Operating-Systems", "Linux-Distributions", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1458,7 +1450,7 @@ "linux": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Operating-Systems", "Linux-Distributions"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1469,8 +1461,8 @@ }, "coolify": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["App Deployment"], + "categories": ["Developper-Tools", "Server-Panels"], "update": { "timestamp": "2024-06-01T17:40:45Z", "author": { @@ -1481,8 +1473,8 @@ }, "serpbear": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Rank Tracker"], + "categories": ["Monitoring-Tools", "Developper-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1493,8 +1485,8 @@ }, "falcon-christmas": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Lighting Controller"], + "categories": ["Home-Automation", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1505,8 +1497,8 @@ }, "bewcloud": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Hosting Provider"], + "categories": ["Cloud-Computing"], "update": { "timestamp": "2025-01-05T20:55:05Z", "author": { @@ -1517,8 +1509,8 @@ }, "marginalia": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Search Engine"], + "categories": ["Search-Engines", "Web-Browsers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1529,8 +1521,8 @@ }, "powerdns": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["DNS Server"], + "categories": ["Networking-Tools", "Server-Panels"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -1541,8 +1533,8 @@ }, "incus": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Container Manager"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools", "Server-Panels"], "update": { "timestamp": "2025-01-05T19:39:40Z", "author": { @@ -1553,8 +1545,8 @@ }, "codestats": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Code Analytics"], + "categories": ["Developper-Tools", "Monitoring-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1569,8 +1561,8 @@ }, "microbin": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Pastebin"], + "categories": ["Developper-Tools", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1581,8 +1573,8 @@ }, "plex-meta-manager": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Media Manager"], + "categories": ["Media-Servers", "Home-Automation"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1597,10 +1589,10 @@ }, "firefox": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Browser"], + "categories": ["Web-Browsers"], "update": { - "timestamp": "2022-08-16T17:22:56Z", + "timestamp": "2022-08-16T17:22:56", "author": { "id": 71191962, "name": "walkxcode" @@ -1609,8 +1601,8 @@ }, "pingvin": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Monitoring Tool"], + "categories": ["Monitoring-Tools", "Networking-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1625,10 +1617,10 @@ }, "filebot": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Media Renamer"], + "categories": ["Media-Servers", "Download-Managers"], "update": { - "timestamp": "2022-08-16T17:22:56Z", + "timestamp": "2022-08-16T17:22:56", "author": { "id": 71191962, "name": "walkxcode" @@ -1637,8 +1629,8 @@ }, "kestra": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Workflow Orchestration"], + "categories": ["Developper-Tools", "DevOps"], "update": { "timestamp": "2024-06-01T17:47:14Z", "author": { @@ -1649,8 +1641,8 @@ }, "beaver-habit-tracker": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Habit Tracker"], + "categories": ["Note-taking-Apps", "Office-Suites"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1665,8 +1657,8 @@ }, "nomie": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Personal Data Journal"], + "categories": ["Note-taking-Apps", "Monitoring-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1677,8 +1669,8 @@ }, "rpi-monitor": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Raspberry Pi Monitor"], + "categories": ["Monitoring-Tools", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1689,8 +1681,8 @@ }, "onedev": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["DevOps Platform"], + "categories": ["Developper-Tools", "DevOps", "Version-Control-Systems"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1705,8 +1697,8 @@ }, "diskover": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Disk Usage Analyzer"], + "categories": ["Monitoring-Tools", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1717,8 +1709,8 @@ }, "lodestone": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Knowledge Base"], + "categories": ["Note-taking-Apps", "Office-Suites"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1729,8 +1721,8 @@ }, "buddy": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["CI/CD"], + "categories": ["Developper-Tools", "DevOps"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1741,8 +1733,8 @@ }, "google-podcasts": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Podcast Player"], + "categories": ["Media-Servers", "Music-Streaming"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1753,8 +1745,8 @@ }, "yacd": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Yet Another Clash Dashboard"], + "categories": ["Networking-Tools", "Monitoring-Tools"], "update": { "timestamp": "2025-02-15T15:14:24.169434", "author": { @@ -1765,8 +1757,8 @@ }, "asus-router": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Router"], + "categories": ["Networking-Tools", "Smart-Home"], "update": { "timestamp": "2023-04-16T12:26:21Z", "author": { @@ -1777,8 +1769,8 @@ }, "openldap": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["LDAP Server"], + "categories": ["Networking-Tools", "Server-Panels"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1789,8 +1781,8 @@ }, "backblaze": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Backup"], + "categories": ["Cloud-Computing", "File-Sharing-&-Sync"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1802,9 +1794,7 @@ "prime-video-alt": { "base": "svg", "aliases": [], - "categories": [ - "Streaming" - ], + "categories": ["Video-Streaming"], "update": { "timestamp": "2025-03-26T21:06:09.823741", "author": { @@ -1819,8 +1809,8 @@ }, "gatus": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Uptime Monitor"], + "categories": ["Monitoring-Tools", "Networking-Tools"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -1831,8 +1821,8 @@ }, "astuto": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Help Desk"], + "categories": ["Office-Suites", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1847,8 +1837,8 @@ }, "zipcaptions": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Subtitle Tool"], + "categories": ["Media-Servers", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1859,8 +1849,8 @@ }, "microsoft-exchange": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Email Server"], + "categories": ["Email-Providers", "Server-Panels", "Office-Suites"], "update": { "timestamp": "2024-10-13T18:28:15Z", "author": { @@ -1871,8 +1861,8 @@ }, "bibliogram": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Instagram Frontend"], + "categories": ["Social-Media", "Web-Browsers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1883,8 +1873,8 @@ }, "stash": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Media Manager"], + "categories": ["Media-Servers"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1895,8 +1885,8 @@ }, "zyxel-networks": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Network Devices"], + "categories": ["Networking-Tools", "Hardware"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1911,8 +1901,8 @@ }, "screenconnect": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Remote Support"], + "categories": ["Networking-Tools", "Developper-Tools"], "update": { "timestamp": "2024-01-02T00:01:42Z", "author": { @@ -1923,8 +1913,8 @@ }, "pushfish": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Push Notification"], + "categories": ["Developper-Tools", "Networking-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1935,8 +1925,8 @@ }, "d-link": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Network Devices"], + "categories": ["Networking-Tools", "Hardware"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1947,8 +1937,8 @@ }, "dd-wrt": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Router Firmware"], + "categories": ["Operating-Systems", "Networking-Tools", "Linux-Distributions"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -1963,8 +1953,8 @@ }, "pfsense": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Firewall", "Router OS"], + "categories": ["Operating-Systems", "Networking-Tools", "Security", "Linux-Distributions"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -1980,7 +1970,7 @@ "printer": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Hardware"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -1991,8 +1981,8 @@ }, "koel": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Music Player"], + "categories": ["Music-Streaming", "Media-Servers", "Web-Browsers"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2003,8 +1993,8 @@ }, "microsoft-bing": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Search Engine"], + "categories": ["Search-Engines", "Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2015,8 +2005,8 @@ }, "dolibarr": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["ERP", "CRM"], + "categories": ["Office-Suites", "E-commerce-Platforms"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2027,8 +2017,8 @@ }, "xteve": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["IPTV Proxy"], + "categories": ["Media-Servers", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2039,8 +2029,8 @@ }, "unifi-voucher-site": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Voucher System"], + "categories": ["Networking-Tools", "Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2051,8 +2041,8 @@ }, "gitlab": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Code Hosting"], + "categories": ["Version-Control-Systems", "Developper-Tools", "DevOps"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2063,8 +2053,8 @@ }, "google-cloud-print": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Print Service"], + "categories": ["Office-Suites", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2075,8 +2065,8 @@ }, "trakt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Media Tracking"], + "categories": ["Media-Servers", "Social-Media"], "update": { "timestamp": "2025-04-06T10:49:45.530344", "author": { @@ -2087,8 +2077,8 @@ }, "ipfs": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Decentralized Storage"], + "categories": ["File-Sharing-&-Sync", "Cloud-Computing", "Networking-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2103,8 +2093,8 @@ }, "ollama": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["LLM Server"], + "categories": ["AI-&-LLM-Platforms", "Developper-Tools"], "update": { "timestamp": "2024-06-01T17:31:33Z", "author": { @@ -2115,8 +2105,8 @@ }, "ihatemoney": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Budgeting App"], + "categories": ["Finance-&-Banking"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2127,8 +2117,8 @@ }, "selfh-st": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Static Site Hosting"], + "categories": ["Web-Browsers", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2143,8 +2133,8 @@ }, "pi-alert": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Network Security Monitor"], + "categories": ["Monitoring-Tools", "Security", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2156,7 +2146,7 @@ "r": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Programming-Languages", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2167,8 +2157,8 @@ }, "gitsign": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Code Signing"], + "categories": ["Security", "Developper-Tools", "Version-Control-Systems"], "update": { "timestamp": "2024-03-21T00:59:33Z", "author": { @@ -2179,8 +2169,8 @@ }, "kasm": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Workspace Streaming"], + "categories": ["Developper-Tools", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2191,8 +2181,8 @@ }, "octoeverywhere": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["GitHub Extension"], + "categories": ["Developper-Tools", "Web-Browsers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2203,8 +2193,8 @@ }, "ami-alt": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Asterisk Manager"], + "categories": ["Networking-Tools", "Communication"], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -2219,8 +2209,8 @@ }, "owntracks": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Location Tracking"], + "categories": ["Monitoring-Tools", "Smart-Home"], "update": { "timestamp": "2024-03-21T01:19:05Z", "author": { @@ -2231,8 +2221,8 @@ }, "czkawka": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Duplicate File Finder"], + "categories": ["File-Sharing-&-Sync", "Office-Suites"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2243,8 +2233,8 @@ }, "dockwatch": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Docker Monitor"], + "categories": ["Containerization-&-Orchestration", "Monitoring-Tools"], "update": { "timestamp": "2025-04-01T15:03:47.782282", "author": { @@ -2255,8 +2245,8 @@ }, "ersatztv": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["TV Stream Generator"], + "categories": ["Media-Servers", "Video-Streaming"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2268,7 +2258,7 @@ "java": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Programming-Languages", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2279,8 +2269,8 @@ }, "mailjet": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Email Service"], + "categories": ["Email-Providers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2291,8 +2281,8 @@ }, "netbird": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["VPN"], + "categories": ["VPN", "Networking-Tools", "Security"], "update": { "timestamp": "2024-02-14T14:55:14Z", "author": { @@ -2303,8 +2293,8 @@ }, "babybuddy": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Baby Tracker"], + "categories": ["Home-Automation", "Personal"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2315,8 +2305,8 @@ }, "hulu": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Streaming Service"], + "categories": ["Video-Streaming"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2327,8 +2317,8 @@ }, "etherpad": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Collaborative Editor"], + "categories": ["Office-Suites", "Web-Browsers"], "update": { "timestamp": "2024-06-01T18:14:57Z", "author": { @@ -2339,8 +2329,8 @@ }, "go2rtc": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["RTSP Server"], + "categories": ["Media-Servers", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2351,8 +2341,8 @@ }, "kontoj": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Finance Tracker"], + "categories": ["Finance-&-Banking"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2364,7 +2354,7 @@ "git": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Version-Control-Systems", "Developper-Tools"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -2375,8 +2365,8 @@ }, "mailhog": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Email Testing"], + "categories": ["Developper-Tools", "Email-Providers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2387,8 +2377,8 @@ }, "nextcloud-cospend": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Expense Tracker"], + "categories": ["Finance-&-Banking", "Office-Suites"], "update": { "timestamp": "2023-09-16T20:31:13Z", "author": { @@ -2399,10 +2389,8 @@ }, "double-commander": { "base": "svg", - "aliases": [], - "categories": [ - "Organization" - ], + "aliases": ["File Manager"], + "categories": ["File-Sharing-&-Sync", "Office-Suites"], "update": { "timestamp": "2025-04-02T16:15:44.587958", "author": { @@ -2413,8 +2401,8 @@ }, "truenas": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["NAS OS"], + "categories": ["Operating-Systems", "File-Sharing-&-Sync", "Media-Servers", "Linux-Distributions"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2425,8 +2413,8 @@ }, "appdaemon": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Home Automation"], + "categories": ["Home-Automation", "Smart-Home"], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -2437,8 +2425,8 @@ }, "gramps": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Genealogy Software"], + "categories": ["Office-Suites", "Personal"], "update": { "timestamp": "2023-09-16T20:34:06Z", "author": { @@ -2449,8 +2437,8 @@ }, "opnsense": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Firewall", "Router OS"], + "categories": ["Operating-Systems", "Networking-Tools", "Security", "Linux-Distributions"], "update": { "timestamp": "2025-03-17T15:50:46.882165", "author": { @@ -2461,8 +2449,8 @@ }, "coredns": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["DNS Server"], + "categories": ["Networking-Tools", "Server-Panels"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2473,8 +2461,8 @@ }, "zoom": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Video Conferencing"], + "categories": ["Communication", "Office-Suites"], "update": { "timestamp": "2024-01-28T15:27:56Z", "author": { @@ -2485,8 +2473,8 @@ }, "microsoft-sharepoint": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Collaboration Platform"], + "categories": ["Office-Suites", "Cloud-Computing", "File-Sharing-&-Sync"], "update": { "timestamp": "2024-10-13T18:28:15Z", "author": { @@ -2497,8 +2485,8 @@ }, "emacs": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Text Editor"], + "categories": ["Developper-Tools"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -2509,8 +2497,8 @@ }, "dopplertask": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Task Manager"], + "categories": ["Office-Suites", "Note-taking-Apps"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2521,8 +2509,8 @@ }, "quickwit": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Search Engine"], + "categories": ["Search-Engines", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2533,8 +2521,8 @@ }, "goodreads": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Book Social Network"], + "categories": ["Social-Media"], "update": { "timestamp": "2023-04-24T11:18:46Z", "author": { @@ -2545,8 +2533,8 @@ }, "proton-drive": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Storage"], + "categories": ["Cloud-Computing", "File-Sharing-&-Sync", "Security"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2558,7 +2546,7 @@ "prime-video": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Video-Streaming"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2573,8 +2561,8 @@ }, "vikunja": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Task Management"], + "categories": ["Office-Suites", "Note-taking-Apps"], "update": { "timestamp": "2024-02-11T23:46:36Z", "author": { @@ -2585,8 +2573,8 @@ }, "nowshowing": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Movie Listings"], + "categories": ["Media-Servers", "Information"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2597,8 +2585,8 @@ }, "hemmelig": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Secrets Manager"], + "categories": ["Password-Managers", "Security", "Developper-Tools"], "update": { "timestamp": "2025-01-05T22:18:03Z", "author": { @@ -2613,8 +2601,8 @@ }, "bitwarden": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Password Manager"], + "categories": ["Password-Managers", "Security"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -2625,8 +2613,8 @@ }, "lighttpd": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Server"], + "categories": ["Web-Browsers", "Server-Panels", "Networking-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2637,8 +2625,8 @@ }, "firebase": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Backend as a Service"], + "categories": ["Cloud-Computing", "Developper-Tools"], "update": { "timestamp": "2023-09-11T09:55:09Z", "author": { @@ -2649,8 +2637,8 @@ }, "google-meet": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Video Conferencing"], + "categories": ["Communication", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2661,8 +2649,8 @@ }, "linksys": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Router"], + "categories": ["Networking-Tools", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2673,10 +2661,8 @@ }, "foreflight": { "base": "svg", - "aliases": [], - "categories": [ - "Travel" - ], + "aliases": ["Flight Planning"], + "categories": ["Travel"], "update": { "timestamp": "2025-03-04T20:53:34.252777", "author": { @@ -2691,10 +2677,8 @@ }, "cooler-control": { "base": "svg", - "aliases": [], - "categories": [ - "Hardware" - ], + "aliases": ["Fan Control"], + "categories": ["Hardware", "Monitoring-Tools"], "update": { "timestamp": "2025-04-09T12:21:43.314393", "author": { @@ -2705,8 +2689,8 @@ }, "seelf": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Social Network"], + "categories": ["Social-Media"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2717,8 +2701,8 @@ }, "packetfence": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["NAC"], + "categories": ["Networking-Tools", "Security"], "update": { "timestamp": "2025-02-15T17:40:42.756801", "author": { @@ -2733,8 +2717,8 @@ }, "porkbun": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Domain Registrar"], + "categories": ["Networking-Tools", "Web-Browsers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2745,8 +2729,8 @@ }, "spotnet": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Usenet Client"], + "categories": ["Download-Managers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2757,8 +2741,8 @@ }, "pirate-proxy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Proxy Service"], + "categories": ["Networking-Tools", "Security", "VPN"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2769,8 +2753,8 @@ }, "passwordpusher": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Secure Password Sharing"], + "categories": ["Password-Managers", "Security", "Developper-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2785,8 +2769,8 @@ }, "teslamate": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Tesla Data Logger"], + "categories": ["Monitoring-Tools", "Smart-Home"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2801,8 +2785,8 @@ }, "argo-cd": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["GitOps Tool"], + "categories": ["Developper-Tools", "DevOps", "Containerization-&-Orchestration"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2813,8 +2797,8 @@ }, "oxker": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Container Management"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2829,8 +2813,8 @@ }, "goaccess": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Log Analyzer"], + "categories": ["Monitoring-Tools", "Developper-Tools", "Networking-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2845,8 +2829,8 @@ }, "obico": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["3D Printing Monitor"], + "categories": ["Hardware", "Home-Automation"], "update": { "timestamp": "2022-09-26T20:02:39Z", "author": { @@ -2857,8 +2841,8 @@ }, "netbox-full": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Network Management"], + "categories": ["Networking-Tools", "Developper-Tools", "Monitoring-Tools"], "update": { "timestamp": "2025-01-06T02:12:00Z", "author": { @@ -2873,8 +2857,8 @@ }, "duo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Two-Factor Authentication"], + "categories": ["Password-Managers", "Security"], "update": { "timestamp": "2023-04-14T09:58:29Z", "author": { @@ -2885,8 +2869,8 @@ }, "freebox-revolution": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["ISP Router"], + "categories": ["Networking-Tools", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2897,8 +2881,8 @@ }, "deemix": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Music Downloader"], + "categories": ["Download-Managers", "Music-Streaming"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2909,8 +2893,8 @@ }, "owncloud": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Storage"], + "categories": ["Cloud-Computing", "File-Sharing-&-Sync", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -2921,8 +2905,8 @@ }, "nextcloud-photos": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Photo Album"], + "categories": ["Media-Servers", "File-Sharing-&-Sync", "Office-Suites"], "update": { "timestamp": "2023-09-16T20:31:13Z", "author": { @@ -2933,8 +2917,8 @@ }, "davis": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Weather Station"], + "categories": ["Home-Automation", "Monitoring-Tools", "Smart-Home"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2945,8 +2929,8 @@ }, "adminer": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Database Management"], + "categories": ["Databases", "Developper-Tools"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -2957,8 +2941,8 @@ }, "google-chrome": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Web Browser"], + "categories": ["Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -2969,8 +2953,8 @@ }, "bastillion": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Session Manager"], + "categories": ["Security", "Developper-Tools", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2981,8 +2965,8 @@ }, "urbackup-server": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Backup Server"], + "categories": ["File-Sharing-&-Sync", "Server-Panels"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -2993,10 +2977,8 @@ }, "retrom": { "base": "svg", - "aliases": [], - "categories": [ - "Gaming" - ], + "aliases": ["Game Launcher"], + "categories": ["Gaming-Platforms"], "update": { "timestamp": "2025-04-09T12:11:10.533446", "author": { @@ -3007,8 +2989,8 @@ }, "ultimate-guitar": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Tabs Website"], + "categories": ["Music-Streaming", "Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3023,8 +3005,8 @@ }, "2fauth": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["2FA Authenticator"], + "categories": ["Password-Managers", "Security"], "update": { "timestamp": "2024-10-13T18:37:13Z", "author": { @@ -3039,8 +3021,8 @@ }, "logto": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Auth Service"], + "categories": ["Security", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3051,8 +3033,8 @@ }, "deezer": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Music Streaming"], + "categories": ["Music-Streaming"], "update": { "timestamp": "2025-01-05T15:59:13Z", "author": { @@ -3063,8 +3045,8 @@ }, "synology-video-station": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Video Library"], + "categories": ["Media-Servers", "Home-Automation"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3075,8 +3057,8 @@ }, "slack": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Team Communication"], + "categories": ["Communication", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3087,8 +3069,8 @@ }, "kasten-k10": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Kubernetes Backup"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools"], "update": { "timestamp": "2023-08-10T08:28:08Z", "author": { @@ -3099,8 +3081,8 @@ }, "cloudflare-pages": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Static Site Hosting"], + "categories": ["Web-Browsers", "Developper-Tools", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -3111,8 +3093,8 @@ }, "nxfilter": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["DNS Filter"], + "categories": ["Networking-Tools", "Security"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3123,8 +3105,8 @@ }, "infomaniak-swisstransfer": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["File Transfer"], + "categories": ["File-Sharing-&-Sync", "Cloud-Computing"], "update": { "timestamp": "2025-02-07T08:47:33Z", "author": { @@ -3140,7 +3122,7 @@ "synology": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Hardware", "Smart-Home", "File-Sharing-&-Sync", "Media-Servers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3155,8 +3137,8 @@ }, "watchtower": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Container Updater"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools", "DevOps"], "update": { "timestamp": "2025-04-06T11:33:05.840470", "author": { @@ -3167,10 +3149,10 @@ }, "mealie": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Recipe Manager"], + "categories": ["Home-Automation"], "update": { - "timestamp": "2022-08-16T17:22:56Z", + "timestamp": "2022-08-16T17:22:56", "author": { "id": 71191962, "name": "walkxcode" @@ -3179,8 +3161,8 @@ }, "helper-scripts": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Script Collection"], + "categories": ["Developper-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3191,8 +3173,8 @@ }, "proxmox": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Virtualization Platform"], + "categories": ["Server-Panels", "Operating-Systems", "Cloud-Computing"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3207,8 +3189,8 @@ }, "wikijs-alt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Wiki"], + "categories": ["Note-taking-Apps", "Web-Browsers"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3219,8 +3201,8 @@ }, "ansible": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Automation Tool"], + "categories": ["Developper-Tools", "DevOps"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3235,8 +3217,8 @@ }, "ferdium": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Messaging App"], + "categories": ["Communication", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3247,8 +3229,8 @@ }, "obtainium": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["App Updater"], + "categories": ["Developper-Tools", "Smart-Home"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3259,10 +3241,8 @@ }, "reposilite": { "base": "png", - "aliases": [], - "categories": [ - "Development" - ], + "aliases": ["Maven Repository"], + "categories": ["Developper-Tools", "DevOps"], "update": { "timestamp": "2025-04-06T09:07:59.093807", "author": { @@ -3277,8 +3257,8 @@ }, "morphos": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Operating System"], + "categories": ["Operating-Systems"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3289,8 +3269,8 @@ }, "peertube": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Video Platform"], + "categories": ["Video-Streaming", "Media-Servers", "Social-Media"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3301,8 +3281,8 @@ }, "jekyll": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Static Site Generator"], + "categories": ["Developper-Tools", "Web-Browsers"], "update": { "timestamp": "2023-04-13T20:27:58Z", "author": { @@ -3314,7 +3294,7 @@ "disney-plus": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Video-Streaming"], "update": { "timestamp": "2024-01-01T11:17:37Z", "author": { @@ -3325,8 +3305,8 @@ }, "osticket": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Help Desk"], + "categories": ["Office-Suites", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3337,8 +3317,8 @@ }, "myspeed": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Speed Test"], + "categories": ["Networking-Tools", "Monitoring-Tools", "Web-Browsers"], "update": { "timestamp": "2024-10-13T18:38:41Z", "author": { @@ -3349,8 +3329,8 @@ }, "mobaxterm": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Terminal Emulator"], + "categories": ["Developper-Tools", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3361,8 +3341,8 @@ }, "traefik": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Reverse Proxy"], + "categories": ["Networking-Tools", "Server-Panels"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -3373,8 +3353,8 @@ }, "sparkleshare": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["File Sync"], + "categories": ["File-Sharing-&-Sync", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3386,7 +3366,7 @@ "swift": { "base": "svg", "aliases": [], - "categories": [], + "categories": ["Programming-Languages", "Developper-Tools"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3397,8 +3377,8 @@ }, "polywork": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Professional Network"], + "categories": ["Social-Media", "Web-Browsers"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3409,8 +3389,8 @@ }, "ubooquity": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Comic/Ebook Server"], + "categories": ["Media-Servers", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3421,8 +3401,8 @@ }, "squirrel-servers-manager": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Game Server Manager"], + "categories": ["Gaming-Platforms", "Server-Panels"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3433,8 +3413,8 @@ }, "nexterm": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Terminal Emulator"], + "categories": ["Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3445,8 +3425,8 @@ }, "traefik-proxy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Reverse Proxy"], + "categories": ["Networking-Tools", "Server-Panels"], "update": { "timestamp": "2024-06-01T18:12:52Z", "author": { @@ -3457,8 +3437,8 @@ }, "locals": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Local Services Dashboard"], + "categories": ["Home-Automation", "Monitoring-Tools", "Web-Browsers"], "update": { "timestamp": "2024-10-18T22:02:58Z", "author": { @@ -3473,8 +3453,8 @@ }, "observo-ai": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["AI Monitoring"], + "categories": ["Monitoring-Tools", "AI-&-LLM-Platforms"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3485,8 +3465,8 @@ }, "bigcapital": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Finance Tracker"], + "categories": ["Finance-&-Banking"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3497,8 +3477,8 @@ }, "nicotine-plus": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Soulseek Client"], + "categories": ["File-Sharing-&-Sync", "Download-Managers"], "update": { "timestamp": "2024-03-21T00:49:46Z", "author": { @@ -3509,8 +3489,8 @@ }, "mega-nz": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Cloud Storage"], + "categories": ["Cloud-Computing", "File-Sharing-&-Sync"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3525,8 +3505,8 @@ }, "teedy": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Document Management"], + "categories": ["Office-Suites", "File-Sharing-&-Sync"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3537,8 +3517,8 @@ }, "firefly": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Finance Manager"], + "categories": ["Finance-&-Banking"], "update": { "timestamp": "2022-11-08T16:03:16Z", "author": { @@ -3549,8 +3529,8 @@ }, "transmission": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Torrent Client"], + "categories": ["Download-Managers", "File-Sharing-&-Sync"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3561,8 +3541,8 @@ }, "emq": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["MQTT Broker"], + "categories": ["Networking-Tools", "Smart-Home", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3577,8 +3557,8 @@ }, "rstudioserver": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["R IDE"], + "categories": ["Developper-Tools", "Programming-Languages"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3589,8 +3569,8 @@ }, "atlassian-jira": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Issue Tracker"], + "categories": ["Developper-Tools", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3601,8 +3581,8 @@ }, "bunkerweb": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Reverse Proxy"], + "categories": ["Networking-Tools", "Server-Panels", "Security"], "update": { "timestamp": "2024-06-01T17:44:17Z", "author": { @@ -3613,8 +3593,8 @@ }, "sourcegraph": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Code Search"], + "categories": ["Developper-Tools", "Web-Browsers"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3625,10 +3605,8 @@ }, "fluent-reader": { "base": "svg", - "aliases": [], - "categories": [ - "News" - ], + "aliases": ["RSS Reader"], + "categories": ["News", "Web-Browsers"], "update": { "timestamp": "2025-04-09T12:06:00.578312", "author": { @@ -3639,8 +3617,8 @@ }, "rocky-linux": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Linux Distribution"], + "categories": ["Operating-Systems", "Linux-Distributions"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3651,8 +3629,8 @@ }, "memos": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Note-taking"], + "categories": ["Note-taking-Apps"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3663,8 +3641,8 @@ }, "anonaddy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Email Aliases"], + "categories": ["Email-Providers", "Security"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3675,8 +3653,8 @@ }, "overseerr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Media Request"], + "categories": ["Media-Servers", "Home-Automation"], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -3687,8 +3665,8 @@ }, "google-admin": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Google Workspace Admin"], + "categories": ["Office-Suites", "Cloud-Computing", "Server-Panels"], "update": { "timestamp": "2023-04-14T18:55:51Z", "author": { @@ -3699,8 +3677,8 @@ }, "irc": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Chat Protocol"], + "categories": ["Communication", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3711,8 +3689,8 @@ }, "dc-os": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Container Platform"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools", "Cloud-Computing"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3723,8 +3701,8 @@ }, "duplicacy": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Backup Tool"], + "categories": ["File-Sharing-&-Sync", "Office-Suites"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3735,8 +3713,8 @@ }, "volumio": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Music Player OS"], + "categories": ["Operating-Systems", "Media-Servers", "Linux-Distributions"], "update": { "timestamp": "2024-01-01T11:07:38Z", "author": { @@ -3751,8 +3729,8 @@ }, "camera-ui": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Camera Interface"], + "categories": ["Home-Automation", "Monitoring-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3763,8 +3741,8 @@ }, "session": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Messaging App"], + "categories": ["Communication", "Security"], "update": { "timestamp": "2024-06-01T17:44:56Z", "author": { @@ -3775,8 +3753,8 @@ }, "ubuntu-linux": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Linux Distribution"], + "categories": ["Operating-Systems", "Linux-Distributions"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3787,8 +3765,8 @@ }, "inventree": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Inventory Management"], + "categories": ["Office-Suites", "E-commerce-Platforms"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3799,8 +3777,8 @@ }, "greenbone": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Vulnerability Scanner"], + "categories": ["Security", "Monitoring-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3815,10 +3793,10 @@ }, "mariadb": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Database"], + "categories": ["Databases"], "update": { - "timestamp": "2022-08-16T17:22:56Z", + "timestamp": "2022-08-16T17:22:56", "author": { "id": 71191962, "name": "walkxcode" @@ -3827,8 +3805,8 @@ }, "qdirstat": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Disk Usage Analyzer"], + "categories": ["File-Sharing-&-Sync", "Monitoring-Tools"], "update": { "timestamp": "2023-02-26T00:39:22Z", "author": { @@ -3839,8 +3817,8 @@ }, "shinobi": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["CCTV Software"], + "categories": ["Monitoring-Tools", "Home-Automation"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3851,8 +3829,8 @@ }, "podgrab": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Podcast Downloader"], + "categories": ["Download-Managers", "Media-Servers"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3863,10 +3841,8 @@ }, "oauth2-proxy": { "base": "svg", - "aliases": [], - "categories": [ - "Security" - ], + "aliases": ["Authentication Proxy"], + "categories": ["Security", "Networking-Tools", "Developper-Tools"], "update": { "timestamp": "2025-03-17T15:39:00.007266", "author": { @@ -3877,8 +3853,8 @@ }, "unifi": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Network Devices"], + "categories": ["Networking-Tools", "Smart-Home", "Hardware"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3893,8 +3869,8 @@ }, "podman": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Container Engine"], + "categories": ["Containerization-&-Orchestration", "Developper-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3905,8 +3881,8 @@ }, "fios": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["ISP"], + "categories": ["Networking-Tools", "Communication"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3921,8 +3897,8 @@ }, "simplex-chat": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Messaging App"], + "categories": ["Communication", "Security"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3933,8 +3909,8 @@ }, "zulip": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Team Chat"], + "categories": ["Communication", "Office-Suites"], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -3945,8 +3921,8 @@ }, "substreamer": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Music Streamer"], + "categories": ["Media-Servers", "Music-Streaming"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3957,8 +3933,8 @@ }, "openmaptiles": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["Map Tiles"], + "categories": ["Web-Browsers", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -3969,8 +3945,8 @@ }, "slash": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": ["Link Shortener"], + "categories": ["Web-Browsers", "Networking-Tools"], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -3985,8 +3961,8 @@ }, "znc": { "base": "png", - "aliases": [], - "categories": [], + "aliases": ["IRC Bouncer"], + "categories": ["Communication", "Networking-Tools"], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4013,8 +3989,12 @@ }, "focalboard": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mattermost-boards" + ], + "categories": [ + "Organization" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -4025,8 +4005,12 @@ }, "7zip": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "7-zip" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2025-01-05T00:02:27Z", "author": { @@ -4037,8 +4021,13 @@ }, "open-webui": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "llama-ui", + "ollama-webui" + ], + "categories": [ + "AI-&-LLM-Platforms" + ], "update": { "timestamp": "2025-03-17T15:46:47.424214", "author": { @@ -4053,8 +4042,13 @@ }, "crater-invoice": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "crater", + "invoice-app" + ], + "categories": [ + "Finance-&-Banking" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4065,8 +4059,14 @@ }, "yacht": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "docker-dashboard", + "container-manager" + ], + "categories": [ + "Containerization-&-Orchestration", + "Server-Panels" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -4077,8 +4077,13 @@ }, "cyberchef": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "magic-recipe", + "the-cyber-chef" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4089,8 +4094,13 @@ }, "finamp": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "finamp-music-player", + "android-music-player" + ], + "categories": [ + "Music-Streaming" + ], "update": { "timestamp": "2024-10-13T20:39:18Z", "author": { @@ -4101,8 +4111,13 @@ }, "windows-vista": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "vista", + "windows-os" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4113,8 +4128,12 @@ }, "chowdown": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "recipe-app" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4125,8 +4144,14 @@ }, "supabase": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "supabase-io", + "firebase-alternative" + ], + "categories": [ + "Cloud-Computing", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4137,8 +4162,13 @@ }, "pagerduty": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "incident-alerting", + "on-call-management" + ], + "categories": [ + "Monitoring-Tools" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -4149,8 +4179,13 @@ }, "opera-developer": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "opera-dev", + "developer-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4161,8 +4196,13 @@ }, "safari-ios": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ios-safari", + "mobile-safari" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -4173,8 +4213,12 @@ }, "voip-info": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "voip-wiki" + ], + "categories": [ + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4185,8 +4229,14 @@ }, "truecommand": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "truenas-manager", + "nas-management" + ], + "categories": [ + "Server-Panels", + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2025-04-06T11:44:16.033293", "author": { @@ -4197,8 +4247,14 @@ }, "workadventure": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "virtual-office-space", + "online-meeting-space" + ], + "categories": [ + "Networking-Tools", + "Communication" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4209,8 +4265,12 @@ }, "tumblr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "microblogging-platform" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4221,8 +4281,13 @@ }, "resiliosync-full": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "resilio-sync", + "btsync" + ], + "categories": [ + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2025-02-15T17:10:45.502368", "author": { @@ -4237,8 +4302,13 @@ }, "jdownloader2": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "jdownloader", + "jd2" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4249,8 +4319,13 @@ }, "whoogle": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "private-search", + "google-proxy" + ], + "categories": [ + "Search-Engines" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4261,8 +4336,13 @@ }, "lobe-chat": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "lobe-ai", + "chatgpt-ui" + ], + "categories": [ + "AI-&-LLM-Platforms" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4273,8 +4353,13 @@ }, "veeam": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "vm-backup", + "data-backup" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4285,8 +4370,14 @@ }, "ampache": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "music-server", + "audio-streaming" + ], + "categories": [ + "Media-Servers", + "Music-Streaming" + ], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -4297,8 +4388,13 @@ }, "uptime-kuma": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "status-page", + "website-monitor" + ], + "categories": [ + "Monitoring-Tools" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -4309,8 +4405,13 @@ }, "gaseous": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "ftp-app" + ], + "categories": [ + "File-Sharing-&-Sync", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4321,8 +4422,13 @@ }, "google-tag-manager": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "tag-manager", + "analytics-tool" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4333,8 +4439,13 @@ }, "archisteamfarm": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "steam-idler", + "game-farmer" + ], + "categories": [ + "Gaming-Platforms" + ], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -4345,8 +4456,12 @@ }, "buffalo": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "go-web-framework" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4357,8 +4472,14 @@ }, "cloud9": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "aws-cloud9", + "online-ide" + ], + "categories": [ + "Developper-Tools", + "Cloud-Computing" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4373,8 +4494,14 @@ }, "tdarr": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "video-encoder", + "media-converter" + ], + "categories": [ + "Media-Servers", + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4385,8 +4512,13 @@ }, "viewtube": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "youtube-alternative", + "privacy-youtube" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2024-06-01T18:14:21Z", "author": { @@ -4397,8 +4529,13 @@ }, "13ft": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "paywall-remover", + "article-unblocker" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2024-10-13T18:25:47Z", "author": { @@ -4409,8 +4546,13 @@ }, "snikket": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "xmpp-chat", + "instant-messaging-server" + ], + "categories": [ + "Networking-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4421,8 +4563,14 @@ }, "smokeping": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "latency-monitor", + "network-monitor" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4433,8 +4581,13 @@ }, "edge-dev": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "edge-developer", + "dev-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4445,8 +4598,13 @@ }, "openeats": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "restaurant-app", + "food-ordering-app" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4461,10 +4619,15 @@ }, "jamstack": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "static-site-generator", + "modern-web-dev" + ], + "categories": [ + "Developper-Tools" + ], "update": { - "timestamp": "2023-04-13T20:27:58Z", + "timestamp": "2023-04-13T20:27:58", "author": { "id": 71191962, "name": "walkxcode" @@ -4473,8 +4636,13 @@ }, "dalibo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "postgresql-support" + ], + "categories": [ + "Databases", + "Organization" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4485,8 +4653,14 @@ }, "web-check": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "website-monitor", + "url-checker" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4501,8 +4675,14 @@ }, "kerberos": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "authentication-protocol", + "network-security" + ], + "categories": [ + "Security", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4513,8 +4693,14 @@ }, "cloud66": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "cloud-paas", + "deployment-service" + ], + "categories": [ + "Cloud-Computing", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4525,8 +4711,13 @@ }, "audacity": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "audio-editing-software", + "sound-editor" + ], + "categories": [ + "Graphics-Editors" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4537,8 +4728,13 @@ }, "spoolman": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "printer-server", + "cups-alternative" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2024-01-01T11:13:31Z", "author": { @@ -4549,8 +4745,13 @@ }, "meta": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "facebook-company" + ], + "categories": [ + "Social-Media", + "Organization" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4561,8 +4762,14 @@ }, "owntone": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "airplay-receiver", + "audio-streaming-server" + ], + "categories": [ + "Media-Servers", + "Home-Automation" + ], "update": { "timestamp": "2024-10-13T18:36:52Z", "author": { @@ -4573,8 +4780,14 @@ }, "riot": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "matrix-chat-client", + "element-client" + ], + "categories": [ + "Networking-Tools", + "Communication" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4585,8 +4798,14 @@ }, "standard-notes": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "encrypted-notes", + "secure-notes" + ], + "categories": [ + "Note-taking-Apps", + "Password-Managers" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4597,8 +4816,14 @@ }, "posthog": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "product-analytics-tool", + "user-analytics" + ], + "categories": [ + "Developper-Tools", + "Monitoring-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4613,8 +4838,14 @@ }, "kook": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "voice-chat-platform", + "community-platform" + ], + "categories": [ + "Social-Media", + "Communication" + ], "update": { "timestamp": "2025-01-05T02:20:49Z", "author": { @@ -4625,8 +4856,13 @@ }, "xiaomi-global": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mi-global", + "redmi-global" + ], + "categories": [ + "Organization" + ], "update": { "timestamp": "2025-03-24T19:31:15.329045", "author": { @@ -4637,8 +4873,14 @@ }, "homarr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "server-dashboard", + "application-launcher" + ], + "categories": [ + "Home-Automation", + "Server-Panels" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -4649,8 +4891,13 @@ }, "apache-druid": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "realtime-database", + "analytics-database" + ], + "categories": [ + "Databases" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4661,8 +4908,13 @@ }, "opera-mini": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "mobile-opera", + "lightweight-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4673,8 +4925,13 @@ }, "nzbget": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "usenet-client", + "nzb-downloader" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2025-02-07T19:50:23Z", "author": { @@ -4685,8 +4942,13 @@ }, "windmill": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "automation-platform", + "workflow-engine" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-02-11T23:43:52Z", "author": { @@ -4697,8 +4959,13 @@ }, "odysee": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "lbry-platform", + "decentralized-video" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2025-01-05T03:52:48Z", "author": { @@ -4709,8 +4976,13 @@ }, "brave-dev": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "brave-developer", + "dev-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4721,8 +4993,13 @@ }, "ferretdb": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mongodb-alternative", + "document-database" + ], + "categories": [ + "Databases" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4733,8 +5010,13 @@ }, "amazon-prime": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "prime-video", + "amazon-video" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4745,12 +5027,16 @@ }, "cobalt": { "base": "svg", - "aliases": [], + "aliases": [ + "youtube-downloader", + "video-downloader" + ], "categories": [ - "SocialMedia", + "Social-Media", "File", "Cloud", - "Video" + "Video", + "Download-Managers" ], "update": { "timestamp": "2025-03-21T20:19:04.169259", @@ -4766,9 +5052,13 @@ }, "honda-jet": { "base": "svg", - "aliases": [], + "aliases": [ + "aircraft-manufacturer", + "private-jet" + ], "categories": [ - "Travel" + "Travel", + "Organization" ], "update": { "timestamp": "2025-03-04T20:41:12.562252", @@ -4780,8 +5070,13 @@ }, "calckey": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "mastodon-server", + "federated-social-network" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4792,8 +5087,13 @@ }, "ryot": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mastodon-app", + "federated-social-client" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4808,8 +5108,14 @@ }, "budgetbee": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "budget-manager", + "personal-finance" + ], + "categories": [ + "Finance-&-Banking", + "Note-taking-Apps" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4824,8 +5130,13 @@ }, "google-wallet": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mobile-wallet", + "payment-app" + ], + "categories": [ + "Finance-&-Banking" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4836,8 +5147,13 @@ }, "kamatera": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "vps-provider", + "cloud-server" + ], + "categories": [ + "Cloud-Computing" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4848,20 +5164,31 @@ }, "pinchflat": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "bike-sensor", + "bicycle-tech" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { "id": 71191962, - "name": "walkxcode" + "name": "walkxcode" } } }, "policycontroller": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "kubernetes-security", + "policy-management" + ], + "categories": [ + "Containerization-&-Orchestration", + "Security" + ], "update": { "timestamp": "2024-03-21T00:59:33Z", "author": { @@ -4872,8 +5199,13 @@ }, "chrome-beta": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "chrome-beta-channel", + "beta-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4884,8 +5216,14 @@ }, "hashicorp-consul": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "service-discovery", + "configuration-management" + ], + "categories": [ + "Networking-Tools", + "Cloud-Computing" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4896,8 +5234,14 @@ }, "rhasspy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "offline-voice-assistant", + "privacy-voice-assistant" + ], + "categories": [ + "Home-Automation", + "AI-&-LLM-Platforms" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4912,8 +5256,13 @@ }, "grimoire": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "wiki-software", + "knowledge-management" + ], + "categories": [ + "Note-taking-Apps" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -4924,8 +5273,14 @@ }, "icecast": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "audio-streaming-server", + "internet-radio-server" + ], + "categories": [ + "Media-Servers", + "Music-Streaming" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4936,8 +5291,14 @@ }, "eblocker": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "adblocker", + "privacy-browser-extension" + ], + "categories": [ + "Web-Browsers", + "Security" + ], "update": { "timestamp": "2024-06-01T17:40:18Z", "author": { @@ -4948,8 +5309,14 @@ }, "cryptpad": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "encrypted-office-suite", + "private-document-editor" + ], + "categories": [ + "Office-Suites", + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4960,8 +5327,14 @@ }, "nextcloud-talk": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "video-call-app", + "web-conferencing" + ], + "categories": [ + "Networking-Tools", + "Communication" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -4972,8 +5345,13 @@ }, "bing": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "microsoft-search", + "web-search" + ], + "categories": [ + "Search-Engines" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -4984,8 +5362,14 @@ }, "commento": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "website-comments", + "embeddable-comments" + ], + "categories": [ + "Web-Browsers", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5000,8 +5384,13 @@ }, "yarr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "rss-feed-reader", + "news-aggregator" + ], + "categories": [ + "News" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5016,8 +5405,13 @@ }, "windows-xp": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "xp", + "windows-os" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5028,8 +5422,14 @@ }, "mosquitto": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mqtt-server", + "iot-broker" + ], + "categories": [ + "Networking-Tools", + "Home-Automation" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5040,8 +5440,14 @@ }, "asus-rog": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "gaming-laptop", + "gaming-pc" + ], + "categories": [ + "Gaming-Platforms", + "Hardware" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5052,8 +5458,13 @@ }, "hugo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "website-generator", + "jamstack-tool" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5064,8 +5475,14 @@ }, "easy-gate": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "home-automation-hub", + "smart-home-controller" + ], + "categories": [ + "Smart-Home", + "Home-Automation" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5080,8 +5497,13 @@ }, "surveymonkey": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-survey", + "questionnaire-tool" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5092,8 +5514,14 @@ }, "overclockers": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "pc-enthusiast-forum", + "tech-forum" + ], + "categories": [ + "Hardware", + "Community" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5104,8 +5532,13 @@ }, "joomla": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "content-management-system", + "website-builder" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5116,8 +5549,13 @@ }, "turbopack": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "webpack-alternative", + "javascript-bundler" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-14T17:36:25Z", "author": { @@ -5132,8 +5570,13 @@ }, "chrome-dev": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "chrome-developer", + "dev-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -5144,8 +5587,14 @@ }, "asrock-rack-ipmi": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ipmi-tool", + "server-remote-management" + ], + "categories": [ + "Server-Panels", + "Hardware" + ], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -5156,8 +5605,14 @@ }, "krakend": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "reverse-proxy", + "api-management" + ], + "categories": [ + "Developper-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5168,8 +5623,14 @@ }, "cacti": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "network-graphing", + "performance-monitoring" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5180,8 +5641,13 @@ }, "counter-strike-global-offensive": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "csgo", + "fps-game" + ], + "categories": [ + "Gaming-Platforms" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5192,20 +5658,37 @@ }, "salad": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "cloud-gaming", + "game-streaming", + "pc-in-the-cloud" + ], + "categories": [ + "Gaming-Platforms", + "Cloud-Computing" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { "id": 71191962, "name": "walkxcode" } + }, + "colors": { + "dark": "salad", + "light": "salad-light" } }, "github": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "git-hosting", + "code-repository" + ], + "categories": [ + "Version-Control-Systems", + "Developper-Tools" + ], "update": { "timestamp": "2022-10-03T09:35:40Z", "author": { @@ -5220,8 +5703,14 @@ }, "octoprint": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "3d-printer-server", + "printer-interface" + ], + "categories": [ + "Home-Automation", + "Hardware" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5232,8 +5721,14 @@ }, "meilisearch": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "open-source-search", + "fast-search-engine" + ], + "categories": [ + "Search-Engines", + "Databases" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5244,8 +5739,13 @@ }, "google-analytics": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "website-analytics", + "tracking-tool" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5256,8 +5756,13 @@ }, "code": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "text-editor", + "ide" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5268,8 +5773,14 @@ }, "centos": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "centos-linux", + "enterprise-linux" + ], + "categories": [ + "Linux-Distributions", + "Operating-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5280,8 +5791,14 @@ }, "peppermint": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "peppermint-os", + "lightweight-linux" + ], + "categories": [ + "Linux-Distributions", + "Operating-Systems" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5292,8 +5809,14 @@ }, "synology-dsm": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "synology-os", + "nas-software" + ], + "categories": [ + "Operating-Systems", + "Server-Panels" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5304,8 +5827,13 @@ }, "sphinx-doc": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "documentation-tool", + "docs-builder" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5316,8 +5844,13 @@ }, "android": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "android-os", + "mobile-os" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5328,8 +5861,14 @@ }, "netalertx": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "network-monitor", + "alerting-system" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5344,8 +5883,13 @@ }, "edge": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "microsoft-edge-browser", + "chromium-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -5356,8 +5900,14 @@ }, "observium": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "network-monitoring-tool", + "infrastructure-monitoring" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5368,8 +5918,13 @@ }, "invidious": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "youtube-privacy-frontend", + "privacy-youtube" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5380,8 +5935,14 @@ }, "midjourney": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "image-ai", + "text-to-image" + ], + "categories": [ + "AI-&-LLM-Platforms", + "Graphics-Editors" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5396,8 +5957,13 @@ }, "google-street-view": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "street-view", + "map-imagery" + ], + "categories": [ + "Search-Engines" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5408,8 +5974,14 @@ }, "webdav": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "distributed-authoring", + "web-file-system" + ], + "categories": [ + "File-Sharing-&-Sync", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5420,8 +5992,14 @@ }, "forgejo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "gitea-fork", + "code-repository" + ], + "categories": [ + "Version-Control-Systems", + "Developper-Tools" + ], "update": { "timestamp": "2023-01-05T14:11:25Z", "author": { @@ -5432,8 +6010,14 @@ }, "dolphin": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "kde-file-manager", + "linux-file-explorer" + ], + "categories": [ + "File-Sharing-&-Sync", + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5444,8 +6028,13 @@ }, "firefox-beta": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "firefox-beta-channel", + "beta-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -5456,8 +6045,14 @@ }, "rook": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "kubernetes-storage", + "cloud-native-storage" + ], + "categories": [ + "Containerization-&-Orchestration", + "Cloud-Computing" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5468,8 +6063,13 @@ }, "xwiki": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "enterprise-wiki", + "knowledge-management" + ], + "categories": [ + "Note-taking-Apps" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5480,8 +6080,14 @@ }, "synology-vmm": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "virtual-machine-manager", + "vm-platform" + ], + "categories": [ + "Server-Panels", + "Operating-Systems" + ], "update": { "timestamp": "2025-03-21T20:15:39.716246", "author": { @@ -5492,8 +6098,13 @@ }, "valkey": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "redis-compatible", + "in-memory-database" + ], + "categories": [ + "Databases" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5504,8 +6115,13 @@ }, "inoreader": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-rss-reader", + "feed-aggregator" + ], + "categories": [ + "News" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5516,8 +6132,14 @@ }, "dahua": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "security-camera-company", + "video-surveillance" + ], + "categories": [ + "Smart-Home", + "Hardware" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5528,8 +6150,13 @@ }, "hubzilla": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "federated-social-network", + "decentralized-social-media" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5540,8 +6167,13 @@ }, "cabot": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "service-monitor", + "alerting-tool" + ], + "categories": [ + "Monitoring-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5552,8 +6184,14 @@ }, "nextdns": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "privacy-dns", + "secure-dns" + ], + "categories": [ + "Networking-Tools", + "Security" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5564,8 +6202,14 @@ }, "mstream": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "personal-music-server", + "audio-streaming" + ], + "categories": [ + "Media-Servers", + "Music-Streaming" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5576,8 +6220,14 @@ }, "immich-kiosk": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "photo-display", + "digital-photo-frame" + ], + "categories": [ + "Home-Automation", + "Media-Servers" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5592,8 +6242,13 @@ }, "plesk": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "hosting-control-panel", + "website-management" + ], + "categories": [ + "Server-Panels" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5604,8 +6259,13 @@ }, "rumble": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "youtube-alternative", + "video-sharing-site" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2023-09-30T23:45:37Z", "author": { @@ -5616,8 +6276,14 @@ }, "microsoft-copilot": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ai-chatbot", + "productivity-assistant" + ], + "categories": [ + "AI-&-LLM-Platforms", + "Office-Suites" + ], "update": { "timestamp": "2024-10-13T18:22:38Z", "author": { @@ -5628,8 +6294,14 @@ }, "zabbix": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "it-infrastructure-monitoring", + "server-monitor" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5640,8 +6312,14 @@ }, "maloja": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "music-collection-manager", + "audio-library" + ], + "categories": [ + "Music-Streaming", + "Media-Servers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5652,8 +6330,14 @@ }, "phpldapadmin": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "ldap-management", + "directory-service-admin" + ], + "categories": [ + "Networking-Tools", + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5664,8 +6348,13 @@ }, "google-contacts": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "address-book", + "people-management" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5676,10 +6365,16 @@ }, "ethereum": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "crypto-platform", + "decentralized-apps" + ], + "categories": [ + "Developper-Tools", + "Finance-&-Banking" + ], "update": { - "timestamp": "2023-04-13T20:27:58Z", + "timestamp": "2023-04-13T20:27:58", "author": { "id": 71191962, "name": "walkxcode" @@ -5688,8 +6383,14 @@ }, "chrome-devtools": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "developer-tools", + "browser-inspector" + ], + "categories": [ + "Developper-Tools", + "Web-Browsers" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -5700,8 +6401,14 @@ }, "duckdns": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ddns-provider", + "dynamic-ip-service" + ], + "categories": [ + "Networking-Tools", + "Cloud-Computing" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5716,8 +6423,14 @@ }, "google-admob": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mobile-ads", + "app-monetization" + ], + "categories": [ + "Developper-Tools", + "E-commerce-Platforms" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5728,8 +6441,14 @@ }, "amd": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "processor-company", + "computer-chips" + ], + "categories": [ + "Hardware", + "Organization" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5744,8 +6463,14 @@ }, "rust": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "system-programming-language", + "modern-language" + ], + "categories": [ + "Programming-Languages", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5756,8 +6481,13 @@ }, "android-robot": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "android-logo", + "mobile-os-icon" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5768,8 +6498,14 @@ }, "mikrotik": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "router-manufacturer", + "network-devices" + ], + "categories": [ + "Networking-Tools", + "Hardware" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5784,8 +6520,12 @@ }, "beef": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "php-web-framework" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5800,8 +6540,14 @@ }, "musicbrainz": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "music-database", + "audio-metadata" + ], + "categories": [ + "Databases", + "Music-Streaming" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5812,8 +6558,13 @@ }, "lanraragi": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "comic-server", + "manga-reader-server" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5824,8 +6575,14 @@ }, "atlassian-bamboo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "continuous-integration", + "build-server" + ], + "categories": [ + "Developper-Tools", + "Version-Control-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5836,8 +6593,14 @@ }, "authelia": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "reverse-proxy-auth", + "identity-provider" + ], + "categories": [ + "Security", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5848,8 +6611,14 @@ }, "trivy": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "security-scanner", + "container-scanner" + ], + "categories": [ + "Security", + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5860,9 +6629,13 @@ }, "wd-mycloud": { "base": "svg", - "aliases": [], + "aliases": [ + "network-attached-storage", + "personal-cloud" + ], "categories": [ - "Cloud" + "Cloud", + "File-Sharing-&-Sync" ], "update": { "timestamp": "2025-04-09T12:25:42.292198", @@ -5874,8 +6647,14 @@ }, "hashicorp-vault": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "secret-storage", + "password-vault" + ], + "categories": [ + "Security", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5886,8 +6665,14 @@ }, "gitee": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "china-github", + "code-repository" + ], + "categories": [ + "Version-Control-Systems", + "Developper-Tools" + ], "update": { "timestamp": "2024-06-01T17:47:33Z", "author": { @@ -5898,8 +6683,13 @@ }, "bacula": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "enterprise-backup", + "data-backup" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -5910,8 +6700,14 @@ }, "poste": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mail-server", + "smtp-server" + ], + "categories": [ + "Email-Providers", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5922,8 +6718,14 @@ }, "wallabag": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "bookmarking-tool", + "offline-reader" + ], + "categories": [ + "Note-taking-Apps", + "Web-Browsers" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5938,8 +6740,14 @@ }, "deno": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "node-js-alternative", + "javascript-environment" + ], + "categories": [ + "Programming-Languages", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5954,8 +6762,13 @@ }, "youtube": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "video-sharing-site", + "google-video" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -5966,8 +6779,14 @@ }, "opnform": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-form-creator", + "survey-builder" + ], + "categories": [ + "Office-Suites", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5978,8 +6797,14 @@ }, "dokemon": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "container-monitor", + "docker-stats" + ], + "categories": [ + "Monitoring-Tools", + "Containerization-&-Orchestration" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -5990,8 +6815,13 @@ }, "plausible": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "privacy-analytics", + "website-statistics" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6002,8 +6832,13 @@ }, "synology-contacts": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "contact-app", + "address-book" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6014,8 +6849,13 @@ }, "recipesage": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "recipe-app", + "cooking-recipes" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6026,8 +6866,13 @@ }, "synology-download-station": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "torrent-client", + "file-downloader" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6038,8 +6883,14 @@ }, "jitsi": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "video-meeting", + "web-conferencing" + ], + "categories": [ + "Networking-Tools", + "Communication" + ], "update": { "timestamp": "2023-02-01T13:14:37Z", "author": { @@ -6050,8 +6901,13 @@ }, "komodo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ide", + "text-editor" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2025-02-21T11:58:52.385242", "author": { @@ -6062,8 +6918,14 @@ }, "blocky": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "dns-server", + "adblocking-dns" + ], + "categories": [ + "Networking-Tools", + "Security" + ], "update": { "timestamp": "2022-09-12T10:23:51Z", "author": { @@ -6074,9 +6936,13 @@ }, "scrcpy": { "base": "svg", - "aliases": [], + "aliases": [ + "android-screen-mirroring", + "phone-screen-on-pc" + ], "categories": [ - "Development" + "Developper-Tools", + "Hardware" ], "update": { "timestamp": "2025-03-26T21:09:30.463729", @@ -6088,8 +6954,14 @@ }, "hugging-face": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "machine-learning-platform", + "nlp-library" + ], + "categories": [ + "AI-&-LLM-Platforms", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-16T22:04:08Z", "author": { @@ -6100,8 +6972,12 @@ }, "nextcloud-blue": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "nextcloud-skin" + ], + "categories": [ + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2023-09-16T20:31:13Z", "author": { @@ -6112,8 +6988,13 @@ }, "enbizcard": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "business-card-ocr", + "contact-scanner" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2024-06-01T17:44:56Z", "author": { @@ -6124,8 +7005,13 @@ }, "worklenz": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "job-search-website", + "recruitment-platform" + ], + "categories": [ + "E-commerce-Platforms" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6136,8 +7022,13 @@ }, "grav": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "flat-file-cms", + "content-management-system" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6152,8 +7043,14 @@ }, "csharp": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "dotnet-language", + "c-sharp" + ], + "categories": [ + "Programming-Languages", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6164,8 +7061,13 @@ }, "amazon": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-marketplace", + "shopping-website" + ], + "categories": [ + "E-commerce-Platforms" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6180,8 +7082,13 @@ }, "deluge": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "bittorrent-client", + "torrenting-app" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6192,8 +7099,13 @@ }, "ebay": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-auction", + "shopping-website" + ], + "categories": [ + "E-commerce-Platforms" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6204,8 +7116,13 @@ }, "opengist": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "code-sharing", + "snippet-hosting" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6220,8 +7137,13 @@ }, "plex-rewind": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "plex-year-in-review", + "media-stats" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6232,8 +7154,13 @@ }, "booklogr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "book-tracker", + "reading-log" + ], + "categories": [ + "Note-taking-Apps" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6248,8 +7175,13 @@ }, "synology-office": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "online-office", + "document-editor" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6260,8 +7192,13 @@ }, "flatnotes": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "markdown-notes", + "plain-text-notes" + ], + "categories": [ + "Note-taking-Apps" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6272,8 +7209,13 @@ }, "premium-mobile": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "mobile-network-operator", + "telecom-company" + ], + "categories": [ + "Communication" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6284,8 +7226,14 @@ }, "terminal": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "command-line", + "shell-interface" + ], + "categories": [ + "Developper-Tools", + "Operating-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6296,8 +7244,14 @@ }, "opentofu": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "terraform-fork", + "iac-tool" + ], + "categories": [ + "Developper-Tools", + "Cloud-Computing" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6308,8 +7262,14 @@ }, "lemonldap-ng": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "single-sign-on", + "web-access-management" + ], + "categories": [ + "Security", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6320,8 +7280,14 @@ }, "opengarage": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "smart-garage", + "garage-opener" + ], + "categories": [ + "Smart-Home", + "Home-Automation" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6332,8 +7298,14 @@ }, "google-domains": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "domain-name-service", + "dns-management" + ], + "categories": [ + "Cloud-Computing", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6344,8 +7316,12 @@ }, "home-assistant-alt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "home-automation-icon" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6356,8 +7332,14 @@ }, "guacamole": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "rdp-gateway", + "vnc-gateway" + ], + "categories": [ + "Networking-Tools", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6372,8 +7354,13 @@ }, "zammad": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "customer-support", + "ticketing-system" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2023-02-01T13:12:30Z", "author": { @@ -6384,8 +7371,14 @@ }, "fileflows": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "media-processing", + "video-automation" + ], + "categories": [ + "Media-Servers", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6396,8 +7389,14 @@ }, "minimserver": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "upnp-server", + "audio-streaming-server" + ], + "categories": [ + "Media-Servers", + "Home-Automation" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6408,8 +7407,14 @@ }, "flightaware": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "aviation-tracking", + "aircraft-tracking" + ], + "categories": [ + "Travel", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6420,8 +7425,14 @@ }, "ntopng": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "network-analyzer", + "traffic-sniffer" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6432,10 +7443,16 @@ }, "elastic-kibana": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "dashboarding-tool", + "log-analyzer" + ], + "categories": [ + "Monitoring-Tools", + "Developper-Tools" + ], "update": { - "timestamp": "2023-04-13T20:27:58Z", + "timestamp": "2023-04-13T20:27:58", "author": { "id": 71191962, "name": "walkxcode" @@ -6444,8 +7461,14 @@ }, "hubitat": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "home-automation-controller", + "smart-device-hub" + ], + "categories": [ + "Smart-Home", + "Home-Automation" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6456,8 +7479,13 @@ }, "misskey": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "federated-microblogging", + "mastodon-alternative" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6472,8 +7500,13 @@ }, "apple-music": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "itunes-music", + "apple-music-service" + ], + "categories": [ + "Music-Streaming" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6484,9 +7517,13 @@ }, "webdb": { "base": "svg", - "aliases": [], + "aliases": [ + "online-database-editor", + "database-gui" + ], "categories": [ - "Development" + "Development", + "Databases" ], "update": { "timestamp": "2025-03-28T17:04:46.969601", @@ -6498,8 +7535,13 @@ }, "leanote": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "markdown-notes", + "cloud-notes" + ], + "categories": [ + "Note-taking-Apps" + ], "update": { "timestamp": "2022-09-12T10:27:09Z", "author": { @@ -6510,8 +7552,14 @@ }, "emqx": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mqtt-server", + "iot-broker" + ], + "categories": [ + "Networking-Tools", + "Home-Automation" + ], "update": { "timestamp": "2022-10-17T10:12:46Z", "author": { @@ -6522,8 +7570,14 @@ }, "redict": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "redis-admin", + "database-management-tool" + ], + "categories": [ + "Databases", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6534,8 +7588,14 @@ }, "double-take": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ai-face-recognition", + "object-detection" + ], + "categories": [ + "Smart-Home", + "Home-Automation" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6550,8 +7610,13 @@ }, "mediathekview": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "german-tv-replay", + "public-broadcasting-archive" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2022-11-05T12:18:24Z", "author": { @@ -6562,8 +7627,14 @@ }, "google-play": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "android-app-store", + "play-store" + ], + "categories": [ + "Gaming-Platforms", + "E-commerce-Platforms" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6574,8 +7645,14 @@ }, "kubernetes-dashboard": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "k8s-dashboard", + "container-management-ui" + ], + "categories": [ + "Containerization-&-Orchestration", + "Server-Panels" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6586,8 +7663,13 @@ }, "miniflux": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "minimalist-rss-reader", + "feed-aggregator" + ], + "categories": [ + "News" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6602,8 +7684,14 @@ }, "papermerge": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "document-scanner", + "digital-archive" + ], + "categories": [ + "Office-Suites", + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6618,8 +7706,14 @@ }, "zipline": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "youtube-privacy-frontend", + "ad-free-youtube-player" + ], + "categories": [ + "Video-Streaming", + "Web-Browsers" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6634,8 +7728,14 @@ }, "lidarr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "music-library-manager", + "audio-downloader" + ], + "categories": [ + "Music-Streaming", + "Media-Servers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6646,8 +7746,13 @@ }, "bithumen": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "private-tracker", + "torrent-site" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6658,8 +7763,15 @@ }, "cloudflare": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "content-delivery-network", + "ddos-protection" + ], + "categories": [ + "Cloud-Computing", + "Networking-Tools", + "Security" + ], "update": { "timestamp": "2022-09-01T17:06:45Z", "author": { @@ -6670,8 +7782,13 @@ }, "tanoshi": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "manga-server", + "comic-reader" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6682,8 +7799,13 @@ }, "uc-browser": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mobile-browser", + "china-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6694,8 +7816,13 @@ }, "nzbhydra": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "nzb-search-engine", + "usenet-search" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6706,8 +7833,14 @@ }, "nodejs-alt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "javascript-environment", + "server-side-js" + ], + "categories": [ + "Programming-Languages", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6718,8 +7851,13 @@ }, "duckduckgo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "privacy-search-engine", + "private-search" + ], + "categories": [ + "Search-Engines" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6730,9 +7868,14 @@ }, "profilarr": { "base": "svg", - "aliases": [], + "aliases": [ + "plex-stats", + "jellyfin-stats" + ], "categories": [ - "Media" + "Media", + "Monitoring-Tools", + "Media-Servers" ], "update": { "timestamp": "2025-04-02T16:11:24.001900", @@ -6744,8 +7887,14 @@ }, "vouchervault": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "coupon-manager", + "discount-tracker" + ], + "categories": [ + "E-commerce-Platforms", + "Finance-&-Banking" + ], "update": { "timestamp": "2025-01-07T19:12:28Z", "author": { @@ -6756,8 +7905,14 @@ }, "swizzin": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "torrenting-scripts", + "media-server-scripts" + ], + "categories": [ + "Download-Managers", + "Server-Panels" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6768,8 +7923,13 @@ }, "twitter": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "x-platform", + "microblogging" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6780,9 +7940,13 @@ }, "auto-mcs": { "base": "png", - "aliases": [], + "aliases": [ + "minecraft-server-script", + "game-server-automation" + ], "categories": [ - "Gaming" + "Gaming-Platforms", + "Home-Automation" ], "update": { "timestamp": "2025-03-24T19:26:25.573313", @@ -6794,8 +7958,13 @@ }, "openai": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "gpt-api", + "artificial-intelligence-api" + ], + "categories": [ + "AI-&-LLM-Platforms" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6810,8 +7979,13 @@ }, "microsoft-excel": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "excel", + "spreadsheet-editor" + ], + "categories": [ + "Office-Suites" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6822,8 +7996,14 @@ }, "ups": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "shipping-company", + "package-delivery" + ], + "categories": [ + "E-commerce-Platforms", + "Logistics" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6834,8 +8014,14 @@ }, "fider": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "feature-requests", + "idea-voting" + ], + "categories": [ + "Developper-Tools", + "Office-Suites" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6846,10 +8032,16 @@ }, "homer": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "server-dashboard", + "application-launcher" + ], + "categories": [ + "Home-Automation", + "Server-Panels" + ], "update": { - "timestamp": "2022-08-16T17:22:56Z", + "timestamp": "2022-08-16T17:22:56", "author": { "id": 71191962, "name": "walkxcode" @@ -6858,8 +8050,14 @@ }, "wireshark": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "packet-sniffer", + "network-troubleshooting" + ], + "categories": [ + "Networking-Tools", + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6870,8 +8068,13 @@ }, "hexo": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "blog-generator", + "website-builder" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6882,8 +8085,14 @@ }, "funkwhale": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "podcasting-platform", + "audio-server" + ], + "categories": [ + "Media-Servers", + "Music-Streaming" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6898,8 +8107,14 @@ }, "gerbera": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "upnp-server", + "dlna-server" + ], + "categories": [ + "Media-Servers", + "Home-Automation" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6910,8 +8125,14 @@ }, "google-news": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "news-feed", + "current-events" + ], + "categories": [ + "News", + "Search-Engines" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -6922,8 +8143,13 @@ }, "filerun": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "web-file-manager", + "online-file-browser" + ], + "categories": [ + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -6934,8 +8160,13 @@ }, "moodist": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "music-app", + "android-music-player" + ], + "categories": [ + "Music-Streaming" + ], "update": { "timestamp": "2024-10-20T17:31:05Z", "author": { @@ -6950,8 +8181,14 @@ }, "rsshub": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "feed-generator", + "rss-aggregator" + ], + "categories": [ + "News", + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -6962,8 +8199,14 @@ }, "snappymail": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "webmail-app", + "browser-based-email" + ], + "categories": [ + "Email-Providers", + "Web-Browsers" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -6978,8 +8221,14 @@ }, "overleaf": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-latex", + "collaborative-latex" + ], + "categories": [ + "Developper-Tools", + "Office-Suites" + ], "update": { "timestamp": "2024-06-01T18:03:26Z", "author": { @@ -6990,8 +8239,13 @@ }, "metube": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "youtube-dl-gui", + "video-downloader" + ], + "categories": [ + "Download-Managers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7002,8 +8256,13 @@ }, "projectsend": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "large-file-transfer", + "client-portal" + ], + "categories": [ + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7014,8 +8273,13 @@ }, "hatsh": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "link-shortener", + "custom-url-generator" + ], + "categories": [ + "Networking-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7030,8 +8294,13 @@ }, "tux": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "linux-penguin", + "os-mascot" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7042,8 +8311,13 @@ }, "webtools": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "online-tools", + "utility-website" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7054,8 +8328,14 @@ }, "shell": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "bash-scripting", + "command-line-scripting" + ], + "categories": [ + "Developper-Tools", + "Operating-Systems" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7070,8 +8350,15 @@ }, "cloudflare-zero-trust": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "zero-trust-network", + "secure-access-service" + ], + "categories": [ + "Security", + "Cloud-Computing", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7082,8 +8369,13 @@ }, "lychee": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "photo-gallery", + "image-organizer" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7094,8 +8386,14 @@ }, "nintendo-switch": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "switch-console", + "video-game-system" + ], + "categories": [ + "Gaming-Platforms", + "Hardware" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7106,8 +8404,14 @@ }, "sickchill": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "tv-show-automation", + "pvr-software" + ], + "categories": [ + "Download-Managers", + "Media-Servers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7118,8 +8422,14 @@ }, "google-search-console": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "seo-analytics", + "website-performance" + ], + "categories": [ + "Developper-Tools", + "Search-Engines" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7130,8 +8440,13 @@ }, "stump": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "comic-book-reader", + "cbr-server" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2024-10-13T18:42:14Z", "author": { @@ -7142,8 +8457,13 @@ }, "facebook": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "social-network", + "meta-platform" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7154,8 +8474,13 @@ }, "apple-tv-plus": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "apple-tv", + "streaming-service" + ], + "categories": [ + "Video-Streaming" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7170,8 +8495,14 @@ }, "channels-dvr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "digital-video-recorder", + "tv-recording" + ], + "categories": [ + "Media-Servers", + "Home-Automation" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7182,8 +8513,14 @@ }, "vmware-horizon": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "vdi-solution", + "remote-desktop-access" + ], + "categories": [ + "Operating-Systems", + "Server-Panels" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7194,8 +8531,13 @@ }, "synology-photos": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "photo-library", + "image-organizer" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7206,8 +8548,14 @@ }, "hedgedoc": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-markdown-editor", + "realtime-markdown" + ], + "categories": [ + "Office-Suites", + "Note-taking-Apps" + ], "update": { "timestamp": "2024-03-21T01:12:11Z", "author": { @@ -7218,8 +8566,13 @@ }, "gmail": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "google-mail", + "webmail-service" + ], + "categories": [ + "Email-Providers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7230,8 +8583,13 @@ }, "kutt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "link-shortening-service", + "custom-url-generator" + ], + "categories": [ + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7242,8 +8600,14 @@ }, "tweakers": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "dutch-tech-news", + "hardware-reviews" + ], + "categories": [ + "News", + "Technology-News" + ], "update": { "timestamp": "2025-04-08T16:38:19.694022", "author": { @@ -7254,8 +8618,14 @@ }, "snippetbox": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "code-snippets", + "pastebin-alternative" + ], + "categories": [ + "Developper-Tools", + "Note-taking-Apps" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7266,8 +8636,13 @@ }, "hastypaste": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "code-sharing", + "text-paste-service" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2023-08-10T08:28:08Z", "author": { @@ -7278,8 +8653,14 @@ }, "assetgrid": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "digital-asset-management", + "media-library" + ], + "categories": [ + "File-Sharing-&-Sync", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -7290,8 +8671,13 @@ }, "gpt4free": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "free-chatgpt", + "unlimited-ai-chat" + ], + "categories": [ + "AI-&-LLM-Platforms" + ], "update": { "timestamp": "2024-10-13T18:43:46Z", "author": { @@ -7302,8 +8688,14 @@ }, "google-home": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "smart-speaker", + "voice-assistant-device" + ], + "categories": [ + "Smart-Home", + "Home-Automation" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7314,8 +8706,13 @@ }, "socialhome": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "federated-social-network", + "decentralized-social-media" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7326,10 +8723,15 @@ }, "calibre": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "ebook-library", + "book-converter" + ], + "categories": [ + "Media-Servers" + ], "update": { - "timestamp": "2023-04-13T20:27:58Z", + "timestamp": "2023-04-13T20:27:58", "author": { "id": 71191962, "name": "walkxcode" @@ -7338,8 +8740,14 @@ }, "alloy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "no-code-platform", + "app-builder" + ], + "categories": [ + "Developper-Tools", + "Cloud-Computing" + ], "update": { "timestamp": "2024-06-01T17:32:11Z", "author": { @@ -7350,8 +8758,14 @@ }, "sensu": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "infrastructure-monitoring", + "server-monitoring" + ], + "categories": [ + "Monitoring-Tools", + "Networking-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7362,8 +8776,13 @@ }, "nextcloud-news": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "nextcloud-feed-reader", + "feed-aggregator" + ], + "categories": [ + "News" + ], "update": { "timestamp": "2023-09-16T20:31:13Z", "author": { @@ -7374,8 +8793,14 @@ }, "woodpecker-ci": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "continuous-integration", + "build-pipeline" + ], + "categories": [ + "Developper-Tools", + "Version-Control-Systems" + ], "update": { "timestamp": "2022-08-16T17:22:56Z", "author": { @@ -7386,10 +8811,15 @@ }, "fastmail": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "paid-email-service", + "privacy-email" + ], + "categories": [ + "Email-Providers" + ], "update": { - "timestamp": "2023-04-13T20:27:58Z", + "timestamp": "2023-04-13T20:27:58", "author": { "id": 71191962, "name": "walkxcode" @@ -7398,8 +8828,13 @@ }, "snapchat": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "photo-sharing-app", + "messaging-app" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7414,8 +8849,14 @@ }, "revolt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "discord-alternative", + "voice-chat-app" + ], + "categories": [ + "Networking-Tools", + "Communication" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7430,8 +8871,13 @@ }, "phanpy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "mastodon-android-client", + "federated-social-client" + ], + "categories": [ + "Social-Media" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7442,8 +8888,13 @@ }, "archivebox": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "web-archiver", + "site-scraper" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T19:32:46Z", "author": { @@ -7454,8 +8905,13 @@ }, "monero": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "privacy-coin", + "digital-currency" + ], + "categories": [ + "Finance-&-Banking" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7466,8 +8922,13 @@ }, "bitcoin": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "btc", + "digital-currency" + ], + "categories": [ + "Finance-&-Banking" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7478,8 +8939,13 @@ }, "openproject": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "task-management", + "project-planning" + ], + "categories": [ + "Organization" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7490,8 +8956,13 @@ }, "umami": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "privacy-focused-analytics", + "website-statistics" + ], + "categories": [ + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7506,8 +8977,13 @@ }, "multi-scrobbler": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "lastfm-scrobbler", + "music-activity-tracker" + ], + "categories": [ + "Music-Streaming" + ], "update": { "timestamp": "2024-01-28T15:19:34Z", "author": { @@ -7518,8 +8994,13 @@ }, "udemy": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "online-courses", + "e-learning-platform" + ], + "categories": [ + "Education" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7534,8 +9015,13 @@ }, "updog": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "file-upload", + "temporary-file-sharing" + ], + "categories": [ + "File-Sharing-&-Sync" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7546,8 +9032,14 @@ }, "squeezebox-server": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "upnp-server", + "audio-streaming-server" + ], + "categories": [ + "Media-Servers", + "Music-Streaming" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7558,8 +9050,14 @@ }, "converse": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "xmpp-chat-client", + "instant-messaging-app" + ], + "categories": [ + "Networking-Tools", + "Communication" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7574,8 +9072,14 @@ }, "davical": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "calendar-server", + "scheduling-server" + ], + "categories": [ + "Networking-Tools", + "Office-Suites" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7586,8 +9090,13 @@ }, "requestrr": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "plex-requests", + "jellyfin-requests" + ], + "categories": [ + "Media-Servers" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7598,11 +9107,16 @@ }, "metallb": { "base": "svg", - "aliases": [], + "aliases": [ + "kubernetes-load-balancer", + "service-lb" + ], "categories": [ "Cloud", "Hardware", - "Development" + "Development", + "Containerization-&-Orchestration", + "Networking-Tools" ], "update": { "timestamp": "2025-02-27T21:03:19.030832", @@ -7614,8 +9128,14 @@ }, "pg-back-web": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "postgres-backup-manager", + "database-backup-ui" + ], + "categories": [ + "Databases", + "Developper-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7626,8 +9146,14 @@ }, "bobcat-miner": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "helium-hotspot", + "crypto-miner" + ], + "categories": [ + "Hardware", + "Networking-Tools" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7638,8 +9164,13 @@ }, "opera-mini-beta": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "opera-mini-beta-channel", + "beta-browser" + ], + "categories": [ + "Web-Browsers" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7650,8 +9181,14 @@ }, "sigstore": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "digital-signatures", + "software-verification" + ], + "categories": [ + "Security", + "Developper-Tools" + ], "update": { "timestamp": "2024-03-21T00:59:33Z", "author": { @@ -7662,8 +9199,13 @@ }, "joal": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "music-app", + "android-music-player" + ], + "categories": [ + "Music-Streaming" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7674,8 +9216,14 @@ }, "rhodecode": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "code-repository", + "git-hosting" + ], + "categories": [ + "Version-Control-Systems", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7686,20 +9234,36 @@ }, "brother": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "printer-company", + "office-equipment" + ], + "categories": [ + "Hardware", + "Office-Suites" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { "id": 71191962, "name": "walkxcode" } + }, + "colors": { + "dark": "brother", + "light": "brother-light" } }, "openwrt": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "custom-router-firmware", + "linux-based-router" + ], + "categories": [ + "Networking-Tools", + "Operating-Systems" + ], "update": { "timestamp": "2022-09-09T10:03:51Z", "author": { @@ -7710,20 +9274,36 @@ }, "axis": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "security-camera-company", + "video-surveillance" + ], + "categories": [ + "Smart-Home", + "Hardware" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { "id": 71191962, "name": "walkxcode" } + }, + "colors": { + "dark": "axis", + "light": "axis-light" } }, "kibana": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "dashboarding-tool", + "log-analyzer" + ], + "categories": [ + "Monitoring-Tools", + "Developper-Tools" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7734,8 +9314,14 @@ }, "gladys-assistant": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "voice-controlled-home", + "smart-home-platform" + ], + "categories": [ + "Smart-Home", + "Home-Automation" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7746,8 +9332,13 @@ }, "windows-10": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "windows-os", + "win10" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2023-04-13T13:56:18Z", "author": { @@ -7758,8 +9349,13 @@ }, "windows-retro": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "windows-classic-theme", + "windows-95-theme" + ], + "categories": [ + "Operating-Systems" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { @@ -7774,8 +9370,13 @@ }, "brewpi": { "base": "png", - "aliases": [], - "categories": [], + "aliases": [ + "homebrewing-controller", + "fermentation-control" + ], + "categories": [ + "Home-Automation" + ], "update": { "timestamp": "2025-01-07T17:54:03Z", "author": { @@ -7786,8 +9387,14 @@ }, "wakatime": { "base": "svg", - "aliases": [], - "categories": [], + "aliases": [ + "coding-tracker", + "developer-analytics" + ], + "categories": [ + "Developper-Tools", + "Monitoring-Tools" + ], "update": { "timestamp": "2024-10-20T17:24:03Z", "author": { diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 00000000..18c7b4b9 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,45 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Cursor +.cursor +.env.local \ No newline at end of file diff --git a/web/README.md b/web/README.md new file mode 100644 index 00000000..fd9f1259 --- /dev/null +++ b/web/README.md @@ -0,0 +1,88 @@ +# Dashboard Icons Web App + +A web application to browse, search, and download icons from the [Dashboard Icons](https://github.com/homarr-labs/dashboard-icons) collection. + +## Features + +- Browse through a curated collection of beautiful dashboard icons +- Search icons by name, aliases, or categories +- View icon details including author, formats, and variants +- Download icons in different formats (SVG, PNG, WebP) +- Copy icon URLs directly to your clipboard +- Responsive design that works on mobile, tablet, and desktop +- Dark mode support + +## Tech Stack + +- **Next.js 15** - React framework with App Router +- **TypeScript v5** - Type-safe JavaScript +- **Tailwind CSS** - Utility-first CSS framework +- **Shadcn UI** - Reusable components built with Radix UI and Tailwind + +## Project Structure + +``` +src/ +├── app/ # Next.js App Router +│ ├── api/ # API routes +│ │ └── icons/ # Icons browsing and detail pages +│ │ ├── [icon]/ # Dynamic icon detail page +│ │ │ ├── components/ # Icon-specific components +│ │ │ ├── error.tsx # Error handling +│ │ │ ├── loading.tsx # Loading state +│ │ │ └── page.tsx # Icon detail page +│ │ ├── components/ # Icons page components +│ │ ├── loading.tsx # Loading state +│ │ └── page.tsx # Icons browse page +│ ├── globals.css # Global styles +│ ├── layout.tsx # Root layout +│ ├── page.tsx # Homepage +│ └── theme-provider.tsx # Theme provider component +├── components/ # Shared components +│ ├── ui/ # UI components (from shadcn/ui) +│ ├── header.tsx # App header +│ └── theme-switcher.tsx # Theme switcher +├── lib/ # Utility functions +│ ├── api.ts # API utilities +│ └── utils.ts # General utilities +└── types/ # TypeScript type definitions + ├── icons.ts # Icon-related types + └── index.ts # Type exports +``` + +## Development + +### Prerequisites + +- Node.js 18+ +- pnpm + +### Installation + +1. Clone the repository +2. Install dependencies: + ```bash + pnpm install + ``` +3. Create a `.env` file with the following variables: + ``` + GITHUB_TOKEN=your_github_token + ``` +4. Start the development server: + ```bash + pnpm dev + ``` + +### Build + +```bash +pnpm build +``` + +### Deployment + +The application is optimized for deployment on Vercel. + +## Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. diff --git a/web/biome.json b/web/biome.json new file mode 100644 index 00000000..1dbf24a0 --- /dev/null +++ b/web/biome.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "ignore": ["src/components/ui/**"] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "lineWidth": 140, + "semicolons": "asNeeded", + "quoteStyle": "double" + } + } +} diff --git a/web/components.json b/web/components.json new file mode 100644 index 00000000..8b07dc63 --- /dev/null +++ b/web/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/web/next.config.ts b/web/next.config.ts new file mode 100644 index 00000000..293bd585 --- /dev/null +++ b/web/next.config.ts @@ -0,0 +1,10 @@ +import type { NextConfig } from "next" + +const nextConfig: NextConfig = { + images: { + unoptimized: true, + }, + output: "export", +} + +export default nextConfig diff --git a/web/package.json b/web/package.json new file mode 100644 index 00000000..5f7cc94b --- /dev/null +++ b/web/package.json @@ -0,0 +1,80 @@ +{ + "name": "web", + "version": "0.2.0", + "private": false, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "format": "biome check --write", + "lint": "biome lint --write", + "ci": "biome check --write" + }, + "dependencies": { + "@hookform/resolvers": "^5.0.1", + "@radix-ui/react-accordion": "^1.2.4", + "@radix-ui/react-alert-dialog": "^1.1.7", + "@radix-ui/react-aspect-ratio": "^1.1.3", + "@radix-ui/react-avatar": "^1.1.4", + "@radix-ui/react-checkbox": "^1.1.5", + "@radix-ui/react-collapsible": "^1.1.4", + "@radix-ui/react-context-menu": "^2.2.7", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-dropdown-menu": "^2.1.7", + "@radix-ui/react-hover-card": "^1.1.7", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-menubar": "^1.1.7", + "@radix-ui/react-navigation-menu": "^1.2.6", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-progress": "^1.1.3", + "@radix-ui/react-radio-group": "^1.2.4", + "@radix-ui/react-scroll-area": "^1.2.4", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-separator": "^1.1.3", + "@radix-ui/react-slider": "^1.2.4", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-switch": "^1.1.4", + "@radix-ui/react-tabs": "^1.1.4", + "@radix-ui/react-toggle": "^1.1.3", + "@radix-ui/react-toggle-group": "^1.1.3", + "@radix-ui/react-tooltip": "^1.2.0", + "@tanstack/react-virtual": "^3.13.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "embla-carousel-react": "^8.6.0", + "framer-motion": "^12.6.5", + "input-otp": "^1.4.2", + "lucide-react": "^0.487.0", + "motion": "^12.6.5", + "next": "15.3.0", + "next-themes": "^0.4.6", + "posthog-js": "^1.235.6", + "posthog-node": "^4.11.3", + "react": "^19.1.0", + "react-day-picker": "8.10.1", + "react-dom": "^19.1.0", + "react-hook-form": "^7.55.0", + "react-resizable-panels": "^2.1.7", + "recharts": "^2.15.2", + "sonner": "^2.0.3", + "tailwind-merge": "^3.2.0", + "tw-animate-css": "^1.2.5", + "vaul": "^1.1.2", + "zod": "^3.24.2" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@tailwindcss/postcss": "^4.1.3", + "@types/node": "^22.14.0", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.2", + "tailwindcss": "^4.1.3", + "typescript": "^5.8.3" + }, + "packageManager": "pnpm@10.8.0", + "pnpm": { + "onlyBuiltDependencies": ["@biomejs/biome", "sharp"] + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 00000000..0e56acf6 --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,3297 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hookform/resolvers': + specifier: ^5.0.1 + version: 5.0.1(react-hook-form@7.55.0(react@19.1.0)) + '@radix-ui/react-accordion': + specifier: ^1.2.4 + version: 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-aspect-ratio': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-avatar': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-checkbox': + specifier: ^1.1.5 + version: 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collapsible': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-context-menu': + specifier: ^2.2.7 + version: 2.2.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.7 + version: 2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-hover-card': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-label': + specifier: ^2.1.3 + version: 2.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-menubar': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-navigation-menu': + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popover': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-progress': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-radio-group': + specifier: ^1.2.4 + version: 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-scroll-area': + specifier: ^1.2.4 + version: 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-select': + specifier: ^2.1.7 + version: 2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-separator': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slider': + specifier: ^1.2.4 + version: 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-switch': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-tabs': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle-group': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-tooltip': + specifier: ^1.2.0 + version: 1.2.0(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-virtual': + specifier: ^3.13.6 + version: 3.13.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + embla-carousel-react: + specifier: ^8.6.0 + version: 8.6.0(react@19.1.0) + framer-motion: + specifier: ^12.6.5 + version: 12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + input-otp: + specifier: ^1.4.2 + version: 1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + lucide-react: + specifier: ^0.487.0 + version: 0.487.0(react@19.1.0) + motion: + specifier: ^12.6.5 + version: 12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: + specifier: 15.3.0 + version: 15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + posthog-js: + specifier: ^1.235.6 + version: 1.235.6 + posthog-node: + specifier: ^4.11.3 + version: 4.11.3 + react: + specifier: ^19.1.0 + version: 19.1.0 + react-day-picker: + specifier: 8.10.1 + version: 8.10.1(date-fns@4.1.0)(react@19.1.0) + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + react-hook-form: + specifier: ^7.55.0 + version: 7.55.0(react@19.1.0) + react-resizable-panels: + specifier: ^2.1.7 + version: 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + recharts: + specifier: ^2.15.2 + version: 2.15.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + sonner: + specifier: ^2.0.3 + version: 2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tailwind-merge: + specifier: ^3.2.0 + version: 3.2.0 + tw-animate-css: + specifier: ^1.2.5 + version: 1.2.5 + vaul: + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@biomejs/biome': + specifier: 1.9.4 + version: 1.9.4 + '@tailwindcss/postcss': + specifier: ^4.1.3 + version: 4.1.3 + '@types/node': + specifier: ^22.14.0 + version: 22.14.0 + '@types/react': + specifier: ^19.1.0 + version: 19.1.0 + '@types/react-dom': + specifier: ^19.1.2 + version: 19.1.2(@types/react@19.1.0) + tailwindcss: + specifier: ^4.1.3 + version: 4.1.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@1.9.4': + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.4': + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.4': + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.4': + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.4': + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.4': + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.4': + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.4': + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@emnapi/runtime@1.4.0': + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@hookform/resolvers@5.0.1': + resolution: {integrity: sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==} + peerDependencies: + react-hook-form: ^7.55.0 + + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@next/env@15.3.0': + resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} + + '@next/swc-darwin-arm64@15.3.0': + resolution: {integrity: sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.3.0': + resolution: {integrity: sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.3.0': + resolution: {integrity: sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.3.0': + resolution: {integrity: sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.3.0': + resolution: {integrity: sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.3.0': + resolution: {integrity: sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.3.0': + resolution: {integrity: sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.3.0': + resolution: {integrity: sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-accordion@1.2.4': + resolution: {integrity: sha512-SGCxlSBaMvEzDROzyZjsVNzu9XY5E28B3k8jOENyrz6csOv/pG1eHyYfLJai1n9tRjwG61coXDhfpgtxKxUv5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.1.7': + resolution: {integrity: sha512-7Gx1gcoltd0VxKoR8mc+TAVbzvChJyZryZsTam0UhoL92z0L+W8ovxvcgvd+nkz24y7Qc51JQKBAGe4+825tYw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.3': + resolution: {integrity: sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.3': + resolution: {integrity: sha512-yIrYZUc2e/JtRkDpuJCmaR6kj/jzekDfQLcPFdEWzSOygCPy8poR4YcszaHP5A7mh25ncofHEpeTwfhxEuBv8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.1.4': + resolution: {integrity: sha512-+kBesLBzwqyDiYCtYFK+6Ktf+N7+Y6QOTUueLGLIbLZ/YeyFW6bsBGDsN+5HxHpM55C90u5fxsg0ErxzXTcwKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.1.5': + resolution: {integrity: sha512-B0gYIVxl77KYDR25AY9EGe/G//ef85RVBIxQvK+m5pxAC7XihAc/8leMHhDvjvhDu02SBSb6BuytlWr/G7F3+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.4': + resolution: {integrity: sha512-u7LCw1EYInQtBNLGjm9nZ89S/4GcvX1UR5XbekEgnQae2Hkpq39ycJ1OhdeN1/JDfVNG91kWaWoest127TaEKQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.3': + resolution: {integrity: sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.7': + resolution: {integrity: sha512-EwO3tyyqwGaLPg0P64jmIKJnBywD0yjiL1eRuMPyhUXPkWWpa5JPDS+oyeIWHy2JbhF+NUlfUPVq6vE7OqgZww==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.7': + resolution: {integrity: sha512-EIdma8C0C/I6kL6sO02avaCRqi3fmWJpxH6mqbVScorW6nNktzKJT/le7VPho3o/7wCsyRg3z0+Q+Obr0Gy/VQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.6': + resolution: {integrity: sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.7': + resolution: {integrity: sha512-7/1LiuNZuCQE3IzdicGoHdQOHkS2Q08+7p8w6TXZ6ZjgAULaCI85ZY15yPl4o4FVgoKLRT43/rsfNVN8osClQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.3': + resolution: {integrity: sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.7': + resolution: {integrity: sha512-HwM03kP8psrv21J1+9T/hhxi0f5rARVbqIZl9+IAq13l4j4fX+oGIuxisukZZmebO7J35w9gpoILvtG8bbph0w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.3': + resolution: {integrity: sha512-zwSQ1NzSKG95yA0tvBMgv6XPHoqapJCcg9nsUBaQQ66iRBhZNhlpaQG2ERYYX4O4stkYFK5rxj5NsWfO9CS+Hg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.7': + resolution: {integrity: sha512-tBODsrk68rOi1/iQzbM54toFF+gSw/y+eQgttFflqlGekuSebNqvFNHjJgjqPhiMb4Fw9A0zNFly1QT6ZFdQ+Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.7': + resolution: {integrity: sha512-YB2zFhGdZ5SWEgRS+PgrF7EkwpsjEHntIFB/LRbT49LJdnIeK/xQQyuwLiRcOCgTDN+ALlPXQ08f0P0+TfR41g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.6': + resolution: {integrity: sha512-HJqyzqG74Lj7KV58rk73i/B1nnopVyCfUmKgeGWWrZZiCuMNcY0KKugTrmqMbIeMliUnkBUDKCy9J6Mzl6xeWw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.7': + resolution: {integrity: sha512-I38OYWDmJF2kbO74LX8UsFydSHWOJuQ7LxPnTefjxxvdvPLempvAnmsyX9UsBlywcbSGpRH7oMLfkUf+ij4nrw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.3': + resolution: {integrity: sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.5': + resolution: {integrity: sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.3': + resolution: {integrity: sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.3': + resolution: {integrity: sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.3': + resolution: {integrity: sha512-F56aZPGTPb4qJQ/vDjnAq63oTu/DRoIG/Asb5XKOWj8rpefNLtUllR969j5QDN2sRrTk9VXIqQDRj5VvAuquaw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.2.4': + resolution: {integrity: sha512-oLz7ATfKgVTUbpr5OBu6Q7hQcnV22uPT306bmG0QwgnKqBStR98RfWfJGCfW/MmhL4ISmrmmBPBW+c77SDwV9g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.3': + resolution: {integrity: sha512-ufbpLUjZiOg4iYgb2hQrWXEPYX6jOLBbR27bDyAff5GYMRrCzcze8lukjuXVUQvJ6HZe8+oL+hhswDcjmcgVyg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.4': + resolution: {integrity: sha512-G9rdWTQjOR4sk76HwSdROhPU0jZWpfozn9skU1v4N0/g9k7TmswrJn8W8WMU+aYktnLLpk5LX6fofj2bGe5NFQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.7': + resolution: {integrity: sha512-exzGIRtc7S8EIM2KjFg+7lJZsH7O7tpaBaJbBNVDnOZNhtoQ2iV+iSNfi2Wth0m6h3trJkMVvzAehB3c6xj/3Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.3': + resolution: {integrity: sha512-2omrWKJvxR0U/tkIXezcc1nFMwtLU0+b/rDK40gnzJqTLWQ/TD/D5IYVefp9sC3QWfeQbpSbEA6op9MQKyaALQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.2.4': + resolution: {integrity: sha512-Vr/OgNejNJPAghIhjS7Mf/2F/EXGDT0qgtiHf2BHz71+KqgN+jndFLKq5xAB9JOGejGzejfJLIvT04Do+yzhcg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.1.4': + resolution: {integrity: sha512-zGP6W8plLeogoeGMiTHJ/uvf+TE1C2chVsEwfP8YlvpQKJHktG+iCkUtCLGPAuDV8/qDSmIRPm4NggaTxFMVBQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.4': + resolution: {integrity: sha512-fuHMHWSf5SRhXke+DbHXj2wVMo+ghVH30vhX3XVacdXqDl+J4XWafMIGOOER861QpBx1jxgwKXL2dQnfrsd8MQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.3': + resolution: {integrity: sha512-khTzdGIxy8WurYUEUrapvj5aOev/tUA8TDEFi1D0Dn3yX+KR5AqjX0b7E5sL9ngRRpxDN2RRJdn5siasu5jtcg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.3': + resolution: {integrity: sha512-Za5HHd9nvsiZ2t3EI/dVd4Bm/JydK+D22uHKk46fPtvuPxVCJBUo5mQybN+g5sZe35y7I6GDTTfdkVv5SnxlFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.0': + resolution: {integrity: sha512-b1Sdc75s7zN9B8ONQTGBSHL3XS8+IcjcOIY51fhM4R1Hx8s0YbgqgyNZiri4qcYMVZK8hfCZVBiyCm7N9rs0rw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.1': + resolution: {integrity: sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.3': + resolution: {integrity: sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.1.3': + resolution: {integrity: sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==} + + '@tailwindcss/oxide-android-arm64@4.1.3': + resolution: {integrity: sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.3': + resolution: {integrity: sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.3': + resolution: {integrity: sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.3': + resolution: {integrity: sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3': + resolution: {integrity: sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.3': + resolution: {integrity: sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.3': + resolution: {integrity: sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.3': + resolution: {integrity: sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.3': + resolution: {integrity: sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.3': + resolution: {integrity: sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.3': + resolution: {integrity: sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.3': + resolution: {integrity: sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.3': + resolution: {integrity: sha512-6s5nJODm98F++QT49qn8xJKHQRamhYHfMi3X7/ltxiSQ9dyRsaFSfFkfaMsanWzf+TMYQtbk8mt5f6cCVXJwfg==} + + '@tanstack/react-virtual@3.13.6': + resolution: {integrity: sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.6': + resolution: {integrity: sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/node@22.14.0': + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} + + '@types/react-dom@19.1.2': + resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.0': + resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001713: + resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.1.1: + resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + core-js@3.41.0: + resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + embla-carousel-react@8.6.0: + resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} + peerDependencies: + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + embla-carousel-reactive-utils@8.6.0: + resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} + engines: {node: '>=6.0.0'} + + fflate@0.4.8: + resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + framer-motion@12.6.5: + resolution: {integrity: sha512-MKvnWov0paNjvRJuIy6x418w23tFqRfS6CXHhZrCiSEpXVlo/F+usr8v4/3G6O0u7CpsaO1qop+v4Ip7PRCBqQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + input-otp@1.4.2: + resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lucide-react@0.487.0: + resolution: {integrity: sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + motion-dom@12.6.5: + resolution: {integrity: sha512-jpM9TQLXzYMWMJ7Ec7sAj0iis8oIuu6WvjI3yNKJLdrZyrsI/b2cRInDVL8dCl683zQQq19DpL9cSMP+k8T1NA==} + + motion-utils@12.6.5: + resolution: {integrity: sha512-IsOeKsOF+FWBhxQEDFBO6ZYC8/jlidmVbbLpe9/lXSA9j9kzGIMUuIBx2SZY+0reAS0DjZZ1i7dJp4NHrjocPw==} + + motion@12.6.5: + resolution: {integrity: sha512-X3IIy76nxyk4I87xQEm5Ah8ojQ4qisd+/H592eXF14ha+xqpbDJcWOSf9PEKCOCC0K4PN/0UBaz+MvSQUkIeXQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@15.3.0: + resolution: {integrity: sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + posthog-js@1.235.6: + resolution: {integrity: sha512-zQE5WCjOas6FY9lUfGn61Tj4n87kNsN9M9/XfEO3lPHffoFFIBO8OVEpe6EMUaSVfBG4GpaB5EoyvX1Hi0tIPA==} + peerDependencies: + '@rrweb/types': 2.0.0-alpha.17 + rrweb-snapshot: 2.0.0-alpha.17 + peerDependenciesMeta: + '@rrweb/types': + optional: true + rrweb-snapshot: + optional: true + + posthog-node@4.11.3: + resolution: {integrity: sha512-Ye7d9ZJX1reWP9084Gm9+O7NnvlW7LnbU09GzlsSdD0HzGTfxeKTQZsl9h1+CDHhfvpdWJRm8uc91/aDmXzaCA==} + engines: {node: '>=15.0.0'} + + preact@10.26.5: + resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + react-day-picker@8.10.1: + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + peerDependencies: + date-fns: ^2.28.0 || ^3.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-hook-form@7.55.0: + resolution: {integrity: sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-resizable-panels@2.1.7: + resolution: {integrity: sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + react-smooth@4.0.4: + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.15.2: + resolution: {integrity: sha512-xv9lVztv3ingk7V3Jf05wfAZbM9Q2umJzu5t/cfnAK7LUslNrGT7LPBr74G+ok8kSCeFMaePmWMg0rcYOnczTw==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sonner@2.0.3: + resolution: {integrity: sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + tailwind-merge@3.2.0: + resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} + + tailwindcss@4.1.3: + resolution: {integrity: sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.2.5: + resolution: {integrity: sha512-ABzjfgVo+fDbhRREGL4KQZUqqdPgvc5zVrLyeW9/6mVqvaDepXc7EvedA+pYmMnIOsUAQMwcWzNvom26J2qYvQ==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + + web-vitals@4.2.4: + resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@biomejs/biome@1.9.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 + + '@biomejs/cli-darwin-arm64@1.9.4': + optional: true + + '@biomejs/cli-darwin-x64@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64@1.9.4': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-x64@1.9.4': + optional: true + + '@biomejs/cli-win32-arm64@1.9.4': + optional: true + + '@biomejs/cli-win32-x64@1.9.4': + optional: true + + '@emnapi/runtime@1.4.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/utils@0.2.9': {} + + '@hookform/resolvers@5.0.1(react-hook-form@7.55.0(react@19.1.0))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.55.0(react@19.1.0) + + '@img/sharp-darwin-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + optional: true + + '@img/sharp-darwin-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.1.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.1.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.1.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + + '@img/sharp-linux-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + optional: true + + '@img/sharp-linux-arm@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + optional: true + + '@img/sharp-linux-s390x@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + optional: true + + '@img/sharp-linux-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + optional: true + + '@img/sharp-wasm32@0.34.1': + dependencies: + '@emnapi/runtime': 1.4.0 + optional: true + + '@img/sharp-win32-ia32@0.34.1': + optional: true + + '@img/sharp-win32-x64@0.34.1': + optional: true + + '@next/env@15.3.0': {} + + '@next/swc-darwin-arm64@15.3.0': + optional: true + + '@next/swc-darwin-x64@15.3.0': + optional: true + + '@next/swc-linux-arm64-gnu@15.3.0': + optional: true + + '@next/swc-linux-arm64-musl@15.3.0': + optional: true + + '@next/swc-linux-x64-gnu@15.3.0': + optional: true + + '@next/swc-linux-x64-musl@15.3.0': + optional: true + + '@next/swc-win32-arm64-msvc@15.3.0': + optional: true + + '@next/swc-win32-x64-msvc@15.3.0': + optional: true + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-accordion@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collapsible': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-alert-dialog@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dialog': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-arrow@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-aspect-ratio@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-avatar@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-checkbox@1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-collapsible@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-collection@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-context-menu@2.2.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-menu': 2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-context@1.1.2(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-dialog@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-dismissable-layer@1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-dropdown-menu@2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-menu': 2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-focus-scope@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-hover-card@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-id@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-label@2.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-menu@2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-menubar@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-menu': 2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-navigation-menu@1.2.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-popover@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-popper@1.2.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-portal@1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-presence@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-primitive@2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-progress@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-radio-group@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-roving-focus@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-scroll-area@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-select@2.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-separator@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-slider@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-slot@1.2.0(@types/react@19.1.0)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-switch@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-tabs@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-toggle-group@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-toggle@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-tooltip@1.2.0(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-use-controllable-state@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.0)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.0 + + '@radix-ui/react-visually-hidden@1.1.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.2(@types/react@19.1.0) + + '@radix-ui/rect@1.1.1': {} + + '@standard-schema/utils@0.3.0': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.3': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.3 + + '@tailwindcss/oxide-android-arm64@4.1.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.3': + optional: true + + '@tailwindcss/oxide@4.1.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.3 + '@tailwindcss/oxide-darwin-arm64': 4.1.3 + '@tailwindcss/oxide-darwin-x64': 4.1.3 + '@tailwindcss/oxide-freebsd-x64': 4.1.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.3 + '@tailwindcss/oxide-linux-x64-musl': 4.1.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.3 + + '@tailwindcss/postcss@4.1.3': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.3 + '@tailwindcss/oxide': 4.1.3 + postcss: 8.5.3 + tailwindcss: 4.1.3 + + '@tanstack/react-virtual@3.13.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/virtual-core': 3.13.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@tanstack/virtual-core@3.13.6': {} + + '@types/d3-array@3.2.1': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/node@22.14.0': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.1.2(@types/react@19.1.0)': + dependencies: + '@types/react': 19.1.0 + + '@types/react@19.1.0': + dependencies: + csstype: 3.1.3 + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + asynckit@0.4.0: {} + + axios@1.8.4: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + caniuse-lite@1.0.30001713: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + client-only@0.0.1: {} + + clsx@2.1.1: {} + + cmdk@1.1.1(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dialog': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + optional: true + + color-name@1.1.4: + optional: true + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + core-js@3.41.0: {} + + csstype@3.1.3: {} + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.0: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + date-fns@4.1.0: {} + + decimal.js-light@2.5.1: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.0.3: {} + + detect-node-es@1.1.0: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.27.0 + csstype: 3.1.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + embla-carousel-react@8.6.0(react@19.1.0): + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + react: 19.1.0 + + embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel@8.6.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + eventemitter3@4.0.7: {} + + fast-equals@5.2.2: {} + + fflate@0.4.8: {} + + follow-redirects@1.15.9: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + framer-motion@12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + motion-dom: 12.6.5 + motion-utils: 12.6.5 + tslib: 2.8.1 + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + input-otp@1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + internmap@2.0.3: {} + + is-arrayish@0.3.2: + optional: true + + jiti@2.4.2: {} + + js-tokens@4.0.0: {} + + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lucide-react@0.487.0(react@19.1.0): + dependencies: + react: 19.1.0 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + motion-dom@12.6.5: + dependencies: + motion-utils: 12.6.5 + + motion-utils@12.6.5: {} + + motion@12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + framer-motion: 12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + nanoid@3.3.11: {} + + next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@next/env': 15.3.0 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001713 + postcss: 8.4.31 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styled-jsx: 5.1.6(react@19.1.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.3.0 + '@next/swc-darwin-x64': 15.3.0 + '@next/swc-linux-arm64-gnu': 15.3.0 + '@next/swc-linux-arm64-musl': 15.3.0 + '@next/swc-linux-x64-gnu': 15.3.0 + '@next/swc-linux-x64-musl': 15.3.0 + '@next/swc-win32-arm64-msvc': 15.3.0 + '@next/swc-win32-x64-msvc': 15.3.0 + sharp: 0.34.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + object-assign@4.1.1: {} + + picocolors@1.1.1: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthog-js@1.235.6: + dependencies: + core-js: 3.41.0 + fflate: 0.4.8 + preact: 10.26.5 + web-vitals: 4.2.4 + + posthog-node@4.11.3: + dependencies: + axios: 1.8.4 + transitivePeerDependencies: + - debug + + preact@10.26.5: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-from-env@1.1.0: {} + + react-day-picker@8.10.1(date-fns@4.1.0)(react@19.1.0): + dependencies: + date-fns: 4.1.0 + react: 19.1.0 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-hook-form@7.55.0(react@19.1.0): + dependencies: + react: 19.1.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.1.0)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.0)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.0 + + react-remove-scroll@2.6.3(@types/react@19.1.0)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.0)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.0)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.0)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + + react-resizable-panels@2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + react-smooth@4.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + fast-equals: 5.2.2 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-transition-group: 4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + react-style-singleton@2.2.3(@types/react@19.1.0)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.0 + + react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + react@19.1.0: {} + + recharts-scale@0.4.5: + dependencies: + decimal.js-light: 2.5.1 + + recharts@2.15.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + clsx: 2.1.1 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-is: 18.3.1 + react-smooth: 4.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 + + regenerator-runtime@0.14.1: {} + + scheduler@0.26.0: {} + + semver@7.7.1: + optional: true + + sharp@0.34.1: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 + optional: true + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + + sonner@2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + source-map-js@1.2.1: {} + + streamsearch@1.1.0: {} + + styled-jsx@5.1.6(react@19.1.0): + dependencies: + client-only: 0.0.1 + react: 19.1.0 + + tailwind-merge@3.2.0: {} + + tailwindcss@4.1.3: {} + + tapable@2.2.1: {} + + tiny-invariant@1.3.3: {} + + tslib@2.8.1: {} + + tw-animate-css@1.2.5: {} + + typescript@5.8.3: {} + + undici-types@6.21.0: {} + + use-callback-ref@1.3.3(@types/react@19.1.0)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.0 + + use-sidecar@1.1.3(@types/react@19.1.0)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.0 + + vaul@1.1.2(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@radix-ui/react-dialog': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + victory-vendor@36.9.2: + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + web-vitals@4.2.4: {} + + zod@3.24.2: {} diff --git a/web/postcss.config.mjs b/web/postcss.config.mjs new file mode 100644 index 00000000..78452aad --- /dev/null +++ b/web/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +} + +export default config diff --git a/web/public/og-image.png b/web/public/og-image.png new file mode 100644 index 00000000..9ef04c18 Binary files /dev/null and b/web/public/og-image.png differ diff --git a/web/src/app/globals.css b/web/src/app/globals.css new file mode 100644 index 00000000..1baebcda --- /dev/null +++ b/web/src/app/globals.css @@ -0,0 +1,142 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --animate-accordion-down: accordion-down 0.2s ease-out; + --animate-accordion-up: accordion-up 0.2s ease-out; + + @keyframes accordion-down { + from { + height: 0; + } + to { + height: var(--radix-accordion-content-height); + } + } + + @keyframes accordion-up { + from { + height: var(--radix-accordion-content-height); + } + to { + height: 0; + } + } +} + +:root { + --radius: 0.3rem; + --background: oklch(1 0 0); + --foreground: oklch(0.141 0.005 285.823); + --card: oklch(1 0 0); + --card-foreground: oklch(0.141 0.005 285.823); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.141 0.005 285.823); + --primary: oklch(0.637 0.237 25.331); + --primary-foreground: oklch(0.971 0.013 17.38); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.967 0.001 286.375); + --muted-foreground: oklch(0.552 0.016 285.938); + --accent: oklch(0.967 0.001 286.375); + --accent-foreground: oklch(0.21 0.006 285.885); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.92 0.004 286.32); + --input: oklch(0.92 0.004 286.32); + --ring: oklch(0.637 0.237 25.331); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.141 0.005 285.823); + --sidebar-primary: oklch(0.637 0.237 25.331); + --sidebar-primary-foreground: oklch(0.971 0.013 17.38); + --sidebar-accent: oklch(0.967 0.001 286.375); + --sidebar-accent-foreground: oklch(0.21 0.006 285.885); + --sidebar-border: oklch(0.92 0.004 286.32); + --sidebar-ring: oklch(0.637 0.237 25.331); +} + +.dark { + --background: oklch(0.141 0.005 285.823); + --foreground: oklch(0.985 0 0); + --card: oklch(0.21 0.006 285.885); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.21 0.006 285.885); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.637 0.237 25.331); + --primary-foreground: oklch(0.971 0.013 17.38); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.274 0.006 286.033); + --muted-foreground: oklch(0.705 0.015 286.067); + --accent: oklch(0.274 0.006 286.033); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.637 0.237 25.331); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.21 0.006 285.885); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.637 0.237 25.331); + --sidebar-primary-foreground: oklch(0.971 0.013 17.38); + --sidebar-accent: oklch(0.274 0.006 286.033); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.637 0.237 25.331); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/web/src/app/icon.svg b/web/src/app/icon.svg new file mode 100755 index 00000000..d3f858ca --- /dev/null +++ b/web/src/app/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/app/icons/[icon]/page.tsx b/web/src/app/icons/[icon]/page.tsx new file mode 100644 index 00000000..6e685a3c --- /dev/null +++ b/web/src/app/icons/[icon]/page.tsx @@ -0,0 +1,99 @@ +import { IconDetails } from "@/components/icon-details" +import { BASE_URL } from "@/constants" +import { getAllIcons, getAuthorData } from "@/lib/api" +import type { Metadata, ResolvingMetadata } from "next" +import { notFound } from "next/navigation" + +export const dynamicParams = false + +export async function generateStaticParams() { + const iconsData = await getAllIcons() + return Object.keys(iconsData).map((icon) => ({ + icon, + })) +} + +export const dynamic = "force-static" + +type Props = { + params: Promise<{ icon: string }> + searchParams: Promise<{ [key: string]: string | string[] | undefined }> +} + +export async function generateMetadata({ params, searchParams }: Props, parent: ResolvingMetadata): Promise { + const { icon } = await params + const iconsData = await getAllIcons() + if (!iconsData[icon]) { + notFound() + } + const previousImages = (await parent).openGraph?.images || [] + const authorData = await getAuthorData(iconsData[icon].update.author.id) + const authorName = authorData.name || authorData.login + const updateDate = new Date(iconsData[icon].update.timestamp) + + console.debug(`Generated metadata for ${icon} by ${authorName} (${authorData.html_url}) updated at ${updateDate.toLocaleString()}`) + + const iconImageUrl = `${BASE_URL}/png/${icon}.png` + const pageUrl = `${BASE_URL}/icons/${icon}` + + return { + title: `${icon} icon · Dashboard Icons`, + description: `Download and use the ${icon} icon from Dashboard Icons for your applications`, + keywords: [`${icon} icon`, "dashboard icon", "free icon", "open source icon", "application icon"], + authors: [ + { + name: "homarr", + url: "https://homarr.dev", + }, + { + name: authorName, + url: authorData.html_url, + }, + ], + openGraph: { + title: `${icon} icon · Dashboard Icons`, + description: `Download and use the ${icon} icon from Dashboard Icons for your applications`, + type: "article", + url: pageUrl, + images: [ + { + url: iconImageUrl, + width: 512, + height: 512, + alt: `${icon} icon`, + type: "image/png", + }, + ...previousImages, + ], + authors: [authorName, "homarr"], + publishedTime: updateDate.toISOString(), + modifiedTime: updateDate.toISOString(), + }, + twitter: { + card: "summary_large_image", + title: `${icon} icon · Dashboard Icons`, + description: `Download and use the ${icon} icon from Dashboard Icons for your applications`, + images: [iconImageUrl], + creator: "@ajnavocado", + }, + alternates: { + canonical: pageUrl, + }, + } +} + +export default async function IconPage({ params }: { params: Promise<{ icon: string }> }) { + const { icon } = await params + const iconsData = await getAllIcons() + const originalIconData = iconsData[icon] + + if (!originalIconData) { + notFound() + } + + // Pass originalIconData directly, assuming IconDetails can handle it + const iconData = originalIconData + + const authorData = await getAuthorData(originalIconData.update.author.id) + return +} diff --git a/web/src/app/icons/components.tsx b/web/src/app/icons/components.tsx new file mode 100644 index 00000000..19773e1f --- /dev/null +++ b/web/src/app/icons/components.tsx @@ -0,0 +1,87 @@ +"use client" + +import { Input } from "@/components/ui/input" +import { BASE_URL } from "@/constants" +import type { IconSearchProps, IconWithName } from "@/types/icons" +import { Search } from "lucide-react" +import Image from "next/image" +import Link from "next/link" +import { useState } from "react" + +export function IconSearch({ icons, initialQuery = "" }: IconSearchProps) { + const [searchQuery, setSearchQuery] = useState(initialQuery) + const [filteredIcons, setFilteredIcons] = useState(() => { + if (!initialQuery.trim()) return icons + + const q = initialQuery.toLowerCase() + return icons.filter(({ name, data }) => { + if (name.toLowerCase().includes(q)) return true + if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true + if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + + return false + }) + }) + + const handleSearch = (query: string) => { + setSearchQuery(query) + + if (!query.trim()) { + setFilteredIcons(icons) + return + } + + const q = query.toLowerCase() + const filtered = icons.filter(({ name, data }) => { + if (name.toLowerCase().includes(q)) return true + if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true + if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + + return false + }) + + setFilteredIcons(filtered) + } + + return ( + <> +
+ + handleSearch(e.target.value)} + /> +
+ + {filteredIcons.length === 0 ? ( +
+

No icons found

+

Try a different search term.

+
+ ) : ( +
+ {filteredIcons.map(({ name, data }) => ( + +
+ {`${name} +
+ {name.replace(/-/g, " ")} + + ))} +
+ )} + + ) +} diff --git a/web/src/app/icons/components/icon-search.tsx b/web/src/app/icons/components/icon-search.tsx new file mode 100644 index 00000000..35b83185 --- /dev/null +++ b/web/src/app/icons/components/icon-search.tsx @@ -0,0 +1,127 @@ +"use client" + +import { IconSubmissionContent } from "@/components/icon-submission-form" +import { Input } from "@/components/ui/input" +import { BASE_URL } from "@/constants" +import type { IconSearchProps } from "@/types/icons" +import { Search } from "lucide-react" +import Image from "next/image" +import Link from "next/link" +import { usePathname, useRouter, useSearchParams } from "next/navigation" +import { useCallback, useEffect, useRef, useState } from "react" + +export function IconSearch({ icons }: IconSearchProps) { + const searchParams = useSearchParams() + const initialQuery = searchParams.get("q") + const router = useRouter() + const pathname = usePathname() + const [searchQuery, setSearchQuery] = useState(initialQuery ?? "") + const timeoutRef = useRef(null) + const [filteredIcons, setFilteredIcons] = useState(() => { + if (!initialQuery?.trim()) return icons + + const q = initialQuery.toLowerCase() + return icons.filter(({ name, data }) => { + if (name.toLowerCase().includes(q)) return true + if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true + if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + + return false + }) + }) + const filterIcons = useCallback( + (query: string) => { + if (!query.trim()) { + return icons + } + + const q = query.toLowerCase() + return icons.filter(({ name, data }) => { + if (name.toLowerCase().includes(q)) return true + if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true + if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + + return false + }) + }, + [icons], + ) + const updateResults = useCallback( + (query: string) => { + setFilteredIcons(filterIcons(query)) + const params = new URLSearchParams() + if (query) params.set("q", query) + + const newUrl = query ? `${pathname}?${params.toString()}` : pathname + + router.push(newUrl, { scroll: false }) + }, + [filterIcons, pathname, router], + ) + const handleSearch = useCallback( + (query: string) => { + setSearchQuery(query) + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + timeoutRef.current = setTimeout(() => { + updateResults(query) + }, 100) + }, + [updateResults], + ) + useEffect(() => { + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + } + }, []) + + if (!searchParams) return null + + return ( + <> +
+ + handleSearch(e.target.value)} + /> +
+ + {filteredIcons.length === 0 ? ( +
+
+

We don't have this one...yet!

+
+ +
+ ) : ( +
+ {filteredIcons.map(({ name, data }) => ( + +
+ {`${name} +
+ {name.replace(/-/g, " ")} + + ))} +
+ )} + + ) +} diff --git a/web/src/app/icons/page.tsx b/web/src/app/icons/page.tsx new file mode 100644 index 00000000..eb825316 --- /dev/null +++ b/web/src/app/icons/page.tsx @@ -0,0 +1,54 @@ +import { BASE_URL } from "@/constants" +import { getIconsArray } from "@/lib/api" +import type { Metadata } from "next" +import { IconSearch } from "./components/icon-search" + +export const metadata: Metadata = { + title: "Browse icons | Dashboard Icons", + description: "Search and browse through our collection of beautiful dashboard icons for your applications", + keywords: ["dashboard icons", "browse icons", "icon search", "free icons", "open source icons"], + openGraph: { + title: "Browse Dashboard Icons Collection", + description: "Search and browse through our collection of beautiful dashboard icons for your applications", + type: "website", + url: `${BASE_URL}/icons`, + images: [ + { + url: "/og-image-browse.png", + width: 1200, + height: 630, + alt: "Browse Dashboard Icons", + type: "image/png", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "Browse Dashboard Icons Collection", + description: "Search and browse through our collection of beautiful dashboard icons for your applications", + images: ["/og-image-browse.png"], + }, + alternates: { + canonical: `${BASE_URL}/icons`, + }, +} + +export const dynamic = "force-static" + +export default async function IconsPage() { + const icons = await getIconsArray() + return ( +
+
+
+
+

Browse icons

+

Search through our collection of {icons.length} beautiful icons.

+
+
+ + +
+
+ ) +} diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx new file mode 100644 index 00000000..a543b65f --- /dev/null +++ b/web/src/app/layout.tsx @@ -0,0 +1,168 @@ +import { PostHogProvider } from "@/components/PostHogProvider" +import { Header } from "@/components/header" +import { LicenseNotice } from "@/components/license-notice" +import type { Metadata, Viewport } from "next" +import { Inter } from "next/font/google" +import { Toaster } from "sonner" +import "./globals.css" +import { ThemeProvider } from "./theme-provider" + +const inter = Inter({ + variable: "--font-inter", + subsets: ["latin"], +}) + +export const viewport: Viewport = { + width: "device-width", + initialScale: 1, + themeColor: "#ffffff", +} + +export const metadata: Metadata = { + metadataBase: new URL("https://dashboardicons.com"), + title: "Dashboard Icons", + description: "Curated icons for your dashboard", + keywords: ["dashboard", "icons", "open source", "free icons", "dashboard design"], + robots: { + index: true, + follow: true, + "max-image-preview": "large", + "max-snippet": -1, + "max-video-preview": -1, + googleBot: "index, follow", + }, + openGraph: { + siteName: "Dashboard Icons", + type: "website", + locale: "en_US", + title: "Dashboard Icons", + description: "Curated icons for your dashboard", + url: "https://dashboardicons.com", + images: [ + { + url: "/og-image.png", + width: 1200, + height: 630, + alt: "Dashboard Icons", + type: "image/png", + }, + ], + }, + twitter: { + card: "summary_large_image", + site: "@homarr_app", + creator: "@homarr_app", + title: "Dashboard Icons", + description: "Curated icons for your dashboard", + images: ["/og-image.png"], + }, + applicationName: "Dashboard Icons", + appleWebApp: { + title: "Dashboard Icons", + statusBarStyle: "default", + capable: true, + }, + alternates: { + types: { + "application/rss+xml": "https://dashboardicons.com/rss.xml", + }, + }, + icons: { + icon: [ + { + url: "/favicon.ico", + type: "image/x-icon", + }, + { + url: "/favicon-16x16.png", + sizes: "16x16", + type: "image/png", + }, + { + url: "/favicon-32x32.png", + sizes: "32x32", + type: "image/png", + }, + { + url: "/favicon-96x96.png", + sizes: "96x96", + type: "image/png", + }, + { + url: "/android-chrome-192x192.png", + sizes: "192x192", + type: "image/png", + }, + ], + shortcut: [ + { + url: "/favicon.ico", + type: "image/x-icon", + }, + ], + apple: [ + { + url: "/apple-icon-57x57.png", + sizes: "57x57", + type: "image/png", + }, + { + url: "/apple-icon-60x60.png", + sizes: "60x60", + type: "image/png", + }, + { + url: "/apple-icon-72x72.png", + sizes: "72x72", + type: "image/png", + }, + { + url: "/apple-icon-76x76.png", + sizes: "76x76", + type: "image/png", + }, + { + url: "/apple-icon-114x114.png", + sizes: "114x114", + type: "image/png", + }, + { + url: "/apple-icon-120x120.png", + sizes: "120x120", + type: "image/png", + }, + { + url: "/apple-icon-144x144.png", + sizes: "144x144", + type: "image/png", + }, + { + url: "/apple-icon-152x152.png", + sizes: "152x152", + type: "image/png", + }, + { + url: "/apple-icon-180x180.png", + sizes: "180x180", + type: "image/png", + }, + ], + }, +} + +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { + return ( + + + + +
+
{children}
+ + + + + + + ) +} diff --git a/web/src/app/not-found.tsx b/web/src/app/not-found.tsx new file mode 100644 index 00000000..84b21b67 --- /dev/null +++ b/web/src/app/not-found.tsx @@ -0,0 +1,30 @@ +import { Button } from "@/components/ui/button" +import { AlertTriangle, ArrowLeft } from "lucide-react" +import Link from "next/link" + +export default function NotFound({ + error, +}: { + error: Error & { digest?: string } +}) { + return ( +
+
+
+ +
+

Icon not found

+

The icon you are looking for could not be found or there was an error loading it.

+

If you believe this is an error, please contact the maintainers of the repository.

+
+ +
+
+
+ ) +} diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx new file mode 100644 index 00000000..5dfc2bc8 --- /dev/null +++ b/web/src/app/page.tsx @@ -0,0 +1,43 @@ +import { HeroSection } from "@/components/hero" +import { BASE_URL } from "@/constants" +import { getTotalIcons } from "@/lib/api" +import type { Metadata } from "next" + +export const metadata: Metadata = { + title: "Dashboard Icons - Beautiful icons for your dashboard", + description: "Free, open-source icons for your dashboard. Choose from hundreds of high-quality icons for your web applications.", + keywords: ["self hosted", "dashboard icons", "free icons", "open source icons", "web dashboard", "application icons"], + openGraph: { + title: "Dashboard Icons - Your definitive source for dashboard icons", + description: "Free, open-source icons for your dashboard. Choose from thousands of high-quality icons.", + type: "website", + url: BASE_URL, + images: [ + { + url: "/og-image.png", + width: 1200, + height: 630, + alt: "Dashboard Icons", + }, + ], + }, + twitter: { + title: "Dashboard Icons - Your definitive source for dashboard icons", + description: "Free, open-source icons for your dashboard. Choose from thousands of high-quality icons.", + card: "summary_large_image", + images: ["/og-image.png"], + }, + alternates: { + canonical: BASE_URL, + }, +} + +export default async function Home() { + const { totalIcons } = await getTotalIcons() + + return ( +
+ +
+ ) +} diff --git a/web/src/app/sitemap.ts b/web/src/app/sitemap.ts new file mode 100644 index 00000000..636b0ee8 --- /dev/null +++ b/web/src/app/sitemap.ts @@ -0,0 +1,36 @@ +import { BASE_URL, WEB_URL } from "@/constants" +import { getAllIcons } from "@/lib/api" +import type { MetadataRoute } from "next" + +export const dynamic = "force-static" + +export default async function sitemap(): Promise { + const iconsData = await getAllIcons() + return [ + { + url: WEB_URL, + lastModified: new Date(), + changeFrequency: "yearly", + priority: 1, + }, + { + url: `${WEB_URL}/icons`, + lastModified: new Date(), + changeFrequency: "daily", + priority: 1, + images: [`${WEB_URL}/icons/icon.png`], + }, + ...Object.keys(iconsData).map((iconName) => ({ + url: `${WEB_URL}/icons/${iconName}`, + lastModified: iconsData[iconName].update.timestamp, + changeFrequency: "yearly" as const, + priority: 0.8, + images: [ + `${BASE_URL}/png/${iconName}.png`, + // SVG is conditional if it exists + iconsData[iconName].base === "svg" ? `${BASE_URL}/svg/${iconName}.svg` : null, + `${BASE_URL}/webp/${iconName}.webp`, + ].filter(Boolean) as string[], + })), + ] +} diff --git a/web/src/app/theme-provider.tsx b/web/src/app/theme-provider.tsx new file mode 100644 index 00000000..aed8e2cc --- /dev/null +++ b/web/src/app/theme-provider.tsx @@ -0,0 +1,8 @@ +"use client" + +import { ThemeProvider as NextThemesProvider } from "next-themes" +import type * as React from "react" + +export function ThemeProvider({ children, ...props }: React.ComponentProps) { + return {children} +} diff --git a/web/src/components/PostHogProvider.tsx b/web/src/components/PostHogProvider.tsx new file mode 100644 index 00000000..203ed29c --- /dev/null +++ b/web/src/components/PostHogProvider.tsx @@ -0,0 +1,57 @@ +"use client" + +import { usePathname, useSearchParams } from "next/navigation" +import posthog from "posthog-js" +import { PostHogProvider as PHProvider, usePostHog } from "posthog-js/react" +import { Suspense, useEffect } from "react" + +export function PostHogProvider({ children }: { children: React.ReactNode }) { + useEffect(() => { + if (process.env.NODE_ENV === "development" || process.env.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", + api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || "https://eu.i.posthog.com", + capture_pageview: false, // We capture pageviews manually + capture_pageleave: true, // Enable pageleave capture + loaded(posthogInstance) { + // @ts-expect-error + window.posthog = posthogInstance + }, + }) + }, []) + + return ( + + + {children} + + ) +} + +function PostHogPageView() { + const pathname = usePathname() + const searchParams = useSearchParams() + const posthogClient = usePostHog() + + useEffect(() => { + if (pathname && posthogClient) { + let url = window.origin + pathname + const search = searchParams.toString() + if (search) { + url += `?${search}` + } + posthogClient.capture("$pageview", { $current_url: url }) + } + }, [pathname, searchParams, posthogClient]) + + return null +} + +function SuspendedPostHogPageView() { + return ( + + + + ) +} diff --git a/web/src/components/carbon.tsx b/web/src/components/carbon.tsx new file mode 100644 index 00000000..3af67313 --- /dev/null +++ b/web/src/components/carbon.tsx @@ -0,0 +1,87 @@ +import React from "react" + +export function Carbon() { + // biome-ignore lint/style/noNonNullAssertion: + const ref = React.useRef(null!) + if (process.env.NODE_ENV === "development") { + return null + } + + React.useEffect(() => { + const serve = "CW7IP27L" + const placement = "homarrdev" + ref.current.innerHTML = "" + const s = document.createElement("script") + s.id = "_carbonads_js" + s.src = `//cdn.carbonads.com/carbon.js?serve=${serve}&placement=${placement}` + ref.current.appendChild(s) + }, []) + + return ( + <> + +
+
+
+ + ) +} diff --git a/web/src/components/command-menu.tsx b/web/src/components/command-menu.tsx new file mode 100644 index 00000000..ea698527 --- /dev/null +++ b/web/src/components/command-menu.tsx @@ -0,0 +1,90 @@ +"use client" + +import { useRouter } from "next/navigation" +import * as React from "react" + +import { CommandDialog, CommandEmpty, CommandInput, CommandItem, CommandList } from "@/components/ui/command" +import Link from "next/link" + +interface CommandMenuProps { + icons: string[] +} + +export function CommandMenu({ icons }: CommandMenuProps) { + const router = useRouter() + const [open, setOpen] = React.useState(false) + const [mounted, setMounted] = React.useState(false) + const [inputValue, setInputValue] = React.useState("") + const getFilteredIcons = React.useCallback(() => { + const query = inputValue.toLowerCase().trim() + if (!query) return icons.slice(0, 75) + return icons.filter((icon) => { + const iconName = icon.toLowerCase() + if (iconName.includes(query)) return true + const parts = query.split(/\s+/) + let lastIndex = -1 + return parts.every((part) => { + const index = iconName.indexOf(part, lastIndex + 1) + if (index === -1) return false + lastIndex = index + return true + }) + }) + }, [icons, inputValue]) + + const filteredIcons = getFilteredIcons() + + React.useEffect(() => { + setMounted(true) + }, []) + React.useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === "k" && (e.metaKey || e.ctrlKey)) { + e.preventDefault() + setOpen((open) => !open) + } + } + + document.addEventListener("keydown", down) + return () => document.removeEventListener("keydown", down) + }, []) + + const handleInputChange = React.useCallback((value: string) => { + setInputValue(value) + }, []) + + const handleSelectIcon = React.useCallback( + (iconName: string) => { + router.push(`/icons/${iconName}`) + setOpen(false) + }, + [router], + ) + if (!mounted) return null + + return ( + <> +

+ Press{" "} + + K + {" "} + to search +

+ + + + {filteredIcons.length === 0 && No results found. Try a different search term.} + {filteredIcons.map((icon) => ( + handleSelectIcon(icon)}> + +
+ {icon.replace(/-/g, " ")} + + + ))} + + + + ) +} diff --git a/web/src/components/grid-background.tsx b/web/src/components/grid-background.tsx new file mode 100644 index 00000000..8ee5e5ea --- /dev/null +++ b/web/src/components/grid-background.tsx @@ -0,0 +1,23 @@ +import { cn } from "@/lib/utils" + +interface GridBackgroundProps { + className?: string +} + +export function GridBackground({ className }: GridBackgroundProps) { + return ( +
+ {/* Grid pattern */} +
+ +
+
+ ) +} diff --git a/web/src/components/header-nav.tsx b/web/src/components/header-nav.tsx new file mode 100644 index 00000000..3402e324 --- /dev/null +++ b/web/src/components/header-nav.tsx @@ -0,0 +1,28 @@ +"use client" + +import { cn } from "@/lib/utils" +import Link from "next/link" +import { usePathname } from "next/navigation" + +export function HeaderNav() { + const pathname = usePathname() + const isIconsActive = pathname === "/icons" || pathname.startsWith("/icons/") + + return ( + + ) +} diff --git a/web/src/components/header.tsx b/web/src/components/header.tsx new file mode 100644 index 00000000..c06f6ddb --- /dev/null +++ b/web/src/components/header.tsx @@ -0,0 +1,33 @@ +import { IconSubmissionForm } from "@/components/icon-submission-form" +import { ThemeSwitcher } from "@/components/theme-switcher" +import { REPO_PATH } from "@/constants" +import { getAllIcons } from "@/lib/api" +import { Github } from "lucide-react" +import Link from "next/link" +import { CommandMenu } from "./command-menu" +import { HeaderNav } from "./header-nav" + +const icons = await getAllIcons() + +export async function Header() { + return ( +
+
+
+ + Dashboard Icons + + +
+
+ + + + + + +
+
+
+ ) +} diff --git a/web/src/components/hero.tsx b/web/src/components/hero.tsx new file mode 100644 index 00000000..ae9606d2 --- /dev/null +++ b/web/src/components/hero.tsx @@ -0,0 +1,228 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { Card } from "@/components/ui/card" +import { Input } from "@/components/ui/input" +import { cn } from "@/lib/utils" +import { motion } from "framer-motion" +import { Circle, Github, Search } from "lucide-react" +import Link from "next/link" +import { useState } from "react" + +interface IconCardProps { + name: string + imageUrl: string +} + +function IconCard({ name, imageUrl }: IconCardProps) { + return ( + +
+ {name} +
+

{name}

+
+ ) +} + +function ElegantShape({ + className, + delay = 0, + width = 400, + height = 100, + rotate = 0, + gradient = "from-background/[0.1]", +}: { + className?: string + delay?: number + width?: number + height?: number + rotate?: number + gradient?: string +}) { + return ( + + +
+ + + ) +} + +export function HeroSection({ totalIcons }: { totalIcons: number }) { + const [searchQuery, setSearchQuery] = useState("") + + const fadeUpVariants = { + hidden: { opacity: 0, y: 30 }, + visible: (i: number) => ({ + opacity: 1, + y: 0, + transition: { + duration: 1, + delay: 0.5 + i * 0.2, + ease: [0.25, 0.4, 0.25, 1], + }, + }), + } + + return ( +
+
+ +
+ + + + + + + + + +
+ +
+
+ + + + + by homarr-labs + + + + + +

+ + Your definitive source for + +
+ + dashboard icons. + +

+
+ + +

+ A collection of {totalIcons} beautiful, clean and consistent icons for your dashboard, application, or website. +

+
+ + +
+ setSearchQuery(e.target.value)} + /> + + +
+ + +
+
+
+
+ +
+
+ ) +} diff --git a/web/src/components/icon-details.tsx b/web/src/components/icon-details.tsx new file mode 100644 index 00000000..294b98b4 --- /dev/null +++ b/web/src/components/icon-details.tsx @@ -0,0 +1,341 @@ +"use client" + +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" +import { BASE_URL, REPO_PATH } from "@/constants" +import type { AuthorData, Icon } from "@/types/icons" +import { motion } from "framer-motion" +import { Check, Copy, Download, Github } from "lucide-react" +import Image from "next/image" +import Link from "next/link" +import { useState } from "react" +import { toast } from "sonner" +import { Carbon } from "./carbon" + +export type IconDetailsProps = { + icon: string + iconData: Icon + authorData: AuthorData +} + +export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) { + const authorName = authorData.name || authorData.login || "" + const iconColorVariants = iconData.colors + const formattedDate = new Date(iconData.update.timestamp).toLocaleDateString("en-GB", { + day: "numeric", + month: "long", + year: "numeric", + }) + const getAvailableFormats = () => { + switch (iconData.base) { + case "svg": + return ["svg", "png", "webp"] + case "png": + return ["png", "webp"] + default: + return [iconData.base] + } + } + + const availableFormats = getAvailableFormats() + const [copiedVariants, setCopiedVariants] = useState>({}) + + const handleCopy = (url: string, variantKey: string) => { + navigator.clipboard.writeText(url) + setCopiedVariants((prev) => ({ + ...prev, + [variantKey]: true, + })) + setTimeout(() => { + setCopiedVariants((prev) => ({ + ...prev, + [variantKey]: false, + })) + }, 2000) + + toast.success("URL copied", { + description: "The icon URL has been copied to your clipboard", + }) + } + + const renderVariant = (format: string, iconName: string, theme?: "light" | "dark") => { + const variantName = theme && iconColorVariants?.[theme] ? iconColorVariants[theme] : iconName + const url = `${BASE_URL}/${format}/${variantName}.${format}` + const githubUrl = `${REPO_PATH}/tree/main/${format}/${iconName}.${format}` + const variantKey = `${format}-${theme || "default"}` + const isCopied = copiedVariants[variantKey] || false + + return ( + +
+ + + handleCopy(url, variantKey)} + > +
+ + + + + + + + {`${iconName} + + + +

Click to copy URL to clipboard

+
+ + +

{format.toUpperCase()}

+ +
+ + + + + +

Download icon

+
+
+ + + + + + +

Copy URL to clipboard

+
+
+ + + + + + +

View on GitHub

+
+
+
+
+ + ) + } + + return ( +
+
+ {/* Left Column: Icon Info and Author */} +
+ + +
+
+ {icon} +
+ {icon} +
+
+ +
+
+
+
+

+ Updated on: {formattedDate} +

+
+
+
+

By:

+ + + {authorName ? authorName.slice(0, 2).toUpperCase() : "??"} + + + {authorName} + +
+
+
+
+ + {iconData.categories && iconData.categories.length > 0 && ( +
+

Categories

+
+ {iconData.categories.map((category) => ( + + {category} + + ))} +
+
+ )} + + {iconData.aliases && iconData.aliases.length > 0 && ( +
+

Aliases

+
+ {iconData.aliases.map((alias) => ( + + {alias} + + ))} +
+
+ )} +
+
+
+
+ + {/* Middle Column: Icon variants */} +
+ + + Icon variants + Click on any icon to copy its URL to your clipboard + + + {!iconData.colors ? ( +
+ {availableFormats.map((format) => renderVariant(format, icon))} +
+ ) : ( +
+
+

+ + Light theme +

+
+ {availableFormats.map((format) => renderVariant(format, icon, "light"))} +
+
+
+

+ + Dark theme +

+
+ {availableFormats.map((format) => renderVariant(format, icon, "dark"))} +
+
+
+ )} +
+
+
+ + {/* Right Column: Technical details */} +
+ + + Technical details + + +
+
+

Base format

+
+ +
{iconData.base.toUpperCase()}
+
+
+ +
+

Available formats

+
+ {availableFormats.map((format) => ( +
+ {format.toUpperCase()} +
+ ))} +
+
+ + {iconData.colors && ( +
+

Color variants

+
+ {Object.entries(iconData.colors).map(([theme, variant]) => ( +
+ + {theme}: + {variant} +
+ ))} +
+
+ )} + +
+

Source

+ +
+
+
+ +
+
+
+
+ ) +} diff --git a/web/src/components/icon-submission-form.tsx b/web/src/components/icon-submission-form.tsx new file mode 100644 index 00000000..1e2a77b9 --- /dev/null +++ b/web/src/components/icon-submission-form.tsx @@ -0,0 +1,87 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" +import { REPO_PATH } from "@/constants" +import { DialogDescription } from "@radix-ui/react-dialog" +import { ExternalLink, PlusCircle } from "lucide-react" +import Link from "next/link" +import { useState } from "react" + +export const ISSUE_TEMPLATES = [ + { + id: "add_monochrome_icon", + name: "Add light & dark icon", + description: "Use this template to add a new icon to the project. Monochrome icons need both light and dark versions.", + url: `${REPO_PATH}/issues/new?template=add_monochrome_icon.yml`, + }, + { + id: "add_normal_icon", + name: "Add normal icon", + description: "Use this template to add a new icon to the project. Normal icons work for both light and dark themes.", + url: `${REPO_PATH}/issues/new?template=add_normal_icon.yml`, + }, + { + id: "update_monochrome_icon", + name: "Update light & dark icon", + description: "Use this template to update an existing icon. Monochrome icons need both light and dark versions.", + url: `${REPO_PATH}/issues/new?template=update_monochrome_icon.yml`, + }, + { + id: "update_normal_icon", + name: "Update normal icon", + description: "Use this template to update an existing icon. Normal icons work for both light and dark themes.", + url: `${REPO_PATH}/issues/new?template=update_normal_icon.yml`, + }, + { + id: "blank_issue", + name: "Something else", + description: "You'd like to do something else? Use this template to create a new issue.", + url: `${REPO_PATH}/issues/new?template=BLANK_ISSUE`, + }, +] +export function IconSubmissionContent({ onClose }: { onClose?: () => void }) { + return ( +
+
+ {ISSUE_TEMPLATES.map((template) => ( + + + + ))} +
+
+ ) +} +export function IconSubmissionForm() { + const [open, setOpen] = useState(false) + + return ( + + + + + + + Suggest a new icon + You can suggest a new icon by creating an issue on GitHub using one of the templates below. + +
+ setOpen(false)} /> +
+
+
+ ) +} diff --git a/web/src/components/license-notice.tsx b/web/src/components/license-notice.tsx new file mode 100644 index 00000000..e333460a --- /dev/null +++ b/web/src/components/license-notice.tsx @@ -0,0 +1,75 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { REPO_PATH } from "@/constants" +import { AnimatePresence, motion } from "framer-motion" +import { X } from "lucide-react" +import Link from "next/link" +import { useEffect, useState } from "react" + +const LOCAL_STORAGE_KEY = "licenseNoticeDismissed" + +export function LicenseNotice() { + const [isVisible, setIsVisible] = useState(false) + + useEffect(() => { + // Check local storage only on the client side + const dismissed = localStorage.getItem(LOCAL_STORAGE_KEY) + if (!dismissed) { + setIsVisible(true) + } + }, []) + + const handleDismiss = () => { + localStorage.setItem(LOCAL_STORAGE_KEY, "true") + setIsVisible(false) + } + + return ( + + {isVisible && ( + +
+
+

+ Unless otherwise indicated, all images and assets are the property of their respective owners and used for identification + purposes only. +

+

+ Read the{" "} + + LICENSE + {" "} + or{" "} + + contact us + + . +

+
+ +
+
+ )} +
+ ) +} diff --git a/web/src/components/theme-switcher.tsx b/web/src/components/theme-switcher.tsx new file mode 100644 index 00000000..293f630c --- /dev/null +++ b/web/src/components/theme-switcher.tsx @@ -0,0 +1,28 @@ +"use client" + +import { Moon, Sun } from "lucide-react" +import { useTheme } from "next-themes" + +import { Button } from "@/components/ui/button" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" + +export function ThemeSwitcher() { + const { setTheme } = useTheme() + + return ( + + + + + + setTheme("light")}>Light + setTheme("dark")}>Dark + setTheme("system")}>System + + + ) +} diff --git a/web/src/components/ui/accordion.tsx b/web/src/components/ui/accordion.tsx new file mode 100644 index 00000000..4a8cca46 --- /dev/null +++ b/web/src/components/ui/accordion.tsx @@ -0,0 +1,66 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDownIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Accordion({ + ...props +}: React.ComponentProps) { + return +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + + ) +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ) +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/web/src/components/ui/alert-dialog.tsx b/web/src/components/ui/alert-dialog.tsx new file mode 100644 index 00000000..0863e40d --- /dev/null +++ b/web/src/components/ui/alert-dialog.tsx @@ -0,0 +1,157 @@ +"use client" + +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + ) +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogCancel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/web/src/components/ui/alert.tsx b/web/src/components/ui/alert.tsx new file mode 100644 index 00000000..14213546 --- /dev/null +++ b/web/src/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/web/src/components/ui/aspect-ratio.tsx b/web/src/components/ui/aspect-ratio.tsx new file mode 100644 index 00000000..3df3fd02 --- /dev/null +++ b/web/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return +} + +export { AspectRatio } diff --git a/web/src/components/ui/avatar.tsx b/web/src/components/ui/avatar.tsx new file mode 100644 index 00000000..71e428b4 --- /dev/null +++ b/web/src/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/web/src/components/ui/badge.tsx b/web/src/components/ui/badge.tsx new file mode 100644 index 00000000..02054139 --- /dev/null +++ b/web/src/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/web/src/components/ui/breadcrumb.tsx b/web/src/components/ui/breadcrumb.tsx new file mode 100644 index 00000000..eb88f321 --- /dev/null +++ b/web/src/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { + return