diff --git a/.jsonschema.json b/.jsonschema.json index 2bc5ac875b18..bcdf2eede046 100644 --- a/.jsonschema.json +++ b/.jsonschema.json @@ -599,9 +599,8 @@ "required": ["type", "url"], "properties": { "type": { - "description": "The license name or 'custom'", - "type": "string", - "enum": ["custom"] + "description": "Custom license type", + "const": "custom" }, "url": { "description": "The URL to the license text by the brand", @@ -617,7 +616,7 @@ }, "duplicate": { "$id": "#duplicate", - "description": "A \"dup\" brand", + "description": "A brand that uses the same icon", "type": "object", "required": ["title"], "properties": { diff --git a/.npmignore b/.npmignore index c97285f703e0..65b1889543ca 100644 --- a/.npmignore +++ b/.npmignore @@ -15,3 +15,4 @@ !sdk.mjs !sdk.js !sdk.d.ts +!.jsonschema.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b7a3e1f2e96c..0d57ac724504 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,6 +43,7 @@ Simple Icons welcomes contributions and corrections. Before contributing, please * [Assessing Popularity](#assessing-popularity) * [Opening an Issue](#opening-an-issue) * [Adding or Updating an Icon](#adding-or-updating-an-icon) + * [Requesting Permission](#requesting-permission) * [Testing Package Locally](#testing-package-locally) * [Using Docker](#using-docker) @@ -93,9 +94,6 @@ To be considered popular enough to be within our scope, a brand must be in exist 1. The website's Similarweb rank in any one country is either: - In the top 100, or, - In the top 10k, _with_ a global rank of 1m or better. -1. The website's Similarweb global rank in any one category is either: - - In the top 50, or, - - In the top 5k, _with_ a global rank of 1m or better. 1. In cases where a brand does not have its own website the Similarweb rank of its parent company will be accepted _if_ the brand is that company's primary product. 1. Its packages meet one of the following minimum requirements: - [npm](https://www.npmjs.com): 100k weekly downloads, @@ -433,6 +431,28 @@ Once you've completed the previous steps, create a pull request to merge your ed If you have an affiliation to the brand you contributing that allows you to speak on their behalf then please disclose that in your pull request as it can help speed up our research and review processes. +### Requesting Permission + +If a brand's terms and conditions state that we need permission to include their brand, we will tag related issues and PRs with `permission required`. Anybody creating a PR for one of these icons is responsible (even if we discover permission requirements during PR review) for obtaining said permission. + +If a contributor have been asked to obtain permission, they have 2 weeks to confirm they've reached out to the brand. If they do not confirm they have done this during that time, the PR will be closed. + +If the contributor _has_ confirmed they've reached out to the brand, we will wait a maximum of 2 months for a response. If the response is an outright 'no' or is ambiguous, both the PR and issue will be closed, and the issue will marked as `will not add`. If the brand does not respond, we may close the PR or mark it as a draft, depending on whether the contributor is still actively pursuing a response. If the brand approves usage, the contributor should add the email response to the comments of the PR, and we will continue to merge the icon into the collection. + +#### Example Email + +```text +Dear [Brand Name], + +I am contributing to the Simple Icons project on GitHub (https://github.com/simple-icons/simple-icons) and would like to add your brand's icon. +One of the maintainers has requested - as per your Terms and Conditions - that I reach out to formally obtain permission prior to accepting it into their collection. +Could you please let me know at your earliest convenience whether or not we are okay to include your brand's icon in the project? + +Kind regards, + +[Your name] +``` + ## Testing Package Locally * Make sure you have [Node.js](https://nodejs.org/en/download/) installed. At least version `^12.20.0 || ^14.13.1 || >=16.0.0` is required. @@ -461,7 +481,7 @@ A SDK is included in the `simple-icons/sdk` entrypoint of the npm package to mak ```typescript import { getIconsData, type IconData } from 'simple-icons/sdk'; -const iconsData: IconData[] = getIconsData(); +const iconsData: Promise = getIconsData(); ``` ```javascript @@ -469,6 +489,6 @@ import { getIconsData } from 'simple-icons/sdk'; /* @typedef {import("./simple-icons/sdk").IconData} IconData */ -/* @type {IconData[]} */ +/* @type {Promise} */ const iconsData = getIconsData(); ``` diff --git a/README.md b/README.md index d40bd8f8e5e7..55e08fb2c7f3 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,15 @@ Icons can be downloaded as SVGs directly from [our website](https://simpleicons. Icons can be served from a CDN such as [jsDelivr](https://www.jsdelivr.com/package/npm/simple-icons) or [Unpkg](https://unpkg.com/browse/simple-icons/). Simply use the `simple-icons` npm package and specify a version in the URL like the following: ```html - - + + ``` Where `[ICON SLUG]` is replaced by the [slug] of the icon you want to use, for example: ```html - - + + ``` These examples use the latest major version. This means you won't receive any updates following the next major release. You can use `@latest` instead to receive updates indefinitely. However, this will result in a `404` error if the icon is removed. @@ -150,43 +150,39 @@ echo file_get_contents('path/to/package/icons/simpleicons.svg'); ## Third-Party Extensions -| Extension | Author | License | Simple Icons Version | +The below are known extensions to third-party tools. + +| Extension | Author | +| :- | :- | +| [Blender add-on](https://github.com/mondeja/simple-icons-blender) Blender | [@mondeja](https://github.com/mondeja) | +| [Boxy SVG library](https://boxy-svg.com/ideas/298/simple-icons-library-provider) Boxy SVG | [@Jarek](https://boxy-svg.com/profiles/0000000000/jarek) | +| [Drawio library](https://github.com/mondeja/simple-icons-drawio) Drawio | [@mondeja](https://github.com/mondeja) | +| [Figma plugin](https://www.figma.com/community/plugin/1149614463603005908/Simple-Icons) Figma | [@LitoMore](https://github.com/LitoMore) | +| [Miro app](https://miro.com/marketplace/brand-icons/) Miro | [@LitoMore](https://github.com/LitoMore) | +| [Raycast extension](https://www.raycast.com/litomore/simple-icons) Raycast | [@LitoMore](https://github.com/LitoMore) | +| [Stream Deck icon pack](https://github.com/mackenly/simple-icons-stream-deck) Stream Deck | [@mackenly](https://github.com/mackenly) | ![](https://img.shields.io/github/license/mackenly/simple-icons-stream-deck) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmackenly%2Fsimple-icons-stream-deck%2Fmain%2Ftemplate%2Fmanifest.json&query=Version&logo=simpleicons&label=version) | +| [Webflow app](https://webflow.com/apps/detail/simple-icons) Webflow | [@diegoliv](https://github.com/diegoliv) | + +Maintain an extension? [Submit a PR][open-pr] to include it in the list above. + +## Third-Party Libraries + +The below are known third-party libraries for use in your own projects. We only keep items in the list that are at least up to date with our previous major version. + +| Library | Author | License | Simple Icons Version | | :-- | :-- | :-: | :-: | -| [Angular module](https://github.com/avmaisak/ngx-simple-icons) Angular | [@avmaisak](https://github.com/avmaisak) | ![](https://img.shields.io/github/license/avmaisak/ngx-simple-icons) | [![v6.18.0](https://img.shields.io/static/v1?label=version&message=v6.18.0&logo=simpleicons&color=red)](https://github.com/simple-icons/simple-icons/tree/6.18.0) | | [Blazor Nuget package](https://github.com/TimeWarpEngineering/timewarp-simple-icons) Blazor | [@TimeWarpEngineering](https://github.com/TimeWarpEngineering) | ![](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-simple-icons) | ![](https://img.shields.io/badge/dynamic/xml?url=https%3A%2F%2Fraw.githubusercontent.com%2FTimeWarpEngineering%2Ftimewarp-simple-icons%2Fmain%2Fsource%2Ftimewarp-simple-icons%2Ftimewarp-simple-icons.csproj&query=%2FProject%2FPropertyGroup%2FVersion&logo=simpleicons&label=version) | -| [Blender add-on](https://github.com/mondeja/simple-icons-blender) Blender | [@mondeja](https://github.com/mondeja) | ![](https://img.shields.io/github/license/mondeja/simple-icons-blender) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmondeja%2Fsimple-icons-blender%2Fdevelop%2Fpackage.json&query=%24..%5B'simple-icons'%5D&logo=simpleicons&label=version) | -| [Boxy SVG library](https://boxy-svg.com/ideas/298/simple-icons-library-provider) Boxy SVG | [@Jarek](https://boxy-svg.com/profiles/0000000000/jarek) | | | -| [Drawio library](https://github.com/mondeja/simple-icons-drawio) Drawio | [@mondeja](https://github.com/mondeja) | ![](https://img.shields.io/github/license/mondeja/simple-icons-drawio) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmondeja%2Fsimple-icons-drawio%2Fdevelop%2Fpackage.json&query=%24..%5B'simple-icons'%5D&logo=simpleicons&label=version) | -| [Drupal module](https://www.drupal.org/project/simple_icons) Drupal | [Phil Wolstenholme](https://www.drupal.org/u/phil-wolstenholme) | ![](https://img.shields.io/badge/license-GPL_v2-blue.svg) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgit.drupalcode.org%2Fproject%2Fsimple_icons%2F-%2Fraw%2F8.x-1.x%2Fpackage-lock.json%3Fref_type%3Dheads&query=%24..%5B'simple-icons'%5D.version&logo=simpleicons&label=version) | -| [Figma plugin](https://www.figma.com/community/plugin/1149614463603005908/Simple-Icons) Figma | [@LitoMore](https://github.com/LitoMore) | ![](https://img.shields.io/github/license/litomore/simple-icons-figma) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsimple-icons%2Fsimple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | -| [Flutter package](https://pub.dev/packages/simple_icons) Flutter | [@jlnrrg](https://github.com/jlnrrg) | ![](https://img.shields.io/github/license/jlnrrg/simple_icons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fjlnrrg%2Fsimple_icons%2Fmaster%2Fvendor%2Fpackage-lock.json&query=%24..%5B'node_modules%2Fsimple-icons-font'%5D.version&logo=simpleicons&label=version) | | [Framer component](https://github.com/LitoMore/simple-icons-framer) Framer | [@LitoMore](https://github.com/LitoMore) | ![](https://img.shields.io/github/license/LitoMore/simple-icons-framer) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsimple-icons%2Fsimple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | -| [Hexo plugin](https://github.com/nidbCN/hexo-simpleIcons) Hexo | [@nidbCN](https://github.com/nidbCN/) | ![](https://img.shields.io/github/license/nidbCN/hexo-simpleIcons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2FnidbCN%2Fhexo-simpleIcons%2Fmaster%2Fpackage.json&query=%24..%5B'simple-icons'%5D&logo=simpleicons&label=version) | -| [Home Assistant plugin](https://github.com/vigonotion/hass-simpleicons) Home Assistant | [@vigonotion](https://github.com/vigonotion/) | ![](https://img.shields.io/github/license/vigonotion/hass-simpleicons) | [![v7.14.0](https://img.shields.io/static/v1?label=version&message=v7.14.0&logo=simpleicons&color=red)](https://github.com/simple-icons/simple-icons/tree/7.14.0) | | [Hugo module](https://github.com/foo-dogsquared/hugo-mod-simple-icons) Hugo | [@foo-dogsquared](https://github.com/foo-dogsquared) | ![](https://img.shields.io/github/license/foo-dogsquared/hugo-mod-simple-icons) | ![](https://img.shields.io/github/v/tag/foo-dogsquared/hugo-mod-simple-icons?logo=simpleicons&label=version) | -| [Java library](https://github.com/silentsoft/simpleicons4j) OpenJDK | [@silentsoft](https://github.com/silentsoft) | ![](https://img.shields.io/github/license/silentsoft/simpleicons4j) | ![](https://img.shields.io/badge/dynamic/xml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsilentsoft%2Fsimpleicons4j%2Fmain%2Fpom.xml&query=%2A%5Blocal-name%28.%29%3D%27project%27%5D%2F%2F%2A%5Blocal-name%28.%29%3D%27dependencies%27%5D%2F%2F%2A%5Blocal-name%28.%29%3D%27dependency%27%20and%20%2A%5Blocal-name%28.%29%3D%27artifactId%27%20and%20text%28%29%3D%27simple-icons%27%5D%5D%2F%2F%2A%5Blocal-name%28.%29%3D%27version%27%5D%2F%2Ftext%28%29&logo=simpleicons&label=version) | -| [Jetpack Compose library](https://github.com/DevSrSouza/compose-icons) Jetpack Compose | [@DevSrSouza](https://github.com/devsrsouza/) | ![](https://img.shields.io/github/license/DevSrSouza/compose-icons) | [![v4.14.0](https://img.shields.io/static/v1?label=version&message=v4.14.0&logo=simpleicons&color=red)](https://github.com/simple-icons/simple-icons/tree/4.14.0) | | [Kirby plugin](https://github.com/runxel/kirby3-simpleicons) Kirby | [@runxel](https://github.com/runxel) | ![](https://img.shields.io/github/license/runxel/kirby3-simpleicons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Frunxel%2Fkirby3-simpleicons%2Fmaster%2Fcomposer.json&query=%24..%5B'simple-icons%2Fsimple-icons'%5D&logo=simpleicons&label=version) | | [LaTeX package](https://github.com/ineshbose/simple-icons-latex) LaTeX | [@ineshbose](https://github.com/ineshbose) | ![](https://img.shields.io/github/license/ineshbose/simple-icons-latex) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fineshbose%2Fsimple-icons-latex%2Fdevelop%2Fpackage.json&query=%24..%5B'simple-icons-font'%5D&logo=simpleicons&label=version) | | [Laravel package](https://github.com/ublabs/blade-simple-icons) Laravel | [@adrian-ub](https://github.com/adrian-ub) | ![](https://img.shields.io/github/license/ublabs/blade-simple-icons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsimple-icons%2Fsimple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | -| [Leptos crate](https://github.com/Carlosted/leptos-icons) Leptos | [@Carlosted](https://github.com/Carlosted) | ![](https://img.shields.io/github/license/Carlosted/leptos-icons) | [![v9.14.0](https://img.shields.io/static/v1?label=version&message=v9.14.0&logo=simpleicons&color=yellow)](https://github.com/simple-icons/simple-icons/tree/9.14.0) | -| [Miro app](https://miro.com/marketplace/brand-icons/) Miro | [@LitoMore](https://github.com/LitoMore) | ![](https://img.shields.io/github/license/LitoMore/simple-icons-miro) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsimple-icons%2Fsimple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | -| [Python package](https://github.com/sachinraja/simple-icons-py) Python | [@sachinraja](https://github.com/sachinraja) | ![](https://img.shields.io/github/license/sachinraja/simple-icons-py) | [![v7.21.0](https://img.shields.io/static/v1?label=version&message=v7.21.0&logo=simpleicons&color=red)](https://github.com/simple-icons/simple-icons/tree/7.21.0) | -| [Raycast extension](https://www.raycast.com/litomore/simple-icons) Raycast | [@LitoMore](https://github.com/LitoMore) | ![](https://img.shields.io/github/license/raycast/extensions) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsimple-icons%2Fsimple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | | [React package](https://github.com/icons-pack/react-simple-icons) React | [@wootsbot](https://github.com/wootsbot) | ![](https://img.shields.io/github/license/icons-pack/react-simple-icons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Ficons-pack%2Freact-simple-icons%2Fmain%2Fpackage.json&query=%24..%5B'simple-icons'%5D&logo=simpleicons&label=version) | | [Ruby gem](https://rubygems.org/gems/simple-icons-rails) Ruby | [@thepew](https://github.com/the-pew-inc) | ![](https://img.shields.io/github/license/the-pew-inc/simple-icons-rails) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsimple-icons%2Fsimple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | -| [Solid package](https://github.com/x64Bits/solid-icons) Solid | [@x64Bits](https://github.com/x64Bits) | ![](https://img.shields.io/github/license/x64Bits/solid-icons) | [![v9.0.0](https://img.shields.io/static/v1?label=version&message=v9.0.0&logo=simpleicons&color=yellow)](https://github.com/simple-icons/simple-icons/tree/9.0.0) | -| [Stream Deck icon pack](https://github.com/mackenly/simple-icons-stream-deck) Stream Deck | [@mackenly](https://github.com/mackenly) | ![](https://img.shields.io/github/license/mackenly/simple-icons-stream-deck) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmackenly%2Fsimple-icons-stream-deck%2Fmain%2Ftemplate%2Fmanifest.json&query=Version&logo=simpleicons&label=version) | | [Svelte package](https://github.com/icons-pack/svelte-simple-icons) Svelte | [@wootsbot](https://github.com/wootsbot) | ![](https://img.shields.io/github/license/icons-pack/svelte-simple-icons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Ficons-pack%2Fsvelte-simple-icons%2Fmain%2Fpackage.json&query=%24..%5B'simple-icons'%5D&logo=simpleicons&label=version) | | [Vue 3 package](https://github.com/wyatt-herkamp/vue3-simple-icons) Vue | [@wyatt-herkamp](https://github.com/wyatt-herkamp) | ![](https://img.shields.io/github/license/wyatt-herkamp/vue3-simple-icons) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fwyatt-herkamp%2Fvue3-simple-icons%2Fmain%2Fsimple-icons.json&query=simpleIconsVersion&logo=simpleicons&label=version) | -| [Vue package](https://github.com/mainvest/vue-simple-icons) Vue | [@noahlitvin](https://github.com/noahlitvin) | ![](https://img.shields.io/github/license/mainvest/vue-simple-icons) | ![](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmainvest%2Fvue-simple-icons%2Fmaster%2Fpackage.json&query=%24.version&logo=simpleicons&label=version) | -| [Webflow app](https://webflow.com/apps/detail/simple-icons) Webflow | [@diegoliv](https://github.com/diegoliv) | ![](https://img.shields.io/github/license/diegoliv/wf-simpleicons-search) | ![](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdiegoliv%2Fwf-simpleicons-search%2Fmain%2Fpackage.json&query=%24..%5B'simple-icons'%5D&logo=simpleicons&label=version) | -| [WordPress plugin](https://wordpress.org/plugins/simple-icons/) WordPress | [@tjtaylo](https://github.com/tjtaylo) | ![](https://img.shields.io/badge/license-GPL_v2-blue.svg) | [![v4.25.0](https://img.shields.io/static/v1?label=version&message=v4.25.0&logo=simpleicons&color=red)](https://github.com/simple-icons/simple-icons/tree/4.25.0) | -> [!IMPORTANT]\ -> From our next scheduled major release (v12, releasing on May 26, 2024), we will begin removing third-party extensions from the above list that are not up to date with at least our previous major release.\ -> For example, when v12 is released, we will remove any extensions that don't support `v11.0.0` or higher.\ -> Please create a PR to update the version number of your extension in this README following each update of your extension. +Maintain a library? [Submit a PR][open-pr] to include it in the list above. ## Contribute @@ -198,6 +194,7 @@ echo file_get_contents('path/to/package/icons/simpleicons.svg'); Information describing how to contribute can be found in the file [CONTRIBUTING.md](https://github.com/simple-icons/simple-icons/blob/develop/CONTRIBUTING.md) [slug]: https://github.com/simple-icons/simple-icons/blob/master/slugs.md +[open-pr]: https://github.com/simple-icons/simple-icons/compare ## Contributors diff --git a/_data/simple-icons.json b/_data/simple-icons.json index ecf72d50ee56..11d533d71c46 100644 --- a/_data/simple-icons.json +++ b/_data/simple-icons.json @@ -444,7 +444,7 @@ "source": "https://www.airbnb.com" }, { - "title": "Airbrake.io", + "title": "Airbrake", "hex": "FFA500", "source": "https://github.com/airbrake/slate/blob/c116f2968bcf4dfda126511de0a2d0f0dc8b6a8e/source/images/logo.svg", "license": { @@ -677,16 +677,6 @@ ] } }, - { - "title": "Amazon AWS", - "hex": "232F3E", - "source": "https://commons.wikimedia.org/wiki/File:Amazon_Web_Services_Logo.svg", - "aliases": { - "aka": [ - "AWS" - ] - } - }, { "title": "Amazon CloudWatch", "hex": "FF4F8B", @@ -888,6 +878,16 @@ ] } }, + { + "title": "Amazon Web Services", + "hex": "232F3E", + "source": "https://commons.wikimedia.org/wiki/File:Amazon_Web_Services_Logo.svg", + "aliases": { + "aka": [ + "AWS" + ] + } + }, { "title": "AMD", "hex": "ED1C24", @@ -1610,6 +1610,11 @@ "hex": "000000", "source": "https://commons.wikimedia.org/wiki/File:Audio-technica.svg" }, + { + "title": "Audiobookshelf", + "hex": "82612C", + "source": "https://github.com/advplyr/audiobookshelf/blob/0d9d2fa4be9b642f0948e52ddff71ff370fd524d/images/banner.svg" + }, { "title": "Audioboom", "hex": "007CE2", @@ -1771,6 +1776,11 @@ ] } }, + { + "title": "Awwwards", + "hex": "222222", + "source": "https://www.awwwards.com" + }, { "title": "Axios", "hex": "5A29E4", @@ -5078,7 +5088,7 @@ { "title": "FastAPI", "hex": "009688", - "source": "https://github.com/tiangolo/fastapi/blob/6205935323ded4767438ee81623892621b353415/docs/en/docs/img/icon-white.svg" + "source": "https://github.com/tiangolo/fastapi/blob/ffb4f77a11f83132b521ba0aac6c95792c19e797/docs/en/docs/img/icon-white.svg" }, { "title": "Fastify", @@ -5286,11 +5296,6 @@ "hex": "00B0B9", "source": "https://www.fitbit.com/uk/home" }, - { - "title": "FITE", - "hex": "CA0404", - "source": "https://www.fite.tv" - }, { "title": "FiveM", "hex": "F40552", @@ -5339,11 +5344,6 @@ "type": "CC-BY-3.0" } }, - { - "title": "Flattr", - "hex": "000000", - "source": "https://flattr.com" - }, { "title": "Flickr", "hex": "0063DC", @@ -5509,6 +5509,11 @@ "hex": "548294", "source": "https://fossil-scm.org" }, + { + "title": "Foundry Virtual Tabletop", + "hex": "FE6A1F", + "source": "https://github.com/simple-icons/simple-icons/issues/5828#issuecomment-1977557112" + }, { "title": "Foursquare", "hex": "3333FF", @@ -5666,6 +5671,12 @@ "hex": "2E75B4", "source": "https://furrynetwork.com" }, + { + "title": "FusionAuth", + "hex": "F58320", + "source": "https://fusionauth.io/brand-logo-guidelines", + "guidelines": "https://fusionauth.io/brand-logo-guidelines" + }, { "title": "FutureLearn", "hex": "DE00A5", @@ -6144,11 +6155,6 @@ "hex": "4285F4", "source": "https://commons.wikimedia.org/wiki/File:Google_Authenticator_(April_2023).svg" }, - { - "title": "Google Bard", - "hex": "886FBF", - "source": "https://bard.google.com" - }, { "title": "Google BigQuery", "hex": "669DF6", @@ -7003,6 +7009,11 @@ "hex": "491F59", "source": "https://github.com/homebridge/branding/blob/6ef3a1685e79f79a2ecdcc83824e53775ec0475d/logos/homebridge-silhouette-round-black.svg" }, + { + "title": "Homepage", + "hex": "009BD5", + "source": "https://github.com/gethomepage/homepage/blob/e56dccc7f17144a53b97a315c2e4f622fa07e58d/public/safari-pinned-tab.svg" + }, { "title": "homify", "hex": "7DCDA3", @@ -7121,6 +7132,12 @@ "source": "https://www.hubspot.com/style-guide", "guidelines": "https://www.hubspot.com/style-guide" }, + { + "title": "Hugging Face", + "hex": "FFD21E", + "source": "https://huggingface.co/brand", + "guidelines": "https://huggingface.co/brand" + }, { "title": "Hugo", "hex": "FF4088", @@ -7492,11 +7509,6 @@ "source": "https://www.instructure.com/about/brand-guide/download-logos", "guidelines": "https://www.instructure.com/canvas/resources/noram-guides/instructure-brand-guide-2022" }, - { - "title": "Integromat", - "hex": "2F8CBB", - "source": "https://www.integromat.com" - }, { "title": "Intel", "hex": "0071C5", @@ -7984,6 +7996,11 @@ "source": "https://www.kaggle.com/brand-guidelines", "guidelines": "https://www.kaggle.com/brand-guidelines" }, + { + "title": "Kagi", + "hex": "FFB319", + "source": "https://kagi.com" + }, { "title": "Kahoot!", "hex": "46178F", @@ -10142,6 +10159,11 @@ "hex": "48AC98", "source": "https://n26.com" }, + { + "title": "n8n", + "hex": "EA4B71", + "source": "https://n8n.io/press" + }, { "title": "Namebase", "hex": "0068FF", @@ -10472,11 +10494,6 @@ ] } }, - { - "title": "Niantic", - "hex": "000000", - "source": "https://nianticlabs.com/press" - }, { "title": "niconico", "hex": "231815", @@ -10513,11 +10530,6 @@ "hex": "6A5FBB", "source": "https://www.nintendo.com/consumer/systems/nintendogamecube/index.jsp" }, - { - "title": "Nintendo Network", - "hex": "FF7D00", - "source": "https://id.nintendo.net/login" - }, { "title": "Nintendo Switch", "hex": "E60012", @@ -12017,6 +12029,17 @@ "hex": "FF6633", "source": "https://portswigger.net" }, + { + "title": "Posit", + "hex": "447099", + "source": "https://docs.posit.co", + "guidelines": "https://posit.co/about/trademark-guidelines", + "aliases": { + "old": [ + "RStudio" + ] + } + }, { "title": "PostCSS", "hex": "DD3A0A", @@ -12841,6 +12864,11 @@ ] } }, + { + "title": "React Bootstrap", + "hex": "41E0FD", + "source": "https://github.com/react-bootstrap/react-bootstrap/blob/be23c304fa40ddb209919b0faac1e5dd8cef53ad/www/static/img/logo.svg" + }, { "title": "React Hook Form", "hex": "EC5990", @@ -13046,7 +13074,8 @@ { "title": "RenovateBot", "hex": "1A1F6C", - "source": "https://avatars1.githubusercontent.com/u/38656520" + "source": "https://avatars1.githubusercontent.com/u/38656520", + "guidelines": "https://docs.renovatebot.com/logo-brand-guidelines" }, { "title": "Renren", @@ -13313,15 +13342,6 @@ "hex": "EC4A3F", "source": "https://rollupjs.org" }, - { - "title": "Rome", - "hex": "27272A", - "source": "https://github.com/rome/tools/blob/261c3f3bdc21439777f78b6551f707cce0c8d04a/assets/SVG/logomark_black.svg", - "guidelines": "https://github.com/rome/tools/tree/main/assets", - "license": { - "type": "CC-BY-NC-SA-4.0" - } - }, { "title": "Roon", "hex": "2039F3", @@ -13386,10 +13406,10 @@ "source": "https://en.wikipedia.org/wiki/Feed_icon" }, { - "title": "RStudio", + "title": "RStudio IDE", "hex": "75AADB", - "source": "https://www.rstudio.com/about/logos/", - "guidelines": "https://www.rstudio.com/about/logos/" + "source": "https://www.rstudio.com/about/logos", + "guidelines": "https://www.rstudio.com/about/logos" }, { "title": "RTÉ", @@ -13631,6 +13651,11 @@ "hex": "0FAAFF", "source": "https://www.sap.com" }, + { + "title": "Sartorius", + "hex": "FFED00", + "source": "https://www.sartorius.com" + }, { "title": "Sass", "hex": "CC6699", @@ -13992,11 +14017,6 @@ "source": "https://www.shortcut.com/branding", "guidelines": "https://www.shortcut.com/branding" }, - { - "title": "Shotcut", - "hex": "115C77", - "source": "https://shotcut.com/media/" - }, { "title": "Showpad", "hex": "2D2E83", @@ -14161,12 +14181,6 @@ "hex": "0072C9", "source": "https://www.skysports.com" }, - { - "title": "Skynet", - "hex": "00C65E", - "source": "https://support.siasky.net/key-concepts/skynet-brand-guidelines", - "guidelines": "https://support.siasky.net/key-concepts/skynet-brand-guidelines" - }, { "title": "Skypack", "hex": "3167FF", @@ -16109,12 +16123,6 @@ "source": "https://brand.twitch.tv", "guidelines": "https://brand.twitch.tv" }, - { - "title": "Twitter", - "hex": "1D9BF0", - "source": "https://brand.twitter.com", - "guidelines": "https://about.twitter.com/en/who-we-are/brand-toolkit" - }, { "title": "Typeform", "hex": "262627", @@ -16201,6 +16209,12 @@ "hex": "2396F3", "source": "https://getuikit.com" }, + { + "title": "UiPath", + "hex": "FA4616", + "source": "https://www.uipath.com/newsroom", + "guidelines": "https://brandguidelines.uipath.com" + }, { "title": "Ulule", "hex": "18A5D6", @@ -16302,6 +16316,11 @@ "hex": "333333", "source": "https://github.com/unocss/unocss/blob/fc2ed5bb6019b45565ff5293d4b650522f1b79b4/playground/public/icon.svg" }, + { + "title": "unpkg", + "hex": "000000", + "source": "https://github.com/mjackson/unpkg/blob/af8c8db00fdacd77961ab2a8c3edb45a27d3a6a3/public/favicon.ico" + }, { "title": "Unraid", "hex": "F15A2C", @@ -17718,6 +17737,11 @@ "hex": "EB0443", "source": "https://csa-iot.org/all-solutions/zigbee" }, + { + "title": "Zigbee2MQTT", + "hex": "FFC135", + "source": "https://github.com/Koenkk/zigbee2mqtt/blob/434981b567122c745c6a5228cd89b74694b15e4c/images/logo_vector.svg" + }, { "title": "Ziggo", "hex": "F48C00", diff --git a/icons/adidas.svg b/icons/adidas.svg index c4250a1f3ef9..403536337842 100644 --- a/icons/adidas.svg +++ b/icons/adidas.svg @@ -1 +1 @@ -Adidas \ No newline at end of file +Adidas \ No newline at end of file diff --git a/icons/airbrake.svg b/icons/airbrake.svg new file mode 100644 index 000000000000..5c06885b8c4f --- /dev/null +++ b/icons/airbrake.svg @@ -0,0 +1 @@ +Airbrake \ No newline at end of file diff --git a/icons/airbrakedotio.svg b/icons/airbrakedotio.svg deleted file mode 100644 index 6c06ce27b0c9..000000000000 --- a/icons/airbrakedotio.svg +++ /dev/null @@ -1 +0,0 @@ -Airbrake.io \ No newline at end of file diff --git a/icons/amazonaws.svg b/icons/amazonaws.svg deleted file mode 100644 index 9fd688c41f97..000000000000 --- a/icons/amazonaws.svg +++ /dev/null @@ -1 +0,0 @@ -Amazon AWS \ No newline at end of file diff --git a/icons/amazonwebservices.svg b/icons/amazonwebservices.svg new file mode 100644 index 000000000000..932945eb42f5 --- /dev/null +++ b/icons/amazonwebservices.svg @@ -0,0 +1 @@ +Amazon Web Services \ No newline at end of file diff --git a/icons/audiobookshelf.svg b/icons/audiobookshelf.svg new file mode 100644 index 000000000000..086a07ae88bb --- /dev/null +++ b/icons/audiobookshelf.svg @@ -0,0 +1 @@ +Audiobookshelf \ No newline at end of file diff --git a/icons/awwwards.svg b/icons/awwwards.svg new file mode 100644 index 000000000000..530ce222f49a --- /dev/null +++ b/icons/awwwards.svg @@ -0,0 +1 @@ +Awwwards \ No newline at end of file diff --git a/icons/fastapi.svg b/icons/fastapi.svg index 4aa580b18687..ba6ba86ab82c 100644 --- a/icons/fastapi.svg +++ b/icons/fastapi.svg @@ -1 +1 @@ -FastAPI \ No newline at end of file +FastAPI \ No newline at end of file diff --git a/icons/fite.svg b/icons/fite.svg deleted file mode 100644 index 0c3df52aa3d1..000000000000 --- a/icons/fite.svg +++ /dev/null @@ -1 +0,0 @@ -FITE \ No newline at end of file diff --git a/icons/flattr.svg b/icons/flattr.svg deleted file mode 100644 index fc7bfb796a3b..000000000000 --- a/icons/flattr.svg +++ /dev/null @@ -1 +0,0 @@ -Flattr \ No newline at end of file diff --git a/icons/foundryvirtualtabletop.svg b/icons/foundryvirtualtabletop.svg new file mode 100644 index 000000000000..b9ee07706e05 --- /dev/null +++ b/icons/foundryvirtualtabletop.svg @@ -0,0 +1 @@ +Foundry Virtual Tabletop \ No newline at end of file diff --git a/icons/fusionauth.svg b/icons/fusionauth.svg new file mode 100644 index 000000000000..b7507c34b0e5 --- /dev/null +++ b/icons/fusionauth.svg @@ -0,0 +1 @@ +FusionAuth \ No newline at end of file diff --git a/icons/googlebard.svg b/icons/googlebard.svg deleted file mode 100644 index 772bc562fdf5..000000000000 --- a/icons/googlebard.svg +++ /dev/null @@ -1 +0,0 @@ -Google Bard \ No newline at end of file diff --git a/icons/homepage.svg b/icons/homepage.svg new file mode 100644 index 000000000000..fbb20778cf35 --- /dev/null +++ b/icons/homepage.svg @@ -0,0 +1 @@ +Homepage \ No newline at end of file diff --git a/icons/huggingface.svg b/icons/huggingface.svg new file mode 100644 index 000000000000..4d1631239826 --- /dev/null +++ b/icons/huggingface.svg @@ -0,0 +1 @@ +Hugging Face \ No newline at end of file diff --git a/icons/integromat.svg b/icons/integromat.svg deleted file mode 100644 index b184d83b7533..000000000000 --- a/icons/integromat.svg +++ /dev/null @@ -1 +0,0 @@ -Integromat \ No newline at end of file diff --git a/icons/kagi.svg b/icons/kagi.svg new file mode 100644 index 000000000000..a77d1826906c --- /dev/null +++ b/icons/kagi.svg @@ -0,0 +1 @@ +Kagi \ No newline at end of file diff --git a/icons/n8n.svg b/icons/n8n.svg new file mode 100644 index 000000000000..2b67f5ab4f94 --- /dev/null +++ b/icons/n8n.svg @@ -0,0 +1 @@ +n8n \ No newline at end of file diff --git a/icons/niantic.svg b/icons/niantic.svg deleted file mode 100644 index 5c7007b42fd3..000000000000 --- a/icons/niantic.svg +++ /dev/null @@ -1 +0,0 @@ -Niantic \ No newline at end of file diff --git a/icons/nintendonetwork.svg b/icons/nintendonetwork.svg deleted file mode 100644 index 35b88dc052a6..000000000000 --- a/icons/nintendonetwork.svg +++ /dev/null @@ -1 +0,0 @@ -Nintendo Network \ No newline at end of file diff --git a/icons/posit.svg b/icons/posit.svg new file mode 100644 index 000000000000..73ef905dc917 --- /dev/null +++ b/icons/posit.svg @@ -0,0 +1 @@ +Posit \ No newline at end of file diff --git a/icons/reactbootstrap.svg b/icons/reactbootstrap.svg new file mode 100644 index 000000000000..4738908bdd81 --- /dev/null +++ b/icons/reactbootstrap.svg @@ -0,0 +1 @@ +React Bootstrap \ No newline at end of file diff --git a/icons/rome.svg b/icons/rome.svg deleted file mode 100644 index a1c24ac7364c..000000000000 --- a/icons/rome.svg +++ /dev/null @@ -1 +0,0 @@ -Rome \ No newline at end of file diff --git a/icons/rstudio.svg b/icons/rstudio.svg deleted file mode 100644 index d921d2f259d6..000000000000 --- a/icons/rstudio.svg +++ /dev/null @@ -1 +0,0 @@ -RStudio \ No newline at end of file diff --git a/icons/rstudioide.svg b/icons/rstudioide.svg new file mode 100644 index 000000000000..7463b3558821 --- /dev/null +++ b/icons/rstudioide.svg @@ -0,0 +1 @@ +RStudio IDE \ No newline at end of file diff --git a/icons/sartorius.svg b/icons/sartorius.svg new file mode 100644 index 000000000000..1017a07c9f6c --- /dev/null +++ b/icons/sartorius.svg @@ -0,0 +1 @@ +Sartorius \ No newline at end of file diff --git a/icons/shotcut.svg b/icons/shotcut.svg deleted file mode 100644 index 888640ae51c0..000000000000 --- a/icons/shotcut.svg +++ /dev/null @@ -1 +0,0 @@ -Shotcut \ No newline at end of file diff --git a/icons/skynet.svg b/icons/skynet.svg deleted file mode 100644 index de95a2c77312..000000000000 --- a/icons/skynet.svg +++ /dev/null @@ -1 +0,0 @@ -Skynet \ No newline at end of file diff --git a/icons/twitter.svg b/icons/twitter.svg deleted file mode 100644 index c5a5eb26582a..000000000000 --- a/icons/twitter.svg +++ /dev/null @@ -1 +0,0 @@ -Twitter \ No newline at end of file diff --git a/icons/uipath.svg b/icons/uipath.svg new file mode 100644 index 000000000000..1152da8283d3 --- /dev/null +++ b/icons/uipath.svg @@ -0,0 +1 @@ +UiPath \ No newline at end of file diff --git a/icons/unpkg.svg b/icons/unpkg.svg new file mode 100644 index 000000000000..37bf0a0c5bec --- /dev/null +++ b/icons/unpkg.svg @@ -0,0 +1 @@ +unpkg \ No newline at end of file diff --git a/icons/zigbee2mqtt.svg b/icons/zigbee2mqtt.svg new file mode 100644 index 000000000000..9292d7566ccb --- /dev/null +++ b/icons/zigbee2mqtt.svg @@ -0,0 +1 @@ +Zigbee2MQTT \ No newline at end of file diff --git a/package.json b/package.json index baa84f73d6cb..86439276e7c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "simple-icons", - "version": "11.15.0", + "version": "12.0.0", "description": "SVG icons for popular brands https://simpleicons.org", "homepage": "https://simpleicons.org", "keywords": [ diff --git a/scripts/add-icon-data.js b/scripts/add-icon-data.js index 6c5f39009718..9ee694d31daa 100644 --- a/scripts/add-icon-data.js +++ b/scripts/add-icon-data.js @@ -7,11 +7,11 @@ import {search} from 'fast-fuzzy'; import getRelativeLuminance from 'get-relative-luminance'; import autocomplete from 'inquirer-autocomplete-standalone'; import { - URL_REGEX, collator, getIconsDataString, normalizeColor, titleToSlug, + urlRegex, } from '../sdk.mjs'; import {getJsonSchemaData, writeIconsData} from './utils.js'; @@ -30,8 +30,10 @@ const licenseTypes = (license) => ({name: license, value: license}), ); -const isValidURL = (input) => - URL_REGEX.test(input) || 'Must be a valid and secure (https://) URL.'; +const isValidURL = async (input) => { + const regex = await urlRegex(); + return regex.test(input) || 'Must be a valid and secure (https://) URL.'; +}; const isValidHexColor = (input) => HEX_REGEX.test(input) || 'Must be a valid hex code.'; diff --git a/sdk.d.ts b/sdk.d.ts index 4d7c1fd218c8..184fe2283d50 100644 --- a/sdk.d.ts +++ b/sdk.d.ts @@ -63,9 +63,9 @@ export type IconData = { /* The next code is autogenerated from sdk.mjs */ /* eslint-disable */ -export const URL_REGEX: RegExp; export const SVG_PATH_REGEX: RegExp; export function getDirnameFromImportMeta(importMetaUrl: string): string; +export function urlRegex(jsonschemaPath?: string): Promise; export function getIconSlug(icon: IconData): string; export function svgToPath(svg: string): string; export function titleToSlug(title: string): string; @@ -80,4 +80,7 @@ export function normalizeColor(text: string): string; export function getThirdPartyExtensions( readmePath?: string, ): Promise; +export function getThirdPartyLibraries( + readmePath?: string, +): Promise; export const collator: Intl.Collator; diff --git a/sdk.mjs b/sdk.mjs index a0cfe9cd9d23..0fa79107568c 100644 --- a/sdk.mjs +++ b/sdk.mjs @@ -33,11 +33,6 @@ const TITLE_TO_SLUG_CHARS_REGEX = new RegExp( const TITLE_TO_SLUG_RANGE_REGEX = /[^a-z\d]/g; -/** - * Regex to validate HTTPs URLs. - */ -export const URL_REGEX = /^https:\/\/[^\s"']+$/; - /** * Regex to validate SVG paths. */ @@ -52,6 +47,24 @@ export const SVG_PATH_REGEX = /^m[-mzlhvcsqtae\d,. ]+$/i; export const getDirnameFromImportMeta = (importMetaUrl) => path.dirname(fileURLToPath(importMetaUrl)); +/** + * Build a regex to validate HTTPs URLs. + * @param {String} jsonschemaPath Path to the *.jsonschema.json* file + * @returns {Promise} Regex to validate HTTPs URLs + */ +export const urlRegex = async ( + jsonschemaPath = path.join( + getDirnameFromImportMeta(import.meta.url), + '.jsonschema.json', + ), +) => { + return new RegExp( + JSON.parse( + await fs.readFile(jsonschemaPath, 'utf8'), + ).definitions.url.pattern, + ); +}; + /** * Get the slug/filename for an icon. * @param {IconData} icon The icon data as it appears in *_data/simple-icons.json* @@ -196,9 +209,40 @@ export const getThirdPartyExtensions = async ( ), ) => normalizeNewlines(await fs.readFile(readmePath, 'utf8')) - .split('## Third-Party Extensions\n\n')[1] - .split('\n\n', 1)[0] - .split('\n') + .split('## Third-Party Extensions')[1] + .split('|\n\n')[0] + .split('|\n|') + .slice(2) + .map((line) => { + let [module, author] = line.split(' | '); + module = module.split(' { const thirdPartyExtensions = await getThirdPartyExtensions(); @@ -17,3 +17,19 @@ test('README third party extensions must be alphabetically sorted', async () => 'Wrong alphabetical order of third party extensions in README.', ); }); + +test('README third party libraries must be alphabetically sorted', async () => { + const thirdPartyLibraries = await getThirdPartyLibraries(); + assert.ok(thirdPartyLibraries.length > 0); + + const thirdPartyLibrariesNames = thirdPartyLibraries.map( + (library) => library.module.name, + ); + + const expectedOrder = [...thirdPartyLibrariesNames].sort(); + assert.deepEqual( + thirdPartyLibrariesNames, + expectedOrder, + 'Wrong alphabetical order of third party libraries in README.', + ); +}); diff --git a/tests/test-icon.js b/tests/test-icon.js index 1097e6b3612f..409e13812db4 100644 --- a/tests/test-icon.js +++ b/tests/test-icon.js @@ -4,7 +4,6 @@ import path from 'node:path'; import {describe, it} from 'mocha'; import { SVG_PATH_REGEX, - URL_REGEX, getDirnameFromImportMeta, titleToSlug, } from '../sdk.mjs'; @@ -43,7 +42,6 @@ export const testIcon = (icon, subject, slug) => { it('has the correct "source"', () => { assert.equal(subject.source, icon.source); - assert.match(subject.source, URL_REGEX); }); it('has an "svg" value', () => { @@ -67,8 +65,6 @@ export const testIcon = (icon, subject, slug) => { assert.equal(subject.license.type, icon.license.type); if (icon.license.type === 'custom') { assert.equal(subject.license.url, icon.license.url); - } else { - assert.match(subject.license.url, URL_REGEX); } } else { assert.equal(subject.license, undefined);