From 12abbc5c206108812665ee23e4080f82d69b3c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 12:16:35 +0200 Subject: [PATCH 01/14] Fix conflicts --- package-lock.json | 972 +++++++++++++------------------- public/index.pug | 85 ++- public/removed.pug | 67 +++ public/scripts/dom-utils.js | 2 + public/scripts/download-type.js | 4 +- public/scripts/index.js | 6 + public/scripts/layout.js | 52 ++ public/scripts/modal.js | 110 ++++ public/scripts/storage.js | 1 + public/stylesheet.css | 131 ++++- scripts/removed-icons.js | 314 +++++++++++ si-utils.js | 201 +++++++ tests/e2e.test.js | 37 +- tests/modal.test.js | 2 +- 14 files changed, 1396 insertions(+), 588 deletions(-) create mode 100644 public/removed.pug create mode 100644 public/scripts/layout.js create mode 100644 scripts/removed-icons.js create mode 100644 si-utils.js diff --git a/package-lock.json b/package-lock.json index c642394c..acb14f38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,26 +24,26 @@ } }, "@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", "dev": true }, "@babel/core": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", - "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", + "@babel/traverse": "^7.19.1", "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -52,23 +52,6 @@ "semver": "^6.3.0" }, "dependencies": { - "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -103,17 +86,6 @@ "jsesc": "^2.5.1" }, "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -128,14 +100,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.0", + "@babel/compat-data": "^7.19.1", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "dependencies": { @@ -161,19 +133,6 @@ "requires": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-hoist-variables": { @@ -208,19 +167,6 @@ "@babel/template": "^7.18.10", "@babel/traverse": "^7.19.0", "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-plugin-utils": { @@ -254,9 +200,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { @@ -274,19 +220,6 @@ "@babel/template": "^7.18.10", "@babel/traverse": "^7.19.0", "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/highlight": { @@ -359,9 +292,9 @@ } }, "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -502,9 +435,9 @@ } }, "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", @@ -513,29 +446,12 @@ "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -545,6 +461,12 @@ "ms": "2.1.2" } }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -554,9 +476,9 @@ } }, "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.18.10", @@ -593,24 +515,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -620,41 +524,11 @@ "ms": "2.1.2" } }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, @@ -730,6 +604,70 @@ "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@istanbuljs/schema": { @@ -894,16 +832,6 @@ "v8-to-istanbul": "^9.0.1" }, "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "jest-worker": { "version": "29.0.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.3.tgz", @@ -950,18 +878,6 @@ "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } } }, "@jest/test-result": { @@ -1019,16 +935,6 @@ "write-file-atomic": "^4.0.1" }, "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1103,9 +1009,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -1179,9 +1085,9 @@ "dev": true }, "@sinclair/typebox": { - "version": "0.24.40", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.40.tgz", - "integrity": "sha512-Xint60L8rF0+nRy+6fCjW9jQMmu7fTpbwTBrXZiK6eq/RHDJS7LvWX/0oXC8O7fCePmrY/XdfaTv2HiUDeCq4g==", + "version": "0.24.43", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.43.tgz", + "integrity": "sha512-1orQTvtazZmsPeBroJjysvsOQCYV2yjWlebkSY38pl5vr2tdLjEJ+LoxITlGNZaH2RE19WlAwQMkH/7C14wLfw==", "dev": true }, "@sinonjs/commons": { @@ -1241,18 +1147,18 @@ } }, "@types/babel__traverse": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz", - "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "requires": { "@types/estree": "*", @@ -1321,9 +1227,9 @@ "dev": true }, "@types/node": { - "version": "18.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.4.tgz", - "integrity": "sha512-I4BD3L+6AWiUobfxZ49DlU43gtI+FTHSv9pE2Zekg6KjMpre4ByusaljW3vYSLJrvQ1ck1hUaeVu8HVlY3vzHg==", + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, "@types/parse-json": { @@ -1333,9 +1239,9 @@ "dev": true }, "@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "@types/stack-utils": { @@ -1345,9 +1251,9 @@ "dev": true }, "@types/yargs": { - "version": "17.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", - "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -1570,11 +1476,18 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1609,14 +1522,14 @@ } }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, @@ -1627,16 +1540,34 @@ "dev": true, "requires": { "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } + "requires": {} }, "ansi-escapes": { "version": "4.3.2", @@ -1645,6 +1576,14 @@ "dev": true, "requires": { "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } } }, "ansi-regex": { @@ -1688,13 +1627,10 @@ } }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "arr-diff": { "version": "4.0.0", @@ -1762,14 +1698,6 @@ "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001396", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001396.tgz", - "integrity": "sha512-Df93cp39XVZRoOl2EoiuNp2rc4Dnsb9mDQEs4qFa7/uTx3FnfEq+jyHLf/0Ik7GVJA6wvJuAI5ZKUtUEenAm9Q==", - "dev": true - } } }, "axios": { @@ -1955,15 +1883,15 @@ } }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.0.9" } }, "bser": { @@ -2059,9 +1987,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001374", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz", - "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==", + "version": "1.0.30001412", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001412.tgz", + "integrity": "sha512-+TeEIee1gS5bYOiuf+PS/kp2mrXic37Hl66VY6EAfxasIk5fELTktK2oOezYed12H8w7jt3s512PpulQidPjwA==", "dev": true }, "chalk": { @@ -2111,9 +2039,9 @@ "dev": true }, "ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", + "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", "dev": true }, "cjs-module-lexer": { @@ -2697,9 +2625,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.211", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz", - "integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==", + "version": "1.4.264", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz", + "integrity": "sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw==", "dev": true }, "emittery": { @@ -2767,31 +2695,32 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -2827,9 +2756,9 @@ "dev": true }, "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { @@ -2879,24 +2808,6 @@ "text-table": "^0.2.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2906,47 +2817,6 @@ "ms": "2.1.2" } }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2961,56 +2831,17 @@ "slash": "^3.0.0" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, @@ -3022,13 +2853,13 @@ "requires": {} }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-utils": { @@ -3063,14 +2894,6 @@ "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - } } }, "esprima": { @@ -3086,14 +2909,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "esrecurse": { @@ -3103,20 +2918,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -3376,9 +3183,9 @@ } }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -3427,9 +3234,9 @@ } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -3531,12 +3338,12 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -3557,9 +3364,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-in": { @@ -3660,9 +3467,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -3770,10 +3577,13 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } }, "globby": { "version": "13.1.2", @@ -4193,14 +4003,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } } }, "import-local": { @@ -4307,9 +4109,9 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -4383,6 +4185,14 @@ "requires": { "acorn": "^7.1.1", "object-assign": "^4.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "is-extendable": { @@ -4616,28 +4426,6 @@ "@jest/types": "^29.0.3", "import-local": "^3.0.2", "jest-cli": "^29.0.3" - }, - "dependencies": { - "jest-cli": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.0.3.tgz", - "integrity": "sha512-aUy9Gd/Kut1z80eBzG10jAn6BgS3BoBbXyv+uXEqBJ8wnnuZ5RpNfARoskSrTIy1GY4a8f32YGuCMwibtkl9CQ==", - "dev": true, - "requires": { - "@jest/core": "^29.0.3", - "@jest/test-result": "^29.0.3", - "@jest/types": "^29.0.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.0.3", - "jest-util": "^29.0.3", - "jest-validate": "^29.0.3", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - } } }, "jest-changed-files": { @@ -4685,6 +4473,26 @@ } } }, + "jest-cli": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.0.3.tgz", + "integrity": "sha512-aUy9Gd/Kut1z80eBzG10jAn6BgS3BoBbXyv+uXEqBJ8wnnuZ5RpNfARoskSrTIy1GY4a8f32YGuCMwibtkl9CQ==", + "dev": true, + "requires": { + "@jest/core": "^29.0.3", + "@jest/test-result": "^29.0.3", + "@jest/types": "^29.0.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.0.3", + "jest-util": "^29.0.3", + "jest-validate": "^29.0.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, "jest-config": { "version": "29.0.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.0.3.tgz", @@ -5301,9 +5109,9 @@ } }, "joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.1.tgz", + "integrity": "sha512-Hl7/iBklIX345OCM1TiFSCZRVaAOLDGlWCp0Df2vWYgBgjkezaR7Kvm3joBciBHQjZj5sxXs859r6eqsRSlG8w==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0", @@ -5337,13 +5145,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsesc": { @@ -5365,9 +5172,9 @@ "dev": true }, "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -5506,12 +5313,12 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -6105,9 +5912,9 @@ } }, "object.assign": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", - "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -6182,23 +5989,12 @@ } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } + "p-limit": "^3.0.2" } }, "p-try": { @@ -6361,6 +6157,45 @@ "dev": true, "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } } }, "pofile": { @@ -7143,6 +6978,14 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "resolve-dir": { @@ -7156,9 +6999,9 @@ } }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-url": { @@ -7204,9 +7047,9 @@ } }, "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -7227,6 +7070,17 @@ "ret": "~0.1.10" } }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -7237,6 +7091,35 @@ "ajv": "^8.8.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "sdown": { @@ -7661,9 +7544,9 @@ } }, "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "split-string": { @@ -7694,6 +7577,14 @@ "dev": true, "requires": { "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } } }, "static-extend": { @@ -7958,9 +7849,9 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -7969,12 +7860,6 @@ "source-map-support": "~0.5.20" }, "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -7994,43 +7879,18 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -8160,9 +8020,9 @@ "dev": true }, "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "unbox-primitive": { @@ -8255,9 +8115,9 @@ } }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -8400,42 +8260,20 @@ "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "schema-utils": { diff --git a/public/index.pug b/public/index.pug index 6e240738..600d5838 100644 --- a/public/index.pug +++ b/public/index.pug @@ -43,7 +43,7 @@ html(lang=lang) d='M11.2 0a.8.8 0 0 0-.8.8v11.4L7.26 9.44a.803.803 0 0 0-1.13.074l-1.05 1.2a.8.8 0 0 0 .073 1.13l6.33 5.54a.795.795 0 0 0 1.05 0l6.32-5.54a.8.8 0 0 0 .074-1.13l-1.05-1.2a.804.804 0 0 0-1.13-.074l-3.14 2.76V.8a.8.8 0 0 0-.8-.8zm-8 20.8a.8.8 0 0 0-.8.8v1.6a.8.8 0 0 0 .8.8h17.6a.8.8 0 0 0 .8-.8v-1.6a.8.8 0 0 0-.8-.8z' ) - body.no-js.order-alpha.download-svg(tabindex='-1') + body.no-js.order-alpha.layout-comfortable.download-svg(tabindex='-1') .popup_modal.popup__top.hidden .popup-body table.extensions__table @@ -63,7 +63,26 @@ html(lang=lang) href=ext.author.url, rel='noopener', target='_blank' - ) #{ ext.author.name } + ) #{ ext.nameAuthor } + .detail_modal.detail__top.hidden + .detail-body + .icon-left + #icon_container.icon-preview + .icon-right + h2#icon-title.grid-item__title + div + button#icon-hex.grid-item__color.copy-color + div + a#icon-source + div + a#icon-guidelines + div + a#icon-license + .detail-footer + a#icon-download-svg.detail-button(role='button', download) SVG + a#icon-download-color-svg.detail-button(role='button', download) Color SVG + a#icon-download-pdf.detail-button(role='button', download) PDF + a#icon-report.report__icon.detail-button(role='button') Report header.header ul.header__list li.header__list-item @@ -331,6 +350,35 @@ html(lang=lang) path( d='M17.612 7.239H24l-.006.882-.01.885-2.006.012h-2.01v2.151h3.753v1.751h-3.752v3.841h-2.357V12Zm-7.653.02c.56-.024 1.078-.02 1.545.013.92.062 1.597.221 2.217.522.843.406 1.473 1.03 1.845 1.825.614 1.315.567 3.328-.109 4.661-.793 1.567-2.167 2.308-4.564 2.458-.713.046-2.226-.015-2.79-.11L8 16.61V7.435l.164-.022a22.974 22.974 0 0 1 1.795-.151zm-7.917 0c.687-.019 1.344 0 1.71.053.623.1 1.063.255 1.47.523.834.55 1.271 1.57 1.166 2.703-.078.802-.33 1.392-.8 1.872-.462.47-1.042.759-1.842.918-.301.059-.45.071-1.04.071h-.69l-.007 1.675L2 16.748l-1.002.013H0l.006-4.66.01-4.662.14-.024c.483-.084 1.2-.137 1.886-.157Zm.78 1.62c-.283 0-.57 0-.645.019a.968.968 0 0 0-.162.045c-.018.013-.03.526-.03 1.398v1.38l.117.025c.214.043.937.024 1.148-.03.778-.206 1.19-.774 1.144-1.573-.034-.6-.32-.987-.875-1.186-.158-.059-.263-.071-.697-.078Zm8.244 0a5.62 5.62 0 0 0-.725.015 1.973 1.973 0 0 0-.254.043c-.031.013-.04.651-.04 3.057 0 2.87.002 3.045.055 3.066.096.041 1.188.026 1.417-.021 1.24-.243 2-1.036 2.233-2.329a5.674 5.674 0 0 0 .05-1.389c-.056-.46-.137-.743-.317-1.11-.142-.279-.198-.359-.443-.598-.372-.366-.72-.55-1.29-.68a4.624 4.624 0 0 0-.686-.055z' ) + .control-field + label.control-field__title Layout + .control-field__row + button#layout-comfortable.control__button.first__button( + title='Comfortable layout', + disabled + ) + svg( + role='img', + viewBox='0 0 24 24', + xmlns='http://www.w3.org/2000/svg', + aria-labelledby='layout-comfortable' + ) + path( + d='M19 2a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h14zm0 4V4H5v2h14zm0 10a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2a2 2 0 0 1 2-2h14zm0 4v-2H5v2h14zm0-11a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2a2 2 0 0 1 2-2h14zm0 4v-2H5v2h14z' + ) + button#layout-compact.control__button( + title='Compact layout', + disabled + ) + svg( + role='img', + viewBox='0 0 24 24', + xmlns='http://www.w3.org/2000/svg', + aria-labelledby='layout-compact' + ) + path( + d='M2 5.5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v13a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-13zm9 0H4v3h7v-3zm2 0v3h7v-3h-7zm7 5h-7v3h7v-3zm0 5h-7v3h7v-3zm-9 3v-3H4v3h7zm-7-5h7v-3H4v3z' + ) ul.grid li.grid-item--if-empty.hidden( aria-hidden='true', @@ -391,13 +439,42 @@ html(lang=lang) title=`${ t_('$iconTitle color').replace('$iconTitle', icon.localizedTitle || icon.title) }`, disabled ) ##{ icon.hex } + button.grid-item__button.view-button( + title=`${icon.title} view`, + index=`${icon.indexByAlpha}` + ) + svg( + role='img', + xmlns='http://www.w3.org/2000/svg', + viewBox='0 0 24 24' + ) + path( + d='m23.136 20.694-4.41-4.413a1.93 1.93 0 0 0-1.186-.551 9.632 9.632 0 0 0 2.13-6.044C19.67 4.344 15.325 0 9.983 0 4.642 0 .297 4.344.297 9.686c0 5.34 4.344 9.685 9.685 9.685 2.016 0 3.89-.62 5.44-1.677.01.48.195.957.563 1.325l4.413 4.413c.377.38.874.568 1.369.568s.992-.189 1.369-.568a1.935 1.935 0 0 0 0-2.738zm-13.154-4.55a6.465 6.465 0 0 1-6.458-6.458 6.465 6.465 0 0 1 6.458-6.458 6.465 6.465 0 0 1 6.458 6.458 6.465 6.465 0 0 1-6.458 6.458z' + ) a.grid-item__button( href=`/icons/${icon.slug}.svg`, role='button', download ) - svg(role='img', viewBox='0 0 24 24') - use(href='#cp') + svg( + role='img', + xmlns='http://www.w3.org/2000/svg', + viewBox='0 0 24 24' + ) + path( + d='M11.2 0a.8.8 0 0 0-.8.8v11.4L7.26 9.44a.803.803 0 0 0-1.13.074l-1.05 1.2a.8.8 0 0 0 .073 1.13l6.33 5.54a.795.795 0 0 0 1.05 0l6.32-5.54a.8.8 0 0 0 .074-1.13l-1.05-1.2a.804.804 0 0 0-1.13-.074l-3.14 2.76V.8a.8.8 0 0 0-.8-.8zm-8 20.8a.8.8 0 0 0-.8.8v1.6a.8.8 0 0 0 .8.8h17.6a.8.8 0 0 0 .8-.8v-1.6a.8.8 0 0 0-.8-.8z' + ) + a.report__icon.grid-item__button( + href=`https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, + role='button', + title=`Report ${icon.title} as outdated` + ) + svg( + role='img', + xmlns='http://www.w3.org/2000/svg', + viewBox='0 0 24 24' + ) + path(d='M7 2h2v20H7V2m12 7-8 5.6V3.4L19 9Z') footer.footer .footer-description //- prettier-ignore diff --git a/public/removed.pug b/public/removed.pug new file mode 100644 index 00000000..4c834818 --- /dev/null +++ b/public/removed.pug @@ -0,0 +1,67 @@ +doctype html +html(lang='en-US') + head + meta(charset='UTF-8') + meta( + content='initial-scale=1, shrink-to-fit=no, width=device-width', + name='viewport' + ) + link(rel='preconnect', href='https://fonts.gstatic.com') + title #{ pageTitle } + meta(name='description', content=pageDescription) + meta(property='og:type', content='website') + meta(property='og:title', content=pageTitle) + meta(property='og:description', content=pageDescription) + meta(property='og:url', content=pageUrl) + meta(property='og:site_name', content=pageTitle) + meta(property='og:image', content=`${pageUrl}/images/og.png`) + link(rel='icon', type='image/x-icon', href=`${pageUrl}/images/favicon.ico`) + link(rel='icon', type='image/png', href=`${pageUrl}/images/favicon.png`) + link(rel='apple-touch-icon', href=`${pageUrl}/images/apple-touch-icon.png`) + link(rel='mask-icon', href=`${pageUrl}/images/logo.svg`, color='#111111') + link( + rel='stylesheet', + href='https://fonts.googleapis.com/css2?family=Open+Sans:wght@600&family=Roboto+Mono:wght@400;600&display=swap' + ) + link(rel='license', href='license.txt') + link(rel='canonical', href=pageUrl) + + body.no-js.removed + .header + p.control-field__title Removed icons + main.main.no-header + ul.grid.grid-top-padding + each icon in removedIcons + li.grid-item + .grid-item__row.mv-2.fg-2 + button( + class=`grid-item__color copy-button copy-color ${icon.light ? "contrast-light" : "contrast-dark"} ${icon.superLight ? "border-light" : ""} ${icon.superDark ? "border-dark" : ""}`, + style=`background-color: #${icon.hex}`, + title=`${icon.title} color`, + disabled + ) #{ icon.hex } + button.grid-item__preview.copy-button.copy-svg( + title=`${icon.title} SVG`, + disabled + ) + if (icon.path) + svg.icon-preview( + role='img', + viewBox='0 0 24 24', + xmlns='http://www.w3.org/2000/svg', + alt=`${icon.title} icon` + ) + path(fill=`#${icon.hex}`, d=`${icon.path}`) + else + svg.icon-preview( + role='img', + viewBox='0 0 24 24', + xmlns='http://www.w3.org/2000/svg', + alt=`${icon.title} icon` + ) + path( + fill='#DDDDDD', + d='M 11.455899,0.00555608 C 10.337678,0.07713592 9.6134609,0.19580776 8.6978704,0.4557556 5.4501509,1.3768751 2.7108843,3.673081 1.2117925,6.72841 0.56637626,8.0432186 0.18362942,9.4258398 0.03540883,10.96669 c -0.05816251,0.623498 -0.04315283,1.748055 0.03377178,2.401692 0.26642182,2.273602 1.14261189,4.375789 2.56477909,6.150215 0.3808706,0.476571 1.0412965,1.162231 1.4859583,1.546501 1.8368096,1.582292 4.0000797,2.550503 6.369733,2.850008 0.568492,0.07158 0.829285,0.08665 1.529111,0.08477 0.733598,0 1.060059,-0.0226 1.688589,-0.113021 2.078841,-0.295738 4.037604,-1.132092 5.69805,-2.431831 0.788008,-0.615963 1.58915,-1.43348 2.197042,-2.243463 1.283327,-1.706614 2.076964,-3.699547 2.328376,-5.843175 0.07692,-0.653637 0.09193,-1.778194 0.03377,-2.401692 -0.0394,-0.403108 -0.10882,-0.902283 -0.174487,-1.2432288 C 23.09403,6.1030282 20.754396,2.9949562 17.45039,1.3034116 16.084509,0.60456632 14.637951,0.18827304 13.060059,0.041346 12.763617,0.0130908 11.696054,-0.01139704 11.455899,0.00555608 Z m 0.981258,3.84082352 c 1.371509,0.050859 2.874354,0.5726387 4.056366,1.407109 0.300194,0.2109721 0.617273,0.4690363 0.598511,0.4841057 -0.01689,0.01507 -5.382847,3.9387749 -10.274126,7.5139997 -1.2364224,0.904166 -2.2552044,1.642569 -2.2627093,1.642569 -0.033772,0 -0.2495359,-0.717682 -0.339594,-1.130208 C 3.7840764,11.795509 4.1067845,9.648114 5.1011758,7.90571 5.6640388,6.916778 6.4445422,6.0314484 7.3376181,5.3721604 8.4464583,4.5546433 9.7072714,4.049817 11.071276,3.8840532 c 0.260793,-0.032023 0.833037,-0.062161 1.003772,-0.054627 0.05629,0.00377 0.219517,0.011302 0.362109,0.016953 z m 7.082693,5.4476026 c 0.529091,1.5088278 0.594758,3.2116748 0.181992,4.8184538 -0.230774,0.896631 -0.619149,1.76124 -1.138859,2.533549 -0.470929,0.698845 -1.076945,1.348715 -1.750504,1.874262 -1.804914,1.41276 -4.174568,1.966562 -6.407257,1.495642 C 9.4164588,19.808684 8.5083732,19.424413 7.6565738,18.857426 7.3676375,18.66529 6.9811382,18.369552 6.9811382,18.341297 c 0,-0.01507 12.4617868,-9.1509172 12.4880538,-9.1528009 0.0075,-0.00188 0.02814,0.047092 0.05066,0.1054861 z' + ) + .grid-item__row + h2.grid-item__title(title=`${icon.title}`) #{ icon.title } diff --git a/public/scripts/dom-utils.js b/public/scripts/dom-utils.js index 5e4225f6..f779479f 100644 --- a/public/scripts/dom-utils.js +++ b/public/scripts/dom-utils.js @@ -50,6 +50,8 @@ export const removeClass = ($el, clazz) => { } }; +export const removeClasses = removeClass; + export const toggleClass = ($el, clazz) => { if ($el) { $el.classList.toggle(clazz); diff --git a/public/scripts/download-type.js b/public/scripts/download-type.js index da3e4bfe..065b1b72 100644 --- a/public/scripts/download-type.js +++ b/public/scripts/download-type.js @@ -15,7 +15,9 @@ export default (document, storage) => { const $body = document.querySelector('body'); const $downloadPdf = document.getElementById('download-pdf'); const $downloadSvg = document.getElementById('download-svg'); - const $downloadFiles = document.getElementsByClassName('grid-item__button'); + const $downloadFiles = document.getElementsByClassName( + 'grid-item__button[data-icon]', + ); $downloadPdf.disabled = false; $downloadSvg.disabled = false; diff --git a/public/scripts/index.js b/public/scripts/index.js index 625f0360..ef34955c 100644 --- a/public/scripts/index.js +++ b/public/scripts/index.js @@ -39,8 +39,14 @@ const detachedInitModal = async () => { initModal(document, domUtils); }; +const detachedInitLayout = async () => { + const { default: initLayout } = await import('./layout.js'); + initLayout(document, storage); +}; + detachedInitColorScheme(); detachedInitCopyButtons(); detachedInitSearch(); detachedInitDownloadType(); detachedInitModal(); +detachedInitLayout(); diff --git a/public/scripts/layout.js b/public/scripts/layout.js new file mode 100644 index 00000000..5a8877d4 --- /dev/null +++ b/public/scripts/layout.js @@ -0,0 +1,52 @@ +import { STORAGE_KEY_LAYOUT } from './storage.js'; + +const LAYOUT_COMPACT = 'layout-compact'; +const LAYOUT_COMFORTABLE = 'layout-comfortable'; + +const DEFAULT_LAYOUT = LAYOUT_COMFORTABLE; + +const initLayout = (document, storage) => { + let activelayout = DEFAULT_LAYOUT; + + const $body = document.querySelector('body'); + const $layoutComfortable = document.getElementById('layout-comfortable'); + const $layoutCompact = document.getElementById('layout-compact'); + + function selectlayout(selected) { + if (selected === activelayout) { + return; + } + + if (selected === LAYOUT_COMFORTABLE) { + $body.classList.add(LAYOUT_COMFORTABLE); + $body.classList.remove(LAYOUT_COMPACT); + } else if (selected === LAYOUT_COMPACT) { + $body.classList.add(LAYOUT_COMPACT); + $body.classList.remove(LAYOUT_COMFORTABLE); + } else { + selected = DEFAULT_LAYOUT; + $body.classList.remove(LAYOUT_COMFORTABLE, LAYOUT_COMPACT); + $body.classList.add(DEFAULT_LAYOUT); + } + + storage.setItem(STORAGE_KEY_LAYOUT, selected); + activelayout = selected; + } + + const storedlayout = storage.getItem(STORAGE_KEY_LAYOUT); + selectlayout(storedlayout); + + $layoutComfortable.addEventListener('click', (event) => { + event.preventDefault(); + selectlayout(LAYOUT_COMFORTABLE); + }); + $layoutCompact.addEventListener('click', (event) => { + event.preventDefault(); + selectlayout(LAYOUT_COMPACT); + }); + + $layoutComfortable.disabled = false; + $layoutCompact.disabled = false; +}; + +export default initLayout; diff --git a/public/scripts/modal.js b/public/scripts/modal.js index f1e7f935..e3e6b8f5 100644 --- a/public/scripts/modal.js +++ b/public/scripts/modal.js @@ -1,3 +1,10 @@ +import * as simpleIcons from 'simple-icons/icons'; +import getRelativeLuminance from 'get-relative-luminance'; + +const icons = Object.values(simpleIcons).sort((icon1, icon2) => + icon1.title.localeCompare(icon2.title), +); + export default (document, domUtils) => { const $modalTrigger = document.querySelector('.popup-trigger'); const $popupModal = document.querySelector('.popup_modal'); @@ -7,9 +14,109 @@ export default (document, domUtils) => { e.stopPropagation(); }); + // Detail view + const $detailButtons = document.querySelectorAll('.view-button'); + const $detailModal = document.querySelector('.detail_modal'); + const $detailBody = document.querySelector('.detail-body'); + const $detailFooter = document.querySelector('.detail-footer'); + $detailButtons.forEach((button) => + button.addEventListener('click', (e) => { + domUtils.toggleVisibleElement($detailModal); + const index = e.target.getAttribute('index'); + const icon = icons[index]; + const luminance = getRelativeLuminance(`#${icon.hex}`); + + const $iconHex = $detailBody.querySelector('#icon-hex'); + domUtils.removeClasses( + $iconHex, + 'contrast-light', + 'contrast-dark', + 'border-light', + 'border-dark', + ); + domUtils.addClass( + $iconHex, + luminance < 0.4 ? 'contrast-light' : 'contrast-dark', + ); + if (luminance > 0.95) domUtils.addClass($iconHex, 'border-light'); + if (luminance < 0.02) domUtils.addClass($iconHex, 'border-dark'); + $detailBody + .querySelector('#icon-hex') + .setAttribute('style', `background-color: #${icon.hex}`); + $iconHex.innerHTML = icon.hex; + $detailBody.querySelector('#icon_container').innerHTML = icon.svg; + $detailBody.querySelector('#icon-title').innerHTML = icon.title; + + $detailBody + .querySelector('#icon-source') + .setAttribute('href', icon.source); + $detailBody.querySelector('#icon-source').innerHTML = icon.source.slice( + 0, + 25, + ); + + if (icon.guidelines) { + $detailBody.querySelector('#icon-guidelines').innerHTML = 'Guidelines'; + domUtils.removeClass( + $detailBody.querySelector('#icon-guidelines'), + 'italic-text', + ); + $detailBody + .querySelector('#icon-guidelines') + .setAttribute('href', icon.guidelines); + } else { + domUtils.addClass( + $detailBody.querySelector('#icon-guidelines'), + 'italic-text', + ); + $detailBody.querySelector('#icon-guidelines').innerHTML = + 'no guidelines'; + } + + if (icon.license) { + $detailBody + .querySelector('#icon-license') + .setAttribute('href', icon.license.url); + domUtils.removeClass( + $detailBody.querySelector('#icon-license'), + 'italic-text', + ); + $detailBody.querySelector('#icon-license').innerHTML = + icon.license.type; + } else { + domUtils.addClass( + $detailBody.querySelector('#icon-license'), + 'italic-text', + ); + $detailBody.querySelector('#icon-license').innerHTML = 'no license'; + } + + const iconSVG = icon.svg.replace('svg', `svg fill="%23${icon.hex}"`); + const colorSVG = `data:image/svg+xml,${iconSVG}`; + + $detailFooter + .querySelector('#icon-download-svg') + .setAttribute('href', `./icons/${icon.slug}.svg`); + $detailFooter + .querySelector('#icon-download-color-svg') + .setAttribute('href', colorSVG); + $detailFooter + .querySelector('#icon-download-pdf') + .setAttribute('href', `./icons/${icon.slug}.pdf`); + $detailFooter + .querySelector('#icon-report') + .setAttribute( + 'href', + `https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, + ); + e.stopPropagation(); + }), + ); + document.addEventListener('keyup', (e) => { if (e.key === 'Escape') { domUtils.hideElement($popupModal); + domUtils.hideElement($detailModal); } }); @@ -17,5 +124,8 @@ export default (document, domUtils) => { if (!e.composedPath().includes($popupBody)) { domUtils.hideElement($popupModal); } + if (!e.composedPath().includes($detailModal)) { + domUtils.hideElement($detailModal); + } }); }; diff --git a/public/scripts/storage.js b/public/scripts/storage.js index a8d1425c..e2aa703b 100644 --- a/public/scripts/storage.js +++ b/public/scripts/storage.js @@ -3,6 +3,7 @@ const PREFIX = 'simple-icons-'; export const STORAGE_KEY_COLOR_SCHEME = PREFIX + 'preferred-color-scheme'; export const STORAGE_KEY_ORDERING = PREFIX + 'preferred-ordering'; export const STORAGE_KEY_DOWNLOAD_TYPE = PREFIX + 'preferred-download-type'; +export const STORAGE_KEY_LAYOUT = PREFIX + 'preferred-layout'; const mockStorage = { hasItem() { diff --git a/public/stylesheet.css b/public/stylesheet.css index 1e92d6b1..c8d44d34 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -69,6 +69,38 @@ --lm-color-link-hover: rgb(52, 52, 238); --lm-color-link-visited: rgb(85, 26, 139); } + +.icon-left { + width: 50%; + height: auto; + float: left; + padding: 5px; +} + +.icon-right { + padding: 5px; +} + +.detail-footer { + width: 100%; + height: auto; + display: flex; +} + +.detail-footer a:hover { + color: var(--color-button-text-hover); + background: var(--color-button-hover); +} + +.italic-text { + font-style: italic; +} + +.detail-body { + padding-top: 5px; + display: flex; +} + @media (max-width: 1280px) { :root { --side-offset: 3rem; @@ -220,7 +252,18 @@ a { } /* Modal */ - +.detail_modal { + width: 400px; + height: auto; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border: 0.13rem solid var(--color-button-border); + z-index: 101; + background-color: var(--color-background); + border-radius: var(--border-radius-large); +} .popup__top { top: calc(var(--header-top-offset) + 65px); right: var(--side-offset); @@ -551,6 +594,8 @@ body.order-relevance #order-relevance { /* Control - color */ body.download-pdf #download-pdf, body.download-svg #download-svg, +body.layout-comfortable #layout-comfortable, +body.layout-compact #layout-compact, body.dark #color-scheme-dark, body.light #color-scheme-light, body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { @@ -571,7 +616,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { /* Grid */ -.grid { +.layout-comfortable .grid { --grid-width: 13rem; display: grid; @@ -580,6 +625,18 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { margin: 0 0 1.5rem; } +.layout-compact .grid { + --grid-width: 8rem; + + display: grid; + gap: 0.55rem; + grid-template-columns: repeat(auto-fill, minmax(var(--grid-width), 1fr)); + margin: 0 0 1.5rem; +} + +.grid-top-padding { + margin-top: 0.1rem; +} .grid-item--if-empty { display: flex; grid-column: 1 / span 2; @@ -613,14 +670,18 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { overflow: hidden; } -.grid-item__row { +.layout-comfortable .grid-item__row { padding: 0 1rem; width: 100%; } -.grid-item__preview { - --preview-size: 3.5rem; +.layout-compact .grid-item__row { + padding: 0 0.5rem; + width: 100%; +} +.layout-comfortable .grid-item__preview { + --preview-size: 3.5rem; cursor: default; display: block; height: var(--preview-size); @@ -629,7 +690,17 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { width: var(--preview-size); } -.grid-item__title { +.layout-compact .grid-item__preview { + --preview-size: 3.5rem; + cursor: default; + display: block; + height: var(--preview-size); + margin: 0.5rem auto 0.5rem; + position: relative; + width: var(--preview-size); +} + +.layout-comfortable .grid-item__title { font-family: var(--font-family-text); font-size: 1.2rem; font-weight: 600; @@ -638,6 +709,15 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { padding-right: 1rem; } +.layout-compact .grid-item__title { + font-family: var(--font-family-text); + font-weight: 600; + width: 7.2rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .copy-svg::before { background-color: var(--color-background-transparent); background-size: 1.7rem 1.7rem; @@ -688,7 +768,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { height: 2rem; } -.grid-item__color { +.layout-comfortable .grid-item__color { border-top: 1px solid var(--color-grid-item-divider); color: #000; flex-grow: 2; @@ -700,11 +780,29 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { padding: 8px; position: relative; } + +.layout-compact .grid-item__color { + border-top: 1px solid var(--color-grid-item-divider); + color: #000; + flex-grow: 2; + font-family: var(--font-family-stylized); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 1px; + line-height: 1rem; + padding: 4px; + position: absolute; + transform: rotate(90deg); + width: 4rem; + left: -1.25rem; + top: 1.21rem; +} + .grid-item__color.contrast-light { color: #fff; } -.grid-item__button { +.layout-comfortable .grid-item__button { fill: var(--color-button-active); border-top: 1px solid var(--color-grid-item-divider); background-color: var(--color-background); @@ -717,13 +815,28 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { text-align: center; } +.layout-compact .grid-item__button { + fill: var(--color-button-active); + border-top: 1px solid var(--color-grid-item-divider); + background-color: var(--color-background); + flex-grow: 1; + font-family: var(--font-family-stylized); + font-size: 0.75rem; + font-weight: 600; + outline: none; + padding: 8px 4px; + text-align: center; +} + .grid-item__button svg { height: 1rem; pointer-events: none; } .grid-item__button:focus, -.grid-item__button:hover { +.grid-item__button:hover, +.detail-button:focus, +.detail-button:hover { fill: var(--color-button-text-hover); background: var(--color-button-hover); } diff --git a/scripts/removed-icons.js b/scripts/removed-icons.js new file mode 100644 index 00000000..19a0a893 --- /dev/null +++ b/scripts/removed-icons.js @@ -0,0 +1,314 @@ +module.exports = [ + { + title: 'Fedora', + hex: '294172', + issue: 'https://github.com/simple-icons/simple-icons/pull/6892', + path: '', + }, + { + title: 'Koding', + hex: '00B057', + issue: 'https://github.com/simple-icons/simple-icons/issues/4129', + path: 'M.8 0H23v6H1V0zm0 9H18v6H.7V9zm0 9H23v6H1v-6z', + }, + { + title: 'Material-UI', + hex: '0081CB', + issue: 'https://github.com/simple-icons/simple-icons/pull/6902', + path: 'M0 2.475v10.39l3 1.733V7.67l6 3.465 6-3.465v3.465l-6 3.463v3.464l6 3.463 9-5.195V9.402l-3 1.733v3.463l-6 3.464-3-1.732 6-3.465V2.475L9 7.67 0 2.475zm24 0l-3 1.73V7.67l3-1.732V2.474Z', + }, + { + title: 'PJSIP', + hex: 'F86001', + issue: 'https://github.com/simple-icons/simple-icons/pull/4910', + path: 'M5.272 20.562H10.2l2.657 2.657c.873.874 2.114 1.039 2.782.371l7.951-7.951c.668-.668.503-1.909-.37-2.782L11.142.781C10.27-.093 9.029-.258 8.36.41L.41 8.36c-.668.668-.503 1.909.37 2.782l4.492 4.492zm2.142-2.142v-3.768l-.88-.88h.016l-2.507-2.507c-.873-.873-1.039-2.114-.371-2.782l4.811-4.811c.668-.668 1.909-.502 2.782.371l8.692 8.692c.873.873 1.039 2.114.371 2.782l-4.811 4.811c-.438.438-1.12.511-1.786.269a1.218 3.063 25.325 00.557-2.845 1.218 3.063 25.325 00-1.557.033 1.218 3.063 25.325 00-.931 1.252l-.618-.617zM5.172 11.24a1.628 1.628 0 002.302 0 1.628 1.628 0 000-2.302 1.628 1.628 0 00-2.303 0 1.628 1.628 0 000 2.302z', + }, + { + title: 'SaltStack', + hex: '00EACE', + issue: 'https://github.com/simple-icons/simple-icons/pull/6891', + path: 'M6.396 0L1.05.002v5.346h5.347V0zm5.94 2.697c-1.033 0-1.959.1-2.791.291v3.783c.645-.374 1.471-.568 2.5-.568 1.001 0 1.838.17 2.514.508 1.01.512 1.555 1.375 1.629 2.59h4.056c-.073-2.147-.874-3.783-2.394-4.912-1.522-1.127-3.36-1.692-5.514-1.692zM4.496 8.51c-.01.16-.023.322-.023.488 0 1.982.679 3.438 2.04 4.371.806.558 2.281 1.072 4.43 1.547l2.186.482c1.28.274 2.215.589 2.805.946.59.365.884.882.884 1.549 0 1.142-.603 1.922-1.806 2.341-.635.22-1.458.33-2.475.33-1.697 0-2.896-.417-3.596-1.248-.382-.457-.638-1.147-.767-2.07h-4.03c0 2.102.762 3.754 2.286 4.955C7.953 23.402 10.042 24 12.7 24c2.603 0 4.619-.609 6.045-1.828 1.427-1.22 2.14-2.751 2.14-4.596 0-1.8-.601-3.173-1.804-4.125-.776-.611-1.94-1.102-3.494-1.467l-3.543-.836c-1.367-.319-2.264-.596-2.686-.835-.655-.356-.982-.894-.982-1.616 0-.065.017-.124.021-.187H4.496zM21.92 21.844a1.077 1.077 0 000 2.152 1.077 1.077 0 000-2.152zm-.014.177a.898.898 0 01.014 0 .898.898 0 010 1.793.898.898 0 01-.014-1.793zm-.42.258v1.272h.221v-.49h.248l.256.49h.234v-.01l-.285-.531a.392.392 0 00.174-.133.356.356 0 00.06-.213.42.42 0 00-.033-.166.31.31 0 00-.088-.121.4.4 0 00-.144-.074.695.695 0 00-.195-.024h-.448zm.221.178h.227a.338.338 0 01.107.016.174.174 0 01.117.109.266.266 0 010 .176.175.175 0 01-.047.066.21.21 0 01-.072.045.314.314 0 01-.105.016h-.227v-.428z', + }, + { + title: 'Skyliner', + hex: '2FCEA0', + issue: 'https://github.com/simple-icons/simple-icons/pull/6890', + path: 'M7.961 17.563c-.182-.037-.366.044-.461.203-.475 1.02-1.576 1.592-2.684 1.395-.203-1.108.373-2.213 1.397-2.681.204-.125.271-.392.146-.597-.067-.111-.182-.188-.311-.205-1.577-.297-3.193.262-4.252 1.469C.545 18.865.074 21.03.5 23.113c.031.185.175.329.359.359.498.081 1.002.12 1.508.12 1.834.102 3.625-.581 4.931-1.873.89-1.054 1.259-2.452 1.007-3.808-.021-.187-.161-.337-.345-.375l.001.027zM23.778.203c-.171-.169-.522-.089-.522-.089C22.621.04 21.98.003 21.339.001c-4.154-.043-8.153 1.576-11.106 4.497-.36.362-.7.742-1.02 1.139-1.402-.65-3.008-.709-4.455-.165-2.287.984-3.623 3.787-4.729 6.671-.087.224.025.476.249.562.144.055.304.031.425-.064 1.566-1.163 3.618-1.445 5.44-.749L5.6 13.856c-.05.184.026.377.187.479 1.466 1.096 2.767 2.395 3.863 3.857.103.163.298.239.482.188l1.963-.539c.719 1.826.436 3.893-.749 5.456-.148.188-.116.463.071.61.121.096.285.12.428.064 2.883-1.109 5.686-2.443 6.665-4.722.544-1.446.487-3.049-.161-4.451.395-.326.772-.672 1.133-1.036 3.381-3.44 5-8.241 4.392-13.026 0 0 .076-.352-.096-.524V.203zM21.339.87c.563 0 1.127.029 1.688.088.079.771.103 1.548.07 2.322-.611-.066-1.184-.34-1.623-.771-.438-.437-.713-1.009-.777-1.623.209-.011.422-.018.636-.018l.006.002zM10.846 5.112C13.262 2.716 16.438 1.24 19.828.94c.07.677.33 1.318.749 1.855l-2.698 2.697c-1.529-1.203-3.742-.939-4.946.59-1.005 1.278-1.005 3.078 0 4.356l-3.147 3.147c-.811-.785-1.689-1.498-2.626-2.131.662-2.394 1.932-4.58 3.686-6.342zm7.524 3.159c.001 1.469-1.188 2.66-2.657 2.66-1.469.002-2.659-1.188-2.66-2.656 0-1.47 1.189-2.66 2.657-2.661h.003c1.467 0 2.656 1.19 2.657 2.657zM1.314 11.269c.941-2.254 2.09-4.268 3.779-4.994 1.154-.428 2.428-.396 3.559.09C7.639 7.78 6.871 9.36 6.387 11.033c-1.645-.667-3.498-.581-5.074.233l.001.003zm8.891 6.19c-1.074-1.37-2.311-2.604-3.683-3.677l.395-1.434c1.845 1.275 3.444 2.874 4.722 4.718l-1.434.393zm7.508 1.425c-.727 1.698-2.737 2.848-4.989 3.789.811-1.578.893-3.432.225-5.074 1.677-.488 3.259-1.26 4.679-2.278.484 1.134.515 2.412.083 3.566l.002-.003zm-5.186-2.06c-.629-.937-1.34-1.816-2.123-2.628l3.147-3.148c1.528 1.203 3.743.939 4.945-.59 1.006-1.278 1.006-3.078 0-4.356l2.698-2.698c.535.418 1.177.677 1.85.75-.299 3.387-1.772 6.563-4.166 8.979-1.763 1.754-3.947 3.022-6.343 3.684l-.008.007z', + }, + { + title: 'Adobe PhoneGap', + hex: '27A1C5', + issue: 'https://github.com/simple-icons/simple-icons/pull/5245', + path: 'M7.463 15.549l-.856.061c0 .17.008.309.008.41.023 1.063.624 1.287 1.126 1.287.069 0 .115-.008.115-.008h.016l1.426-.139c.054-.17.062-.293.062-.293s-.193-8.983-.24-10.116a1.215 1.215 0 0 0-.184-.617 92.108 92.108 0 0 1-1.35-.108l-.162-.008c-.347 0-.609.093-.778.27-.255.27-.232.687-.232.687v.015c0 .015.008.254.016.64.694.039 1.203.07 1.203.07s.794.169.832.986c.039.887.031 5.876.031 5.876s.093.81-1.033.987zm-2.737.193l-1.434.107s-1.18.162-1.211-1.133c-.015-.956-.139-6.361-.139-6.361s-.085-1.003 1.134-.918c.362.023.91.054 1.495.093-.015-.895-.03-1.673-.038-2.275a60.468 60.468 0 0 1-2.005-.17C.924 4.909 1.025 6.259 1.025 6.259s.192 9.923.231 11.134c.046 1.45 1.604 1.21 1.604 1.21l1.927-.208c-.023-.717-.038-1.627-.061-2.652zM21.889 3.443c-.069-1.858-1.704-2.251-1.704-2.251S14.525.336 12.051.027c-2.483-.308-2.329 2.09-2.329 2.09s.563 17.518.625 19.685c.07 2.583 2.475 2.174 2.475 2.174l8.528-1.472c1.55-.309 1.627-2.244 1.627-2.244S21.974 5.463 21.889 3.443zm-1.904 14.874l-6.338.655s-1.843.278-1.89-1.958c-.03-1.65-.393-11.119-.393-11.119S11.241 4.16 13.138 4.3c1.935.147 6.585.494 6.585.494s1.241.293 1.295 1.711c.062 1.542.594 10.101.594 10.101s.139 1.411-1.627 1.712zm-6.377.324l2.445-.255c-.116-2.49-.548-12.16-.61-13.563V4.8c-.894-.07-1.742-.13-2.336-.177-.062-.008-.131-.008-.193-.008-.408 0-.717.108-.917.324-.34.355-.3.91-.3.918v.007c0 .008 0 .062.007.147.994.085 1.742.154 1.742.154s1.072.239 1.118 1.403c.047 1.265.355 8.112.355 8.112s.123 1.156-1.403 1.403l-1.419.139c.1 1.164.779 1.419 1.35 1.419.084 0 .138-.008.138-.008.016.008.023.008.023.008zm-3.732-1.195l-1.974.185s-1.596.23-1.626-1.604c-.024-1.357-.186-9.03-.186-9.03S5.983 5.58 7.617 5.696c.478.03 1.164.092 1.89.146-.047-1.457-.086-2.621-.101-3.23-.956-.093-1.874-.186-2.537-.263-2.159-.246-2.028 1.666-2.028 1.666s.255 14.08.309 15.806c.061 2.06 2.159 1.728 2.159 1.728l2.683-.34a691.29 691.29 0 0 0-.116-3.762Z', + }, + { + title: 'Automatic', + hex: '7D8084', + issue: 'https://github.com/simple-icons/simple-icons/pull/3982', + path: 'M12 6.768v-1.235c-.485.033-.754.293-.99.71L5.87 16.72h2.464l-.753-.96.654-1.363.005.007L12 6.774v-.006zM10.526 13.123h2.946L12 10.076M8.233 14.416h.017l-.01-.013M13.473 13.123v.002M21.496 5.066L13.26.308c-.693-.4-1.827-.4-2.52 0L2.504 5.066c-.693.398-1.26 1.38-1.26 2.182v9.507c0 .802.567 1.782 1.26 2.18l8.236 4.757c.693.4 1.826.4 2.52 0l8.235-4.768c.692-.39 1.26-1.38 1.26-2.174V7.246c0-.8-.567-1.78-1.26-2.18zm-6.066 12.05l-.687-1.384h-5.5l-.673 1.384H5.287l5.396-11.033c.305-.607.777-.9 1.317-.9s1.034.328 1.316.89l5.396 11.043H15.43zM12 6.77V9.244l2.518 5.173H8.25l.758.94h5.972l.674 1.35h2.474l-1.708-.99v.04L12 6.77', + }, + { + title: 'Autotask', + hex: 'E51937', + issue: 'https://github.com/simple-icons/simple-icons/pull/5250', + path: 'M17.93 11.626l2.782 6.988h-4.298l-1.825-4.736-9.885 6.667L1 12.6h.815l4.39 3.418 7.61-4.148-1.085-2.82-1.168 2.481-4.938 2.716 3.553-9.342h5.077l2.022 5.08L24 6.32V0H0v24h24V7.532z', + }, + { + title: 'Aventrix', + hex: '0099DD', + issue: 'https://github.com/simple-icons/simple-icons/pull/5249', + path: 'M12 24C5.372 24 0 18.628 0 12S5.372 0 12 0s12 5.372 12 12-5.372 12-12 12zm5.371-8.138c-.23.161-.644.322-1.081.322-.46 0-.805-.184-.805-.851v-5.011c0-3.149-1.403-4.321-4.139-4.321-1.517 0-2.875.367-3.656.827-.322.529-.391 1.425-.23 2a6.782 6.782 0 0 1 3.518-1.012c1.793 0 2.53.805 2.53 2.713v.598c-.667-.275-1.541-.367-2.299-.367-2.599 0-4.599 1.103-4.599 3.793 0 2.506 1.724 3.448 3.702 3.448 1.518 0 2.575-.483 3.242-1.357h.092c.184.851.782 1.357 1.816 1.357h.009c.557 0 1.077-.154 1.522-.421l-.013.007c.299-.414.437-1.126.391-1.724zm-6.554.321c-1.241 0-2.207-.529-2.207-1.724 0-1.219.989-2.069 2.897-2.069a5.76 5.76 0 0 1 2 .345v2.253c-.598.874-1.702 1.195-2.69 1.195z', + }, + { + title: 'Bancontact', + hex: '005498', + path: '', + issue: 'https://github.com/simple-icons/simple-icons/pull/5264', + }, + { + title: 'Brand.ai', + hex: '0AA0FF', + issue: 'https://github.com/simple-icons/simple-icons/pull/4365', + path: 'M23.956 11.2626C23.578 5.007 18.4025.0485 12.061.0095h-.142c-2.2398.016-4.3356.64-6.1245 1.7239A12.0293 12.0293 0 001.747 5.766C.7599 7.381.1499 9.2527.023 11.2556c-.015.247-.023.494-.023.7469 0 .25.01.5.025.746.123 2.0028.734 3.8726 1.7229 5.4895.9999 1.6478 2.3838 3.0297 4.0236 4.0326 1.7979 1.074 3.8967 1.7049 6.1295 1.7199h.18c6.3425-.043 11.497-4.9896 11.889-11.239.014-.24.03-.496.03-.735s0-.495-.016-.734l-.027-.022zm-11.955 4.3796v3.8297c.096 2.3398-.57 2.7297-1.3699 2.7657-.034 0-.066.003-.1.004-4.5556-.6449-8.1573-4.2566-8.7832-8.8222-.066-.464-.1-.938-.1-1.4199 0-.48.034-.953.1-1.4179.6249-4.5596 4.2176-8.1693 8.7692-8.8192l.115.01c.8.043 1.4649.43 1.3699 2.7637v3.8277c-.01 1.5729.895 3.0717 1.8568 3.6397-.9619.56-1.8678 1.8748-1.8578 3.6337z', + }, + { + title: 'CEVO', + hex: '1EABE2', + issue: 'https://github.com/simple-icons/simple-icons/pull/4509', + path: 'M3.5 6h12l6 10.3L24 12 18 1.6H6L3.5 6zm-.9 1.5L0 12l6 10.4h12l2.6-4.5-2.5-4.3-2.6 4.5h-7L5 12l2.6-4.5h-5z', + }, + { + title: 'ComproPago', + hex: '00AAEF', + issue: 'https://github.com/simple-icons/simple-icons/pull/5270', + path: 'M18.104 3.07a5.896 5.896 0 0 0-4.183 1.738l-9.247 9.247c-.587.587-.587 1.526 0 2.084.588.587 1.527.587 2.084 0l.089-.088.822-.822 6.956-6.957 1.35-1.35.089-.088a2.905 2.905 0 0 1 2.084-.852 2.905 2.905 0 0 1 2.935 2.936 2.91 2.91 0 0 1-.851 2.084l-8.894 8.923c1.145 1.145 2.994 1.145 4.168.03l6.751-6.752c2.32-2.348 2.319-6.076.03-8.395a5.896 5.896 0 0 0-4.183-1.739zm-7.489.142a3.017 3.017 0 0 0-2.095.833l-6.78 6.78a5.9 5.9 0 0 0 0 8.366 5.9 5.9 0 0 0 8.365 0l9.246-9.246c.587-.587.587-1.526 0-2.084-.587-.587-1.526-.587-2.084 0l-.088.088-.822.822-6.986 6.957-1.438 1.438a2.905 2.905 0 0 1-2.084.851 2.905 2.905 0 0 1-2.936-2.935c0-.793.294-1.526.852-2.084l8.923-8.924a2.939 2.939 0 0 0-2.073-.862z', + }, + { + title: 'Everplaces', + hex: 'FA4B32', + path: 'M10.839 23.972C4.76 23.388 0 18.257 0 12.028c0-6.623 5.377-12 12-12s12 5.377 12 12c0 6.23-4.76 11.359-10.839 11.943v-7.046c2.22-.525 3.87-2.521 3.87-4.897 0-2.778-2.253-5.033-5.031-5.033S6.968 9.25 6.968 12.028c0 2.377 1.653 4.372 3.87 4.897l.001 7.047zm-.388-14.655c.642 0 1.162.521 1.162 1.162 0 .641-.521 1.162-1.162 1.162-.641 0-1.16-.521-1.16-1.162 0-.641.52-1.161 1.16-1.162z', + issue: 'https://github.com/simple-icons/simple-icons/pull/5366', + }, + { + title: 'EVRY', + hex: '063A54', + issue: 'https://github.com/simple-icons/simple-icons/pull/4040', + path: 'M.443 12.919c.102.255.113.426.072.692-.031.202-.068.404-.108.605-.035.174-.117.55.003.694.117.139.35.131.622.098.302-.037 1.81-.342 3.397-.997.215-.093.435-.205.622-.345.431-.324.5-1.005.5-1.005.011-.13.009-.316-.164-.413-.126-.07-.301-.026-.562.043-.433.116-1.502.519-1.873.628-.15.044-.447.114-.561-.027-.19-.234.082-.969.245-1.378.163-.409.419-.738 1.205-.96.289-.082.762-.229.954-.293.211-.071.489-.207.607-.675.135-.534-.278-.616-.655-.718-.539-.147-.878-.165-.641-.679.097-.21.187-.303.397-.358.214-.056 2.029-.338 2.751-.467.405-.072.542-.286.711-.631.365-.746-.093-.794-.462-.761-.836.076-2.178.315-2.753.397-.306.044-.102-.47-.46-.494-.704-.049-1.302.243-1.541.425-.226.172-.334.703-.334.703l-.697 2.368c-.06.273-.146.543-.343.659-.479.283-1.457.302-1.37 1.34 0 0 .019.51.437 1.551zm6.318-4.424c.279-.047.654-.115.756.586.031.212.032 2.661.032 2.661s.269-.252 1.094-1.526c.626-.965 1.317-2.211 1.577-2.648.152-.256.433-.522.918-.165.541.398.553.685.315 1.093-.244.419-.9 1.486-1.827 2.772-.842 1.168-1.245 1.631-1.599 2.016-.354.385-.826.83-1.319.762-.654-.091-.604-1.198-.63-1.515-.026-.317-.154-2.832-.066-3.419.034-.228.025-.496.749-.618zm8.845.065c.302.161-.045.855-.626 1.277-.374.272-1.014.679-1.672.679a6.206 6.206 0 0 1 1.017-1.298c.47-.461 1.018-.799 1.281-.658zm8.17-.153c.291-.373.349-.596-.133-1.061-.433-.417-.723-.171-.934.045-.035.042-1.016 1.001-2.049 2.17-.804.91-1.499 1.756-1.499 1.756s-.025-.57.062-1.286c.049-.408.186-1.201.226-1.453.204-1.274-.593-1.325-.89-1.343-.312-.019-.461.145-.554.533-.085.356-.55 2.311-.365 4.325.033.363.105.737.112.761l-.188.257c-1.749-.485-2.946-1.664-2.946-1.664s.574-.165 1.204-.543c.501-.3 1.465-1.043 1.363-2.353-.087-1.112-1.271-1.62-1.707-1.529-.397.083-1.091.558-1.747 1.14-.044-.304-.052-.639-.368-.676-.232-.027-.501.082-.696.182a1.116 1.116 0 0 0-.501.473l-.736 1.665c-.024.059-.072.072-.11.08-.394.09-.521.371-.549.449 0 0-.165.347.126.661-.146.385-.533 1.282-.533 1.282-.48 1.101-.449 1.483-.277 1.717.087.119.393.291.762.351.278.046.491-.119.723-.482.343-.537 1.032-1.953 1.032-1.953s1.37 1.474 4.121 2.443c0 0-1.455 1.973-1.665 3.064 0 0-.108.715.872.713.246 0 .617-.058.886-.221a.475.475 0 0 0 .223-.281.216.216 0 0 0-.021-.153c-.027-.047-.069-.073-.101-.104-.05-.049-.043-.113-.016-.187.539-1.544 2.732-4.169 3.197-4.738 1.233-1.507 3.512-3.854 3.673-4.041z', + }, + { + title: 'FedRAMP', + hex: '112E51', + path: 'M1.886 3.412A1.85 1.85 0 000 5.27v15.319h3.922v-6.094h4.934V10.66H3.922V7.336h14.595a1.67 1.67 0 010 3.324h-6.844a1.431 1.431 0 00-1.298 1.325v8.601h3.919V14.54h2.168l3.138 6.047h4.378l-3.46-6.657a5.442 5.442 0 00-2.001-10.517z', + issue: 'https://github.com/simple-icons/simple-icons/pull/4046', + }, + { + title: 'Gauges', + hex: '2FA66A', + issue: 'https://github.com/simple-icons/simple-icons/pull/5748', + path: 'M12.6 12.635l-1.125-.053c-.945-.033-1.197-.083-1.197-.435 0-.135.1-.318.303-.42.167.036.337.053.507.053 2.415 0 3.63-1.17 3.63-2.98 0-.3-.074-.57-.225-.735h.96v-2.01H12.6c-.472-.115-.892-.2-1.465-.2-2.543 0-3.804 1.474-3.804 3.18 0 1.07.506 1.84 1.26 2.242-.584.234-1.022.87-1.022 1.54 0 .586.322 1.054.81 1.287-.64.336-1.215 1.155-1.215 1.94 0 1.66 1.35 2.476 3.64 2.476 2.873 0 4.695-1.604 4.695-3.41h-.018c0-1.674-1.078-2.41-2.88-2.475zm-1.462-4.78c.895 0 1.342.48 1.342 1.193 0 .71-.5 1.14-1.325 1.14-.893 0-1.342-.445-1.342-1.173 0-.68.483-1.16 1.325-1.16zm2.008 7.554c0 .63-.612 1.113-1.82 1.113-.944 0-1.5-.405-1.5-1.002 0-.353.226-.708.6-.997.09.015.226 0 .33.015l1.35.032c.796.033 1.08.388 1.08.84h-.04zM17.637 10.854v.002c-.99 0-1.824.834-1.824 1.845 0 1.01.834 1.823 1.824 1.823 1.01 0 1.846-.814 1.846-1.824 0-1.01-.837-1.846-1.846-1.846zM12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 22.335C6.293 22.335 1.665 17.708 1.665 12 1.665 6.293 6.293 1.665 12 1.665c5.708 0 10.335 4.628 10.335 10.335 0 5.708-4.627 10.335-10.335 10.335z', + }, + { + title: 'GOV.UK', + hex: '005EA5', + issue: 'https://github.com/simple-icons/simple-icons/pull/4060', + path: 'M2.4 13.031c.261-.64-.04-1.374-.682-1.638-.631-.262-1.362.049-1.623.688-.266.637.038 1.363.668 1.623.632.267 1.368-.037 1.623-.673m.858-3.244c.256-.636-.045-1.37-.691-1.639-.631-.258-1.367.053-1.639.687-.27.638.03 1.369.662 1.629.646.266 1.367-.039 1.639-.677m1.218-1.095c.645.264 1.367-.041 1.637-.675.256-.639-.045-1.375-.676-1.639-.632-.26-1.368.049-1.639.686-.271.638.046 1.367.678 1.626m3.156 1.053c.646.256 1.368-.045 1.64-.676.255-.646-.046-1.383-.691-1.639-.634-.271-1.37.046-1.626.676-.27.632.045 1.368.677 1.625M21.6 13.006c.271.631.993.933 1.639.661.632-.27.933-.992.661-1.639-.271-.646-1.008-.947-1.639-.676-.646.256-.945.992-.676 1.639m.752-2.57c.631-.257.931-.993.676-1.64-.271-.632-1.008-.946-1.639-.677-.646.271-.947.992-.676 1.639.256.632.993.933 1.624.678m-2.78-1.729c.631-.26.932-.992.672-1.631-.27-.646-1.001-.947-1.639-.686-.632.271-.937.992-.67 1.639.27.631 1.007.932 1.638.676m-3.412.858c.631-.271.932-1.007.677-1.639-.271-.646-.993-.947-1.64-.691-.631.271-.932 1.008-.661 1.639.271.632.993.932 1.64.662M9.425 4.935l.093 2.399 1.752-.923c.035.039.079.078.12.107-.181.718-.621 1.914-.896 2.575-.335.812.051 1.744.862 2.078.812.331 1.747-.06 2.083-.872.241-.57.121-1.188-.24-1.623-.391-.678-.781-1.533-.992-2.195.061-.045.105-.105.15-.15l1.895.977.09-2.39-1.969.632c-.016-.031-.031-.061-.045-.075l.766-2.181-2.33-.074.707 2.148c-.061.031-.105.076-.15.137l-1.896-.57zm11.896 9.109c.16.883.188 1.284-.015 1.859-.285-.286-.54-.807-.749-1.594l-.872 2.79c.52-.346.915-.565 1.364-.571-.815 1.713-1.819 2.146-2.461 2.021-.787-.158-1.15-.867-1.012-1.466.175-.842 1.052-1.052 1.448-.067.792-1.566-.52-2.078-1.368-1.624 1.313-1.28 1.468-2.426.426-3.836-1.464 1.106-1.49 2.21-.851 3.772-.842-.985-2.18-.466-1.713 1.113.627-.949 1.432-.346 1.298.565-.109.796-1.163 1.413-2.461 1.292-1.864-.165-1.954-1.457-1.983-2.525.451-.074 1.277.361 1.983 1.354l.286-2.962c-.767.782-1.474.946-2.24.962.271-.781 1.459-2.09 1.459-2.09l-3.729-.045s1.188 1.323 1.443 2.119c-.768-.014-1.459-.164-2.225-.961l.255 2.961c.706-.991 1.534-1.412 1.984-1.338-.045 1.053-.15 2.346-2.015 2.511-1.293.105-2.345-.526-2.449-1.323-.121-.901.691-1.503 1.307-.541.481-1.578-.856-2.104-1.699-1.127.662-1.564.647-2.676-.811-3.789-1.053 1.398-.902 2.541.405 3.85-.842-.467-2.165.029-1.383 1.607.405-.992 1.278-.766 1.458.076.12.601-.24 1.308-1.021 1.457-.646.121-1.639-.315-2.451-2.044.451.016.842.241 1.354.587l-.859-2.783c-.209.781-.48 1.295-.766 1.578-.186-.57-.166-.977.014-1.859l-1.803.613c.922 1.264 1.857 3.021 2.59 6.104 2.275-.376 6.157-.603 8.509-.603 2.345.015 6.229.285 8.494.691.767-3.081 1.713-4.825 2.646-6.073l-1.773-.646-.014-.015z', + }, + { + title: 'Adobe Typekit', + hex: '87EC00', + issue: 'https://github.com/simple-icons/simple-icons/pull/2943', + path: 'M0 0v24h24V0H0zm1 1.026h22v21.948H1V1.026zM7.165 7.983H4.394c-.082 0-.115-.033-.099-.132l.198-1.385c.016-.083.049-.116.132-.116h6.926c.099 0 .132.033.149.132l.132 1.369c.016.099-.033.132-.116.132H8.962v9.235c0 .083-.033.132-.132.132H7.296c-.098 0-.131-.033-.131-.132V7.983zM14.718 12.749l2.523-3.414c.066-.082.082-.115.165-.115h1.682c.099 0 .132.066.066.148-.396.511-2.21 2.754-2.804 3.48a.108.108 0 0 0 0 .099l3.2 4.271c.033.066.016.132-.083.132h-1.946c-.099 0-.132-.033-.165-.099a158.661 158.661 0 0 1-2.638-3.678v3.662c0 .082-.017.115-.116.115h-1.55c-.116 0-.132-.033-.132-.132V6.449c0-.049.016-.099.115-.099h1.567c.066 0 .116.033.116.116v6.283z', + }, + { + title: 'Greenkeeper', + hex: '00C775', + issue: 'https://github.com/simple-icons/simple-icons/pull/2943', + path: 'M12.04 22.547a2.206 2.206 0 0 1-2.014-3.108l-2.699-1.8a2.201 2.201 0 1 1 .42-.626l2.702 1.8c.082-.085.172-.164.267-.236l-4.33-8.659a2.209 2.209 0 1 1 .672-.343l4.33 8.659c.077-.024.156-.044.235-.059v-4.128a2.206 2.206 0 0 1 0-4.333v-3.89a2.206 2.206 0 1 1 .755.014v3.866a2.205 2.205 0 0 1 0 4.359v4.097c.082.013.164.03.244.052l4.32-8.638a2.202 2.202 0 1 1 .672.344l-4.309 8.617c.1.07.194.148.28.233l2.616-1.776a2.209 2.209 0 1 1 .44.613l-2.615 1.777a2.206 2.206 0 0 1-1.986 3.165zM12 24C5.373 24 0 18.628 0 12a12 12 0 0 1 3.515-8.485c4.686-4.686 12.284-4.686 16.97 0s4.687 12.284 0 16.97A11.921 11.921 0 0 1 12 24zM12 .755C5.79.755.755 5.79.755 12c0 2.982 1.185 5.843 3.294 7.951 4.376 4.407 11.495 4.433 15.902.057s4.432-11.496.057-15.903A11.173 11.173 0 0 0 12 .755z', + }, + { + title: 'Geeklist', + hex: '8CC63F', + issue: 'https://github.com/simple-icons/simple-icons/pull/849', + path: 'm 13.65,10.863 c 0.324,0.354 0.76,0.53 1.31,0.53 0.55,0 0.972,-0.172 1.267,-0.516 0.297,-0.346 0.445,-0.81 0.445,-1.426 0,-0.494 -0.158,-0.914 -0.477,-1.26 -0.318,-0.344 -0.73,-0.51 -1.236,-0.51 -0.53,0 -0.96,0.166 -1.295,0.51 -0.267,0.27 -0.426,0.6 -0.48,0.976 0.014,0.215 0.013,0.43 0,0.645 V 9.785 c 0.05,0.435 0.206,0.795 0.465,1.08 z m 2.226,4.825 c -0.26,0 -0.646,0.03 -1.155,0.09 -0.514,0.06 -0.9,0.09 -1.157,0.09 -0.656,0 -1.177,-0.09 -1.563,-0.284 v 0.054 c -0.386,0.195 -0.906,0.29 -1.56,0.29 -0.26,0 -0.645,-0.028 -1.158,-0.103 -0.513,-0.06 -0.9,-0.09 -1.158,-0.09 -0.956,0 -1.434,0.284 -1.434,0.87 0,0.345 0.216,0.614 0.648,0.81 0.432,0.194 0.98,0.285 1.647,0.285 0.99,0 2.224,-0.495 3.03,-1.23 l 0.015,-0.015 c 0.807,0.734 1.992,1.245 2.986,1.245 0.666,0 1.215,-0.105 1.646,-0.3 0.432,-0.21 0.648,-0.48 0.648,-0.825 0,-0.587 -0.48,-0.887 -1.434,-0.887 z M 12,0 C 5.373,0 0,5.373 0,12 0,18.627 5.373,24 12,24 18.627,24 24,18.627 24,12 24,5.373 18.627,0 12,0 Z m 6.27,18.917 c -0.898,0.57 -1.978,0.854 -3.253,0.854 -1.05,0 -2.04,-0.208 -2.97,-0.644 -0.93,0.44 -1.944,0.666 -2.97,0.66 -1.26,0 -2.356,-0.285 -3.256,-0.855 -0.9,-0.57 -1.35,-1.35 -1.35,-2.353 0,-1.8 1.126,-2.716 3.376,-2.716 0.33,0 0.705,0.047 1.17,0.15 0.45,0.09 0.765,0.15 0.96,0.15 0.42,0 0.645,-0.12 0.645,-0.36 0,-0.134 -0.134,-0.283 -0.434,-0.404 -0.285,-0.12 -0.45,-0.194 -0.495,-0.194 l -0.39,0.06 c -0.27,0.03 -0.494,0.045 -0.66,0.045 -1.05,0 -1.92,-0.33 -2.61,-1.005 C 5.343,11.63 4.999,10.73 4.999,9.59 4.999,8.81 5.194,8.12 5.569,7.535 L 4.475,6.74 6.065,5.285 6.98,6.335 C 7.58,6.005 8.33,5.84 9.215,5.84 c 1.125,0 2.07,0.345 2.85,1.02 L 12,6.783 c 0.77,-0.675 1.72,-1.016 2.84,-1.016 0.89,0 1.633,0.165 2.23,0.5 l 0.906,-1.055 1.6,1.455 -1.096,0.803 c 0.39,0.58 0.586,1.266 0.586,2.055 0,1.13 -0.344,2.03 -1.02,2.708 -0.69,0.674 -1.545,1.012 -2.595,1.012 -0.164,0 -0.39,-0.015 -0.66,-0.045 l -0.39,-0.06 c -0.044,0 -0.194,0.067 -0.494,0.2 -0.285,0.132 -0.42,0.27 -0.42,0.41 0,0.246 0.21,0.37 0.645,0.37 0.196,0 0.512,-0.046 0.96,-0.14 0.45,-0.09 0.84,-0.134 1.156,-0.134 2.25,0 3.375,0.914 3.375,2.715 0.002,1.006 -0.448,1.788 -1.35,2.357 z M 12.498,12.563 C 12.324,12.448 12.158,12.321 12,12.185 c -0.156,0.138 -0.322,0.264 -0.498,0.376 0.177,0.074 0.345,0.17 0.498,0.288 0.154,-0.118 0.32,-0.213 0.498,-0.285 z M 10.803,9.467 c 0,-0.104 0.006,-0.196 0.012,-0.3 V 9.143 C 10.769,8.773 10.6,8.427 10.335,8.163 10.005,7.833 9.57,7.665 9.04,7.665 c -0.505,0 -0.917,0.173 -1.235,0.517 -0.317,0.346 -0.488,0.8 -0.476,1.27 0,0.614 0.146,1.08 0.443,1.424 0.295,0.346 0.72,0.526 1.268,0.526 0.548,0 0.986,-0.18 1.31,-0.525 0.26,-0.286 0.417,-0.646 0.468,-1.08 -0.01,-0.106 -0.015,-0.226 -0.015,-0.33 z', + }, + { + title: 'Gratipay', + hex: '663300', + issue: 'https://github.com/simple-icons/simple-icons/pull/849', + path: 'M24 12c0 6.629-5.37 12-12 12-6.627 0-12-5.373-12-12S5.373 0 12 0c6.63 0 12 5.369 12 12zm-7.119-4.523c-1.35-.891-2.634-.216-3.306.566-.252.291-.681.635-1.492.635-.811 0-1.241-.346-1.491-.635-.66-.781-1.95-1.455-3.301-.566-1.574 1.047-1.125 2.936-.659 3.48l5.46 7.393 5.46-7.393c.464-.545.93-2.434-.661-3.48h-.01z', + }, + { + title: 'Lanyrd', + hex: '3C80CA', + issue: 'https://github.com/simple-icons/simple-icons/issues/1569', + path: 'M10.814 23.586c-2.486.814-2.736.686-3.859-2.801l-2.753-8.519c-.653-2.018-2.654-7.455-2.991-8.498C.588 1.829.588 1.723 4.24.534c2.865-.938 2.979-.906 4.02 2.322.84 2.604 1.377 4.699 2.236 7.357l2.344 7.246L20.329 15c1.479-.488 1.973-.465 2.386 1.352l.305 1.373c.344 1.6-.463 2.006-1.317 2.283L10.814 23.58v.006z', + }, + { + title: 'Google Allo', + hex: 'ECB842', + issue: 'https://github.com/simple-icons/simple-icons/issues/1568', + path: 'M11.665.005c-.702.018-1.417.098-2.14.243C4.788 1.193 1.08 4.974.21 9.728c-1.36 7.406 4.096 14.256 11.16 14.256L22.227 24c.98 0 1.774-.793 1.774-1.774V12C24 5.26 18.445-.18 11.665.005zM12 6.135c3.238 0 5.862 2.626 5.862 5.865v5.61c0 .245-.293.367-.467.194l-1.46-1.46c-1.04.944-2.42 1.52-3.936 1.52-3.24 0-5.865-2.626-5.865-5.864 0-3.24 2.627-5.865 5.865-5.865z', + }, + { + title: 'iDEAL', + hex: 'CC0066', + path: '', + issue: 'https://github.com/simple-icons/simple-icons/pull/4577', + }, + { + title: 'Mathworks', + hex: '0076A8', + path: '', + issue: 'https://github.com/simple-icons/simple-icons/pull/5351', + }, + { + title: 'Yandex', + hex: 'FF0000', + path: '', + issue: 'https://github.com/simple-icons/simple-icons/pull/5428', + }, + { + title: 'Graphcool', + hex: '27AE60', + issue: 'https://github.com/simple-icons/simple-icons/pull/5602', + path: 'M21.138 7.929c-1.167-.657-2.633.2-2.868.348l-5.037 2.857c-.744-.591-1.804-.566-2.519.06-.715.625-.881 1.671-.395 2.488s1.486 1.168 2.376.836 1.416-1.252 1.25-2.187l5.023-2.851.032-.019c.33-.209 1.096-.521 1.454-.319.258.146.405.633.417 1.35h-.006v6.301c-.001.588-.314 1.131-.823 1.426l-7.222 4.172c-.51.293-1.137.293-1.646 0l-7.222-4.172c-.509-.295-.822-.838-.823-1.426v-8.34c.001-.588.314-1.131.823-1.425l6.536-3.772c.621.713 1.664.882 2.479.4.815-.48 1.172-1.475.848-2.363-.324-.89-1.236-1.421-2.169-1.266-.934.156-1.623.955-1.641 1.901L3.262 5.823c-.942.542-1.522 1.544-1.524 2.63v8.338c.001 1.086.579 2.088 1.519 2.631l7.221 4.172c.94.541 2.097.541 3.037 0l7.222-4.172c.938-.543 1.517-1.545 1.519-2.629v-6.062h.005c.034-1.422-.347-2.363-1.123-2.802z', + }, + { + title: 'HackHands', + hex: '00ACBD', + issue: 'https://github.com/simple-icons/simple-icons/pull/5693', + path: 'M5.3 17.63h6.35c.5 0 .89-.4.89-.9s-.4-.89-.9-.89H5.3c-.5 0-.89.4-.89.89 0 .5.4.9.9.9zM16.58 13.77c0-.5-.4-.9-.9-.9H6.54c-.5 0-.89.4-.89.9s.4.9.9.9h9.15c.5 0 .9-.4.9-.9zM18.44 10.8a.91.91 0 0 0-.89-.88H6.53c-.5 0-.89.39-.89.89s.4.89.9.89h11.01c.5 0 .89-.4.89-.9zM5.64 7.82c0 .5.4.89.9.89h9.5c.49 0 .88-.4.88-.9 0-.49-.4-.88-.89-.88h-9.5c-.5 0-.89.39-.89.89zM7.92 3.96H5.3c-.5 0-.89.4-.89.9s.4.89.9.89h2.64c.5 0 .9-.4.9-.9a.93.93 0 0 0-.93-.89zM22.87 20.8a.93.93 0 0 0-.94-.94H4.7c-.95 0-1.73-.8-1.73-1.74V3.57c0-.95.78-1.73 1.73-1.73h14.55c.95 0 1.74.76 1.74 1.73v11.8c0 .5.42.92.9.92.51 0 .93-.42.93-.92V3.57c0-1.97-1.6-3.57-3.57-3.57H4.7a3.57 3.57 0 0 0-3.57 3.57v14.55c0 1.97 1.6 3.57 3.57 3.57H20.4L22.87 24v-3.2z', + }, + { + title: 'Highly', + hex: 'FF3C00', + issue: 'https://github.com/simple-icons/simple-icons/pull/4243', + path: 'M10.2 20.4H13.799999999999999V24H10.2zM9 0H15V18H9z', + }, + { + title: 'HipChat', + hex: '0052CC', + issue: 'https://github.com/simple-icons/simple-icons/pull/5556', + path: 'M19.736 19.056s.103-.073.267-.198C22.46 16.958 24 14.203 24 11.139 24 5.424 18.627.787 12.003.787 5.377.787 0 5.424 0 11.139c0 5.717 5.371 10.356 11.998 10.356.847 0 1.694-.073 2.524-.228l.262-.045c1.683 1.092 4.139 1.99 6.288 1.99.665 0 .978-.546.552-1.104-.648-.795-1.541-2.068-1.888-3.052zm-1.462-4.526c-.716 1.069-2.934 2.889-6.254 2.889h-.046c-3.328 0-5.543-1.831-6.254-2.889a1.137 1.137 0 0 1-.273-.574.49.49 0 0 1 .447-.526c.008-.003.014-.003.021-.003.117.006.23.043.328.111a9.137 9.137 0 0 0 5.754 2.056 8.805 8.805 0 0 0 5.76-2.059.461.461 0 0 1 .313-.122c.267 0 .478.213.483.475a1.321 1.321 0 0 1-.268.643h-.011z', + }, + { + title: 'HockeyApp', + hex: '009EE1', + issue: 'https://github.com/simple-icons/simple-icons/pull/5038', + path: 'M21.794 15.002c.075-.057.181-.007.194.083.006.057.012.114.012.171C22 16.842 18.669 19 12 19c-6.669 0-10-2.158-10-3.737 0-.057.006-.115.013-.166a.12.12 0 0 1 .193-.082c1.656 1.19 4.919 2.209 9.794 2.209 4.881 0 8.144-1.019 9.794-2.222zM12 14.168c-5.406 0-8.988-1.229-10.738-2.649a.122.122 0 0 0-.187.039c-.094.178-.137.369-.137.56 0 1.75 3.687 4.087 11.062 4.087s11.063-2.33 11.063-4.087c0-.198-.044-.382-.138-.56a.122.122 0 0 0-.188-.039c-1.75 1.42-5.33 2.649-10.737 2.649zm12-5.73c0 2.018-4 4.711-12 4.711S0 10.456 0 8.438C0 6.42 4 5 12 5s12 1.42 12 3.438zm-3.5-.318c0-1.013-2.831-1.592-8.5-1.592-5.669 0-8.5.58-8.5 1.592s2.831 2.483 8.5 2.483c5.669 0 8.5-1.471 8.5-2.483z', + }, + { + title: 'Klout', + hex: 'E44600', + issue: 'https://github.com/simple-icons/simple-icons/pull/5280', + path: 'M0 2.673v14.72h16.17L24 21.327V2.673H0zm9.827 8.42h-1.17l-2.88 4.054H2.35l3.94-5.265-3.638-5.07h3.336l2.66 3.885h1.18v2.397zm8.407 4.053l-2.88-4.053h-1.966v4.053h-2.73V4.812h2.734v3.885h1.965l2.658-3.885h3.33l-3.636 5.07 3.94 5.265h-3.416z', + }, + { + title: 'LINE WEBTOON', + hex: '00D564', + issue: 'https://github.com/simple-icons/simple-icons/pull/5381', + path: 'M15.023 15.26c.695 0 1.014-.404 1.014-1.051 0-.551-.308-1.01-.984-1.01-.58 0-.912.404-.912 1.016 0 .543.32 1.045.882 1.045zM10.135 15.447c.764 0 1.113-.443 1.113-1.154 0-.604-.338-1.109-1.082-1.109-.637 0-1.002.445-1.002 1.115 0 .597.352 1.148.971 1.148zM24 10.201l-3.15.029.83-9.686L1.958 3.605l1.686 6.248H0l3.734 11.488 8.713-1.283v3.396l10.113-4.641L24 10.201zm-9.104-3.594c0-.049.039-.092.088-.094l1.879-.125.446-.029c.524-.035 1.634.063 1.634 1.236 0 .83-.619 1.184-.619 1.184s.75.189.707 1.092c0 1.602-1.943 1.389-1.943 1.389l-.225-.006-1.908-.053a.089.089 0 0 1-.086-.09l.027-4.504zm-3.675.243c0-.047.039-.09.088-.092l3.064-.203a.08.08 0 0 1 .087.08v.943c0 .049-.039.09-.087.092l-1.9.08a.094.094 0 0 0-.088.09l-.005.394a.083.083 0 0 0 .086.084l1.646-.066a.082.082 0 0 1 .086.084l-.02 1.012a.089.089 0 0 1-.089.086h-1.63a.089.089 0 0 0-.088.088v.416c0 .047.039.088.088.088l1.87.033a.09.09 0 0 1 .087.09v.951a.084.084 0 0 1-.087.084l-3.063-.123a.09.09 0 0 1-.087-.09l.042-4.121zm-6.01.312l.975-.064a.101.101 0 0 1 .105.08l.458 2.205c.01.047.027.047.039 0l.576-2.281a.132.132 0 0 1 .108-.09l.921-.061a.108.108 0 0 1 .109.078l.564 2.342c.012.047.029.047.041 0l.6-2.424a.131.131 0 0 1 .108-.092l.996-.064c.048-.004.077.031.065.078l-1.09 4.104a.113.113 0 0 1-.109.082l-1.121-.031a.12.12 0 0 1-.109-.086l-.535-1.965c-.012-.047-.033-.047-.045 0l-.522 1.934a.12.12 0 0 1-.11.082l-1.109-.031a.123.123 0 0 1-.108-.088l-.873-3.618c-.011-.047.019-.088.066-.09zm-.288 9.623v-3.561a.089.089 0 0 0-.087-.088l-1.252-.029a.095.095 0 0 1-.091-.09l-.046-1.125a.082.082 0 0 1 .083-.086l4.047.096c.048 0 .087.041.085.088l-.022 1.088a.093.093 0 0 1-.089.088l-1.139.004a.09.09 0 0 0-.087.088v3.447c0 .049-.039.09-.087.092l-1.227.07a.08.08 0 0 1-.088-.082zm2.834-2.379c0-1.918 1.321-2.482 2.416-2.482s2.339.73 2.339 2.316c0 1.9-1.383 2.482-2.416 2.482-1.033.001-2.339-.724-2.339-2.316zm5.139-.115c0-1.746 1.166-2.238 2.162-2.238s2.129.664 2.129 2.107c0 1.729-1.259 2.26-2.198 2.26s-2.093-.68-2.093-2.129zm7.259 1.711a.175.175 0 0 1-.139-.064l-1.187-1.631c-.029-.039-.053-.031-.053.018v1.67c0 .047-.039.09-.086.092l-1.052.061a.082.082 0 0 1-.087-.082l.039-3.842c0-.047.039-.086.088-.084l.881.02a.2.2 0 0 1 .137.074l1.293 1.902c.027.041.051.033.051-.014l.032-1.846a.087.087 0 0 1 .089-.086l.963.029c.047 0 .085.041.083.09l-.138 3.555a.097.097 0 0 1-.091.092l-.823.046zM16.258 8.23l.724-.014s.47.018.47-.434c0-.357-.411-.33-.411-.33l-.782.008a.09.09 0 0 0-.088.088v.598a.083.083 0 0 0 .087.084zM16.229 10.191h.99c.024 0 .35-.051.35-.404 0-.293-.229-.402-.441-.398l-.898.029a.089.089 0 0 0-.087.09v.596a.086.086 0 0 0 .086.087z', + }, + { + title: 'Livestream', + hex: 'CF202E', + issue: 'https://github.com/simple-icons/simple-icons/pull/4647', + path: 'M20.987 6.25l.041.002.039.006.04.011.039.015.038.02.039.022.035.03.035.029.037.045.046.045.03.045.044.045.075.119.029.06.029.075.03.074.031.074.028.074.029.09.029.09.03.09.031.089.029.104.028.104.031.105.03.104.029.104.029.104.03.12.03.118.029.135.015.12.029.134.03.134.017.135.028.149.015.148.015.149.031.149.015.149.016.148.015.165.015.164.015.163.015.165.015.164.016.179.015.343.016.179.015.179.015.18.015.18.015.193.015.193.015.193.016.195.015.193v.388l.016.209.015.209v.403l.015.208v.611l.015.419.015.625v1.269l.015.373.03.269.046.179.043.119.047.104.059.09.045.044.045.045.044.045.062.029.089.046.089.029.096.03.142.029.193.011.269-.016h.1v2.253l-.239.029-.566.026-.61-.029-.448-.067-.344-.089-.254-.089-.237-.119-.236-.15-.208-.184-.134-.134-.136-.149-.17-.269-.15-.313-.119-.342-.082-.403-.054-.456-.015-.508v-1.938l-.015-.418v-.865l-.015-.402v-.287l-.016-.199v-.397l-.015-.194v-.193l-.008-.193-.015-.194-.014-.179-.003-.18-.015-.179-.015-.183v-.178l-.015-.18-.017-.179-.012-.179-.014-.17-.017-.17-.015-.164-.015-.169-.015-.16-.014-.163-.015-.164-.017-.15-.015-.148-.016-.158-.015-.141-.015-.135-.044-.278-.016-.134-.015-.135-.03-.125-.026-.135-.029-.118-.03-.12-.031-.119-.034-.103-.029-.104-.025-.103-.045-.09-.029-.104-.029-.089-.022-.09-.029-.089-.031-.09-.03-.074-.029-.076-.029-.074-.03-.059-.03-.061-.029-.06-.044-.06-.03-.045-.036-.045-.031-.044-.041-.03-.028-.029-.046-.03-.028-.015-.046-.016-.049-.012-.044-.016-.03-.015h-.03 2.552zM.008 3.084l1.169.021 1.089.026.97.015.851.03.73.029.642.029.567.03.506.029.463.046.418.044.387.046.357.044.329.046.313.044.283.061.27.059.252.059.24.06.223.06.209.06.194.075.194.059.179.074.163.076.166.074.148.074.164.074.148.09.135.09.135.09.119.088.119.09.119.09.119.09.104.09.104.104.104.09.105.104.09.104.09.104.104.105.09.104.09.104.074.104.09.105.074.119.074.104.074.119.075.12.074.119.074.12.06.119.061.119.074.119.06.119.06.119.06.119.06.12.045.118.048.12.06.135.05.118.06.135.06.119.044.119.061.135.054.135.044.119.051.134.045.12.045.133.045.135.045.135.045.134.044.135.03.134.045.135.039.135.029.133.039.135.029.135.041.134.029.134.045.135.029.119.045.135v.014l.029.12.031.127.029.134.029.135.03.119.03.135.029.133.045.12.029.134.03.119.03.135.029.119.029.119.03.12.03.119.029.12.03.119.03.119.029.119.029.119.03.119.03.119.014.12.03.104.046.223.029.105.029.104.03.104.022.104.029.104.016.104.029.104.03.104.015.104.029.105.03.09.03.097.015.089.03.09.015.09.015.089.015.09.015.075.016.09.015.085.016.075.014.074.016.078.024.074.015.074.015.075.015.068.016.06.023.074.023.061.016.065.015.06.016.06.015.06.015.06.015.06.015.045.03.051.015.045.015.045.016.044.029.046.015.044.038.075.015.038.03.061.015.029.015.03.015.029.016.03.015.015.015.015.015.015.016.015.015.016.029.016.016.004.015.015h.03-7.027l-.051-.015-.057-.016-.057-.014-.06-.016-.06-.015h-.016l-.052-.024-.056-.015-.057-.031-.061-.03-.044-.029-.06-.03-.045-.029-.061-.03-.044-.045-.044-.045-.061-.045-.045-.045-.06-.044-.06-.06-.06-.056-.044-.06-.061-.054-.06-.045-.06-.06-.061-.06-.044-.06-.062-.005-.059-.06-.045-.068-.054-.065-.119-.148-.059-.075-.045-.074-.061-.09-.059-.074-.061-.09-.06-.075-.06-.088-.06-.09-.06-.09-.061-.09-.059-.09-.061-.09-.06-.089-.06-.104-.059-.09-.046-.104-.06-.105-.06-.104-.06-.105-.061-.104-.059-.104-.06-.104-.06-.104-.061-.104-.059-.104-.061-.104-.059-.104-.061-.119-.06-.12-.06-.119-.061-.12-.059-.119-.061-.119-.059-.119-.06-.119-.135-.028-.049-.126-.059-.123-.061-.123-.059-.125-.064-.125-.06-.127-.06-.119-.064-.119-.06-.119-.063-.119-.06-.119-.06-.15-.06-.134-.063-.119-.063-.12-.06-.134-.063-.119-.061-.135-.06-.119-.06-.135-.06-.134-.06-.134-.058-.134-.059-.135-.061-.119-.059-.134-.059-.133-.059-.135-.06-.135-.06-.134-.119-.268-.06-.149-.06-.12-.059-.134-.061-.12-.06-.119-.073-.118-.06-.135-.074-.12-.06-.118-.074-.12-.061-.119-.059-.12-.06-.119-.06-.119-.059-.137-.12-.239-.06-.119-.061-.119-.074-.119-.074-.119-.135-.229-.058-.119-.074-.11-.076-.12-.059-.112-.061-.104-.125-.208-.074-.106-.061-.103-.058-.105-.061-.089-.06-.105-.063-.104-.066-.09-.059-.09-.074-.09-.076-.088-.059-.089-.075-.09-.088-.117-.067-.076-.069-.078-.059-.074-.058-.1-.074-.074-.066-.06-.075-.069-.062-.065-.075-.081-.065-.06-.065-.06-.068-.058-.067-.053-.069-.045-.07-.045-.064-.059-.075-.046-.06-.044-.074-.044-.067-.03-.068-.03-.07-.03-.071-.03-.068-.031-.059-.023L0 3.088h.008z', + }, + { + title: 'Monogram', + hex: 'FDB22A', + issue: 'https://github.com/simple-icons/simple-icons/pull/5345', + path: 'M23.158 0v23.503c0 .451-.533.668-.83.338L12 12.38 3.301 2.73.842 0h22.316zM11.029 13.46L1.672 23.841c-.297.33-.83.111-.83-.338V0l10.187 13.46z', + }, + { + title: 'Periscope', + hex: '40A4C4', + issue: 'https://github.com/simple-icons/simple-icons/pull/5415', + path: 'M12.135 24c1.875 0 9.314-8.439 9.314-14.096C21.449 4.49 17.22 0 12.135 0 6.78 0 2.551 4.488 2.551 9.904 2.551 15.56 9.99 24 12.135 24zM10.639 3.846c.485-.12.995-.185 1.524-.185 3 0 5.581 2.551 5.581 5.865 0 2.985-2.581 5.535-5.596 5.535-3.345 0-5.925-2.55-5.925-5.535 0-1.396.45-2.64 1.229-3.63v.03c0 1.245 1.006 2.234 2.25 2.234C10.948 8.161 12 7.14 12 5.896c0-.919-.56-1.708-1.359-2.053l-.002.003z', + }, + { + title: 'Pingup', + hex: '00B1AB', + issue: 'https://github.com/simple-icons/simple-icons/pull/5416', + path: 'M13.667 0H1.721v24h7.536V9.717h-2.76c-.504 0-.65-.314-.32-.698l4.324-5.044c.327-.384.867-.384 1.195 0l4.324 5.044c.314.384.18.698-.33.698h-2.759v6.676h.73c6.225 0 8.617-4.309 8.617-8.481C22.291 3.906 19.666 0 13.667 0', + }, + { + title: 'Quantopian', + hex: 'C51E25', + path: 'M14.5 12c0 1.103-.897 2-2 2h-1c-1.103 0-2-.897-2-2V9.5c0-1.103.897-2 2-2h1c1.103 0 2 .897 2 2zm-2-5.5h-1c-1.654 0-3 1.346-3 3V12c0 1.654 1.346 3 3 3v.5c0 .603.4 1.5 1.5 1.5h1v-1h-1c-.403 0-.494-.275-.5-.5V15c1.654 0 3-1.346 3-3V9.5c0-1.654-1.346-3-3-3M1 21.5v-19C1 1.673 1.673 1 2.5 1h19c.827 0 1.5.673 1.5 1.5v19c0 .827-.673 1.5-1.5 1.5h-19c-.827 0-1.5-.673-1.5-1.5zm23 0v-19C24 1.121 22.878 0 21.5 0h-19A2.503 2.503 0 000 2.5v19C0 22.878 1.121 24 2.5 24h19c1.378 0 2.5-1.122 2.5-2.5Z', + issue: 'https://github.com/simple-icons/simple-icons/pull/5414', + }, + { + title: 'Staticman', + hex: '000000', + issue: 'https://github.com/simple-icons/simple-icons/pull/4200', + path: 'M17.17 3.046l-.063.002c-.067 0-.133.003-.2.006-.038.002-.078.006-.117.01-.05.003-.1.01-.152.015l-.123.015c-.053.008-.106.018-.16.028-.075.014-.15.03-.224.048-.027.008-.055.014-.083.02l-.174.05c-.01.004-.023.007-.035.01-1.054.333-1.955 1.055-2.51 2.05-.015.023-.03.047-.042.07-.01.023-.024.043-.036.066l-.016.037c-.3.595-.47 1.267-.47 1.978v.8c-.207 0-.373.165-.373.37s.168.373.373.373v2.868c-1.006.1-1.976.436-2.824.98-.243.156-.475.327-.69.508l-.01.01c-.004.003-.01.01-.014.012-.075.07-.146.135-.217.195-.19.162-.39.31-.6.443-.005.003-.007.007-.01.01-.26.16-.474.277-.678.37-.16.07-.322.128-.494.182l-.067.02c-.017.007-.035.012-.054.017-.505.155-1.03.235-1.57.235-1.39 0-2.685-.527-3.66-1.44.455.16.935.243 1.425.243 1.082 0 2.118-.412 2.904-1.13.143.684.444 1.327.878 1.877.196-.06.378-.12.553-.2.058-.026.118-.055.178-.086-.602-.676-.948-1.55-.96-2.463-.002-.16-.107-.3-.26-.35s-.32.007-.414.136c-.668.92-1.745 1.47-2.88 1.47-.998 0-1.957-.424-2.63-1.164-.113-.124-.294-.157-.443-.082s-.23.24-.198.405l.012.055v.003c.883 3.818 3.737 6.984 7.446 8.26.84.29 1.72.483 2.613.57l.037.002c.092 0 .18-.034.25-.096.078-.07.122-.17.122-.276v-1.985c0-.94.19-1.85.57-2.703.262-.588.607-1.132 1.027-1.62l-.407-.242.488.147 2.503.714c.132.06.267.115.404.166v-.8c-.63-.278-1.176-.684-1.59-1.193v-4.07h.15v1.01c0 .733.595 1.33 1.328 1.33h.532c.69 0 1.258-.53 1.323-1.202.004-.02.007-.042.007-.064 0-.18.145-.324.324-.324s.324.145.324.324c0 .022.003.043.006.064.064.674.633 1.203 1.323 1.203h.533c.733 0 1.33-.596 1.33-1.33v-1.01h.146v4.072c-.414.508-.96.914-1.59 1.192v.8c.138-.05.273-.106.404-.167l2.502-.715.005.006.505-.15-.42.248c.365.428.674.897.92 1.4.063.13.193.21.335.21h.022c.15-.01.28-.108.33-.25.103-.297.155-.61.155-.933 0-1.44-1.04-2.624-2.424-2.84V8.994c.206 0 .372-.167.372-.372s-.166-.37-.372-.37v-.8c0-.265-.025-.526-.07-.78-.002-.006 0-.012-.002-.018l-.014-.075-.005-.024c-.172-.837-.582-1.6-1.19-2.21-.268-.27-.57-.504-.893-.693-.033-.02-.067-.036-.1-.055l-.06-.033c-.052-.027-.103-.054-.154-.078-.018-.01-.036-.016-.054-.025-.088-.042-.177-.08-.266-.114-.036-.014-.07-.028-.108-.04-.04-.016-.082-.03-.123-.043-.044-.014-.09-.028-.134-.04-.037-.012-.074-.022-.11-.032-.078-.02-.156-.04-.236-.055-.025-.005-.05-.01-.075-.013-.06-.01-.122-.022-.183-.03-.035-.006-.07-.01-.107-.015l-.157-.016-.11-.008c-.06-.004-.122-.005-.183-.006l-.072-.003zm3.14 1.814s-.076.077-.214.21c-.068.067-.156.143-.254.232-.098.09-.214.185-.34.29-.09.07-.19.145-.29.22.36.723.945 1.193 1.602 1.274.012.12.018.243.018.366v.798h-2.615c-.046-.153-.186-.266-.355-.266H16.48c-.168 0-.31.113-.355.266H13.51v-.798c0-.398.064-.78.182-1.14.117.112.243.212.378.3.04.02.12.063.242.116.173.077.43.162.746.21.158.024.33.037.514.038.045 0 .094 0 .136-.003l.145-.01c.1-.003.193-.02.29-.03s.2-.035.3-.052c.1-.02.2-.048.302-.07.1-.03.202-.06.303-.092.1-.036.202-.07.3-.108.2-.076.398-.16.588-.252l.28-.14.272-.145c.175-.1.344-.198.5-.297.08-.047.155-.1.23-.146s.144-.092.21-.14c.132-.093.258-.173.364-.252.107-.078.203-.143.277-.202.15-.115.24-.178.24-.178zm-3.46 3.87h.64v.212h-.64V8.73zm-2.45.265h1.7v1.01c0 .323-.262.585-.584.585h-.532c-.323 0-.585-.262-.585-.585v-1.01zm3.84 0h1.7v1.01c0 .323-.262.585-.585.585h-.532c-.323 0-.585-.262-.585-.585v-1.01zm-2.99.16c-.234 0-.424.19-.424.424s.19.424.425.424.426-.19.426-.425c0-.07-.018-.132-.046-.19-.04.05-.1.083-.166.083-.117 0-.213-.095-.213-.213 0-.038.012-.073.03-.103l-.03-.003zm3.84 0c-.234 0-.425.19-.425.424s.19.424.425.424.425-.19.425-.425c0-.07-.017-.132-.046-.19-.04.05-.1.083-.168.083-.117 0-.213-.095-.213-.213 0-.038.01-.073.027-.103-.01 0-.02-.003-.028-.003zm-3.436 4.356c-.066.006-.13.03-.186.068-.1.07-.158.183-.158.304v2.02c0 .12.06.235.158.304.064.045.14.068.215.068.042 0 .084-.007.125-.022l1.364-.487 1.364.487c.04.015.083.022.125.022.077 0 .152-.023.216-.068.1-.07.158-.183.158-.304v-2.02c0-.12-.06-.235-.158-.304s-.225-.087-.34-.046l-1.363.487-1.363-.488c-.03-.01-.058-.017-.087-.02-.022-.002-.044-.003-.066 0zm.4.9l.744.266v.432l-.744.266v-.964zm2.233 0v.964l-.744-.266v-.432l.744-.266z', + }, + { + title: 'Storify', + hex: '3A98D9', + issue: 'https://github.com/simple-icons/simple-icons/pull/4204', + path: 'M22.98 8.566c.32.607.563 1.275.732 2.005.17.73.264 1.495.285 2.292.02.795-.061 1.605-.24 2.416-.18.815-.447 1.611-.797 2.388s-.83 1.515-1.441 2.22c-.613.706-1.313 1.339-2.107 1.901-.781.554-1.74 1.034-2.85 1.409-1.111.39-2.326.645-3.646.795l-.299-.721c.074-.015.164-.045.299-.089.137-.046.375-.135.721-.301.359-.15.689-.329 1.02-.54.33-.21.689-.495 1.08-.87.404-.375.734-.779 1.02-1.215.285-.449.525-.99.721-1.649.195-.66.301-1.365.301-2.115 0-.721-.09-1.381-.285-2.01-.195-.631-.451-1.155-.766-1.621-.314-.449-.674-.885-1.049-1.289-.375-.405-.766-.795-1.141-1.155-.391-.36-.734-.735-1.066-1.095-.314-.361-.584-.766-.779-1.215-.195-.45-.3-.916-.3-1.41 0-.885.361-1.65 1.05-2.28.705-.646 1.664-.96 2.895-.96.361 0 .721.029 1.096.105.375.074.824.209 1.334.435.512.226.992.51 1.455.854.467.346.961.84 1.471 1.455.51.619.977 1.335 1.395 2.145l-.109.115zM1.02 15.451c-.319-.607-.563-1.275-.731-2.006-.169-.731-.265-1.494-.285-2.291-.021-.796.061-1.605.24-2.416.181-.816.445-1.612.795-2.388.352-.777.832-1.516 1.44-2.22.615-.705 1.315-1.34 2.109-1.9.78-.556 1.739-1.035 2.851-1.41C8.55.427 9.765.158 11.085.007l.299.711c-.063.014-.158.044-.285.08-.124.039-.359.135-.712.293-.35.156-.687.334-1.013.537-.322.202-.68.489-1.072.861s-.73.777-1.012 1.215c-.284.439-.521.985-.716 1.64-.196.654-.291 1.355-.291 2.107 0 .71.09 1.375.301 2 .195.625.449 1.162.765 1.613.315.466.675.885 1.05 1.307.375.419.766.794 1.141 1.154.375.359.734.734 1.05 1.096.329.375.585.779.78 1.214.195.45.299.915.299 1.41 0 .899-.359 1.666-1.049 2.296-.706.645-1.667.959-2.897.959-.359 0-.72-.03-1.095-.105-.375-.074-.825-.209-1.32-.435-.51-.226-.99-.51-1.47-.855-.466-.345-.96-.84-1.47-1.455-.51-.614-.975-1.334-1.396-2.144l.048-.055z', + }, + { + title: 'Tencent Weibo', + hex: '20B8E5', + issue: 'https://github.com/simple-icons/simple-icons/pull/4222', + path: 'M4.252 23.936a.97.97 0 0 1-.474-.466c-.08-.167-.086-.222-.086-.653 0-.93.15-2.428.362-3.587.698-3.827 2.373-7.127 4.915-9.671l.574-.58-.074-.293c-.14-.561-.079-1.306.149-1.826.25-.564.784-1.142 1.3-1.416.134-.071.25-.127.253-.123.008 0 .066-.021.137-.049.07-.03.153-.061.189-.068.034-.006.095-.023.14-.034a2.93 2.93 0 0 1 1.341 0c.038.007.11.031.165.052.05.02.091.027.091.02 0-.01.172.072.375.177.61.315 1.03.75 1.317 1.362.222.465.273.704.271 1.248-.004.398-.017.506-.095.764-.182.605-.45 1.004-.965 1.456-.117.1-.25.202-.295.23a7.209 7.209 0 0 1-.54.268c-.011.005-.04.019-.068.03-.027.013-.091.026-.144.036a.562.562 0 0 0-.127.035c-.014.01-.119.026-.23.038-.111.01-.255.023-.32.033-.148.021-.609-.031-.872-.096a3.027 3.027 0 0 1-.623-.262l-.26-.137-.11.08c-.146.114-.835.85-1.186 1.27-2.335 2.805-3.652 6.45-3.827 10.62-.027.628-.052.913-.088 1.023-.072.193-.28.419-.472.512a.993.993 0 0 1-.723.007zm7.853-7.88a1.684 1.684 0 0 0-.307-.038 5.104 5.104 0 0 1-.839-.105c-.038-.007-.126-.021-.2-.035a.753.753 0 0 1-.166-.037.566.566 0 0 0-.122-.034 1.821 1.821 0 0 1-.23-.069.535.535 0 0 0-.147-.048 2.58 2.58 0 0 1-.28-.086 1.747 1.747 0 0 0-.28-.082c-.025.017-.34-.208-.418-.3-.212-.253-.29-.643-.182-.903.148-.343.504-.6.849-.609.116-.003.23.01.256.034.028.02.05.031.05.017 0-.013.036.004.083.035s.086.044.086.031c0-.014.022-.012.045.007.044.037.335.136.462.163.04.007.089.022.106.031s.08.029.143.037c.065.006.246.042.407.073.315.058 1.33.089 1.54.044.064-.014.197-.035.289-.044.096-.007.195-.024.223-.035.029-.01.1-.024.154-.034.14-.024.287-.057.393-.095.027-.011.12-.038.203-.063.084-.02.191-.057.238-.077.049-.019.11-.038.139-.045.023-.005.23-.1.46-.213a6.243 6.243 0 0 0 2.29-1.92c.275-.394.699-1.232.843-1.677.721-2.254.147-4.733-1.478-6.372a6.522 6.522 0 0 0-2.328-1.457 4.057 4.057 0 0 0-.412-.123 3.08 3.08 0 0 1-.246-.057 3.39 3.39 0 0 0-.188-.048 3.985 3.985 0 0 0-.479-.066 2.042 2.042 0 0 1-.273-.037c-.055-.02-.855-.013-1.06.007-.243.02-.396.044-.564.077a3.96 3.96 0 0 1-.257.052l-.171.038-.137.034a.608.608 0 0 0-.1.032.096.096 0 0 0-.057.027c-.015.016-.059.027-.099.027a.191.191 0 0 0-.114.041c-.023.024-.04.028-.04.013 0-.017-.024-.01-.05.015-.03.023-.052.03-.052.02 0-.014-.036-.005-.076.02-.045.02-.093.045-.113.048-.071.014-.729.348-.93.48-.462.29-.627.423-1.054.85-.533.53-.818.924-1.145 1.575a6.276 6.276 0 0 0-.581 3.931c.06.359.143.65.304 1.088.061.163.068.23.044.367-.098.55-.707.957-1.152.772-.065-.026-.12-.045-.12-.033 0 .037-.287-.2-.376-.312a1.87 1.87 0 0 1-.205-.42c-.469-1.301-.55-2.946-.216-4.368a8.318 8.318 0 0 1 1.587-3.222c.315-.39.991-1.053 1.358-1.337.274-.21.899-.622.944-.622.007 0 .13-.069.273-.155a2.15 2.15 0 0 1 .26-.136c0 .01.065-.018.147-.058.079-.042.16-.08.178-.082.02-.004.096-.035.171-.065.075-.036.136-.055.14-.048 0 .005.027-.007.058-.035.034-.024.06-.034.06-.02 0 .015.023.008.05-.017.027-.024.05-.03.05-.018 0 .014.025.007.052-.017s.051-.03.051-.016.025.006.052-.018c.027-.023.05-.033.05-.02 0 .01.043.003.096-.018.052-.02.12-.043.156-.05.054-.015.163-.04.246-.061a.887.887 0 0 0 .101-.032c.038-.01.124-.03.189-.04.065-.01.263-.042.437-.068.237-.038.537-.05 1.215-.043.492.007.945.021.998.031.058.012.172.031.254.041.086.015.214.038.29.059.079.016.192.04.257.052a.629.629 0 0 1 .154.037.23.23 0 0 0 .082.034c.1.024.16.04.17.045.006.007.017.01.035.012l.264.09c.134.044.246.084.255.084s.05.022.086.043c.037.02.08.037.096.04.014 0 .072.028.127.056.057.03.102.046.102.037 0-.024.742.379.949.516.105.072.22.148.252.164.347.212.861.643 1.283 1.077a8.174 8.174 0 0 1 2.154 4.07c.082.414.096.555.108 1.334.015.998-.024 1.392-.215 2.14-.402 1.574-1.23 2.908-2.541 4.098a10 10 0 0 1-1.22.882c-.18.108-1.044.537-1.044.52 0-.01-.033.004-.074.028-.045.024-.086.045-.096.045-.011 0-.125.04-.258.084-.128.045-.246.086-.255.086l-.069.028a.569.569 0 0 1-.137.037c-.167.035-.24.052-.269.069a.554.554 0 0 1-.145.037 3.77 3.77 0 0 0-.273.049 5.506 5.506 0 0 1-.715.089c-.575.045-.875.057-.889.04z', + }, + { + title: 'Vine', + hex: '11B48A', + issue: 'https://github.com/simple-icons/simple-icons/pull/5259', + path: 'M22.522 11.923a7.862 7.862 0 01-1.758.206c-3.028 0-5.362-2.116-5.362-5.794 0-1.802.706-2.732 1.697-2.732.946 0 1.562.841 1.562 2.553 0 .975-.256 2.04-.45 2.672 0 0 .93 1.636 3.481 1.125.54-1.201.842-2.762.842-4.127C22.534 2.146 20.658 0 17.22 0c-3.544-.017-5.616 2.7-5.616 6.289 0 3.55 1.66 6.597 4.395 7.985-1.15 2.301-2.614 4.328-4.142 5.857-2.77-3.352-5.274-7.821-6.303-16.543H1.466c1.889 14.527 7.518 19.15 9.005 20.037.84.504 1.566.48 2.336.049 1.215-.688 4.849-4.316 6.86-8.564.84-.003 1.861-.1 2.867-.328v-2.865z', + }, + { + title: 'Virb', + hex: '0093DA', + path: 'M17.733 7.237c0-.25 0-.476.15-.625.199-.176.4-.15.6-.15h1.428c.766 0 1.875.199 2.625.877.75.699.915 1.701.915 2.604v2.252c0 .599.015 1.027-.284 1.578-.375.701-1.155.9-1.155 1.002 0 .1.839.252 1.214 1.002.301.6.27.975.27 1.576v3.105c0 .615 0 1.395-.899 2.445-.855.943-2.039 1.08-2.64 1.08-.449 0-.779.016-1.23 0-.299-.031-.749.016-.854-.137-.149-.223-.194-.178-.194-.854V7.229l.054.008zm-5.46 16.349c0 .402-.099.402-.85.402-.576 0-.75 0-.75-.352V7.229c0-.25.023-.523.174-.674.201-.176.375-.101.576-.101h1.428c.801 0 1.878.199 2.628.876.75.699.927 1.728.927 2.604v2.26c0 .599.025 1.027-.276 1.578-.375.701-1.176.9-1.176 1.002 0 .1.825.252 1.2 1.002.3.6.277.975.277 1.576v6.225c0 .391-.18.391-.855.391-.584 0-.75.016-.75-.359V17.25c0-1.027-.674-1.652-1.229-1.652-1.185 0-1.335-.023-1.335.375v7.59l.011.023zm-3.828.375c-.676 0-.75 0-.75-.35V6.862c0-.325.148-.375.75-.375.674 0 .85.023.85.398v16.679c0 .375-.045.404-.84.404l-.01-.007zm11.165-1.627c.196.031.226.031.451.031.27 0 .899-.074 1.35-.541.495-.539.525-.898.525-1.318v-3.211c0-1.154-.675-1.648-1.425-1.648-1.08 0-1.156.074-1.156.674v5.264c0 .287.015.75.24.781l.015-.032zM3.609 18.777c.426-4.303.801-7.96 1.199-11.893.051-.423.252-.398.705-.398.699 0 .949.051.924.325-.75 6.164-1.326 10.724-2.077 16.814-.046.361-.315.375-.825.375-.645 0-.945 0-1.005-.42C1.855 17.939 1.24 12.93.506 6.782c-.016-.301.105-.301.809-.301.735 0 .886.075.899.404.406 4.381.706 7.785 1.081 11.955 0 .076.031.24.15.24.15 0 .18-.164.18-.27l-.016-.033zm9.315-10.662c-.225 0-.451 0-.553.173-.074.15-.074.277-.074.427v4.682c0 .275-.051.551.15.701.148.119.324.09.449.09.277 0 .93-.074 1.38-.555.499-.557.499-.975.499-1.335V9.944c0-.575-.1-1.002-.525-1.451-.275-.25-.425-.375-1.326-.375v-.003zm7.234 0c-.352 0-.625 0-.727.173-.073.15-.073.277-.073.427v4.682c0 .275-.026.5.149.676.149.15.251.125.45.125.35 0 .927-.074 1.38-.549.498-.557.498-.932.498-1.335v-2.37c0-.575-.099-1.002-.526-1.451-.275-.25-.448-.375-1.151-.375v-.003zM10.89 2.01H9.312V.395C9.312.024 9.139 0 8.476 0c-.587 0-.735.049-.735.368V2.01H6.204c-.369 0-.396.174-.396.835 0 .59.051.735.369.735H7.74v1.549c0 .342.075.342.734.342.786 0 .836-.023.836-.393V3.583h1.627c.345 0 .345-.076.345-.736.001-.786-.024-.836-.392-.837z', + issue: 'https://github.com/simple-icons/simple-icons/pull/5257', + }, + { + title: 'X-Pack', + hex: '005571', + path: 'M13.7 19.55l5.88-5.89 3.35 3.36a3.57 3.57 0 0 1 0 5.05l-.83.83a3.57 3.57 0 0 1-5.05 0zM22.92 1.9l-.83-.83a3.57 3.57 0 0 0-5.05 0L12 6.12 6.95 1.07a3.57 3.57 0 0 0-5.05 0l-.83.83a3.57 3.57 0 0 0 0 5.05L6.12 12l-5.05 5.05a3.57 3.57 0 0 0 0 5.05l.83.83a3.57 3.57 0 0 0 5.05 0L12 17.88l3.68-3.68 2.2-2.2 5.05-5.05a3.57 3.57 0 0 0 0-5.05z', + issue: 'https://github.com/simple-icons/simple-icons/pull/4239', + }, + { + title: 'Sprint', + hex: 'FFCE0A', + path: 'M2.201 0c2.416 2.642 5.96 7.925 7.203 9.821C8.41 7.09 5.904 1.4 2.2 0zm5.464 2.461c1.264 3.635 2.37 8.828 2.687 11.356.429-2.845.203-6.276-.361-8.443C9.697 4.2 8.636 2.867 7.665 2.46zm4.177 2.348c.022 2.732-.948 9.099-1.987 11.876 2.303-2.98 4.132-6.458 4.132-8.964 0-1.31-.926-2.212-2.145-2.912zm4.064 2.8c-1.92 4.492-6.232 10.114-8.602 12.575 3.341-2.28 8.173-6.638 9.82-8.986.385-.542.678-.88.678-1.467 0-.948-1.106-1.648-1.896-2.123zm3.477 2.912C15.093 14.991 6.559 21.675 2.292 24c5.396-1.806 13.23-6.028 18.694-9.799.451-.316.813-.61.813-1.129 0-.88-1.626-2.077-2.416-2.551z', + issue: 'https://github.com/simple-icons/simple-icons/pull/4710', + }, + { + title: 'Mixer', + hex: '002050', + path: 'M2.456 1.375a2.461 2.461 0 0 0-1.65.642C-.134 2.884-.21 4.348.553 5.38l4.917 6.59-4.946 6.65c-.762 1.032-.702 2.496.254 3.363a2.45 2.45 0 0 0 3.617-.344l6.904-9.28a.65.65 0 0 0 0-.763L4.423 2.361a2.432 2.432 0 0 0-1.967-.986zm19.089 0a2.432 2.432 0 0 0-1.968.986l-6.86 9.22a.65.65 0 0 0 0 .762l6.89 9.296a2.45 2.45 0 0 0 3.617.344c.956-.867 1.016-2.331.254-3.363l-4.947-6.65 4.917-6.59c.762-1.032.687-2.496-.254-3.363a2.459 2.459 0 0 0-1.65-.641z', + issue: 'https://github.com/simple-icons/simple-icons/pull/4119', + }, + { + title: 'Google+', + hex: 'DC4E41', + path: 'M7.635 10.909v2.619h4.335c-.173 1.125-1.31 3.295-4.331 3.295-2.604 0-4.731-2.16-4.731-4.823 0-2.662 2.122-4.822 4.728-4.822 1.485 0 2.479.633 3.045 1.178l2.073-1.994c-1.33-1.245-3.056-1.995-5.115-1.995C3.412 4.365 0 7.785 0 12s3.414 7.635 7.635 7.635c4.41 0 7.332-3.098 7.332-7.461 0-.501-.054-.885-.12-1.265H7.635zm16.365 0h-2.183V8.726h-2.183v2.183h-2.182v2.181h2.184v2.184h2.189V13.09H24', + issue: 'https://github.com/simple-icons/simple-icons/pull/1513', + }, + { + title: 'StumbleUpon', + hex: 'EB4924', + path: 'M12 0C5.37 0 0 5.373 0 12c0 6.63 5.37 12 12 12s12-5.37 12-12c0-6.627-5.37-12-12-12zm-.618 8.907v4.949c0 1.854-1.692 3.251-3.45 3.251-1.644 0-3.18-.776-3.354-2.634V11.37h2.475v2.475c0 .615.436.716.878.716.439 0 .975-.099.975-.717v-4.95c.05-1.843 1.58-3.014 3.29-3.014 1.744 0 2.899 1.319 2.899 3.016v1.05l-1.228.585-1.248-.585V8.289s-.164-.18-.42-.18c-.424 0-.816.18-.817.798zm8.04 4.949c0 1.854-1.59 3.111-3.353 3.111-1.761 0-3.45-1.257-3.45-3.112V11.38h2.476v2.475c0 .618.535.717.975.717.44 0 .879-.099.879-.717V11.38h2.461v2.475l.012.001z', + issue: 'https://github.com/simple-icons/simple-icons/pull/976', + }, + { + title: 'Rdio', + hex: '008FD5', + issue: 'https://github.com/simple-icons/simple-icons/pull/556', + path: 'M23.38 6.564c-2.773.081-6.123-2.096-7.421-2.915-.121-.076-.146-.15-.271-.211-.135-.074-.276-.15-.417-.225v8.006h-.001c.004.72-.307 1.47-.755 2.189l-.03.061c-1.289 2.098-4.018 3.313-6.582 2.443-2.488-.84-3.148-3.254-1.829-5.382l.044-.028c1.274-2.085 4.003-3.313 6.566-2.444.195.064.378.145.555.23V2.495c-.92-.247-1.889-.39-2.916-.39C4.4 2.105 0 6.539 0 12v.07c0 5.462 4.363 9.824 10.25 9.824 5.923 0 10.321-4.432 10.321-9.894v-.07c0-.426-.029-.844-.074-1.254 3.088-.805 4.363-3.998 2.895-4.112', + }, + { + title: 'Minecraft', + hex: '62B74A', + issue: 'https://github.com/simple-icons/simple-icons/pull/552', + path: 'M20 24h-4v-4H8v4H4V12h4V8h8v4h4v12zM16 0h8v8h-8V0zM0 0h8v8H0V0z', + }, +]; diff --git a/si-utils.js b/si-utils.js new file mode 100644 index 00000000..8cf6cee3 --- /dev/null +++ b/si-utils.js @@ -0,0 +1,201 @@ +/** + * @fileoverview + * Some common utilities for scripts. + */ + +import path from 'node:path'; +import fs from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; + +const TITLE_TO_SLUG_REPLACEMENTS = { + '+': 'plus', + '.': 'dot', + '&': 'and', + đ: 'd', + ħ: 'h', + ı: 'i', + ĸ: 'k', + ŀ: 'l', + ł: 'l', + ß: 'ss', + ŧ: 't', +}; + +const TITLE_TO_SLUG_CHARS_REGEX = RegExp( + `[${Object.keys(TITLE_TO_SLUG_REPLACEMENTS).join('')}]`, + 'g', +); + +const TITLE_TO_SLUG_RANGE_REGEX = /[^a-z0-9]/g; + +export const URL_REGEX = /^https:\/\/[^\s]+$/; + +/** + * Get the slug/filename for an icon. + * @param {Object} icon The icon data as it appears in _data/simple-icons.json + */ +export const getIconSlug = (icon) => icon.slug || titleToSlug(icon.title); + +/** + * Extract the path from an icon SVG content. + * @param {Object} svg The icon SVG content + **/ +export const svgToPath = (svg) => svg.match(/ + title + .toLowerCase() + .replace( + TITLE_TO_SLUG_CHARS_REGEX, + (char) => TITLE_TO_SLUG_REPLACEMENTS[char], + ) + .normalize('NFD') + .replace(TITLE_TO_SLUG_RANGE_REGEX, ''); + +/** + * Converts a slug into a variable name that can be exported. + * @param {String} slug The slug to convert + */ +export const slugToVariableName = (slug) => { + const slugFirstLetter = slug[0].toUpperCase(); + const slugRest = slug.slice(1); + return `si${slugFirstLetter}${slugRest}`; +}; + +/** + * Converts a brand title (as it is seen in simple-icons.json) into a brand + * title in HTML/SVG friendly format. + * @param {String} brandTitle The title to convert + */ +export const titleToHtmlFriendly = (brandTitle) => + brandTitle + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>') + .replace(/./g, (char) => { + const charCode = char.charCodeAt(0); + return charCode > 127 ? `&#${charCode};` : char; + }); + +/** + * Converts a brand title in HTML/SVG friendly format into a brand title (as + * it is seen in simple-icons.json) + * @param {String} htmlFriendlyTitle The title to convert + */ +export const htmlFriendlyToTitle = (htmlFriendlyTitle) => + htmlFriendlyTitle + .replace(/&#([0-9]+);/g, (_, num) => String.fromCharCode(parseInt(num))) + .replace( + /&(quot|amp|lt|gt);/g, + (_, ref) => ({ quot: '"', amp: '&', lt: '<', gt: '>' }[ref]), + ); + +/** + * Get path of _data/simpe-icons.json. + * @param {String|undefined} rootDir Path to the root directory of the project. + */ +export const getIconDataPath = (rootDir) => { + if (rootDir === undefined) { + rootDir = path.resolve(getDirnameFromImportMeta(import.meta.url), '..'); + } + return path.resolve(rootDir, '_data', 'simple-icons.json'); +}; + +/** + * Get contents of _data/simple-icons.json. + * @param {String|undefined} rootDir Path to the root directory of the project. + */ +export const getIconsDataString = (rootDir) => { + return fs.readFile(getIconDataPath(rootDir), 'utf8'); +}; + +/** + * Get icons data as object from _data/simple-icons.json. + * @param {String|undefined} rootDir Path to the root directory of the project. + */ +export const getIconsData = async (rootDir) => { + const fileContents = await getIconsDataString(rootDir); + return JSON.parse(fileContents).icons; +}; + +/** + * Write icons data to _data/simple-icons.json. + * @param {Object} iconsData Icons data object. + * @param {String|undefined} rootDir Path to the root directory of the project. + */ +export const writeIconsData = async (iconsData, rootDir) => { + return fs.writeFile( + getIconDataPath(rootDir), + `${JSON.stringify(iconsData, null, 4)}\n`, + 'utf8', + ); +}; + +/** + * Get the directory name where this file is located from `import.meta.url`, + * equivalent to the `__dirname` global variable in CommonJS. + * @param {String} importMetaUrl import.meta.url + */ +export const getDirnameFromImportMeta = (importMetaUrl) => + path.dirname(fileURLToPath(importMetaUrl)); + +/** + * Replace Windows newline characters by Unix ones. + * @param {String} text The text to replace + */ +export const normalizeNewlines = (text) => { + return text.replace(/\r\n/g, '\n'); +}; + +/** + * Convert non-6-digit hex color to 6-digit. + * @param {String} text The color text + */ +export const normalizeColor = (text) => { + let color = text.replace('#', '').toUpperCase(); + if (color.length < 6) { + color = [...color.slice(0, 3)].map((x) => x.repeat(2)).join(''); + } else if (color.length > 6) { + color = color.slice(0, 6); + } + return color; +}; + +/** + * Get information about third party extensions. + * @param {String} readmePath Path to the README file + */ +export const getThirdPartyExtensions = async (readmePath) => + normalizeNewlines(await fs.readFile(readmePath, 'utf8')) + .split('## Third-Party Extensions\n\n')[1] + .split('\n\n')[0] + .split('\n') + .slice(2) + .map((line) => { + const [module, author] = line.split(' | '); + return { + module: { + name: /\[(.+)\]/.exec(module)[1], + url: /\((.+)\)/.exec(module)[1], + }, + author: { + name: /\[(.+)\]/.exec(author)[1], + url: /\((.+)\)/.exec(author)[1], + }, + }; + }); + +/** + * `Intl.Collator` object ready to be used for icon titles sorting. + * @type {Intl.Collator} + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator + **/ +export const collator = new Intl.Collator('en', { + usage: 'search', + caseFirst: 'upper', +}); diff --git a/tests/e2e.test.js b/tests/e2e.test.js index d9e0ac48..fa07b980 100644 --- a/tests/e2e.test.js +++ b/tests/e2e.test.js @@ -11,6 +11,7 @@ import * as simpleIcons from 'simple-icons/icons'; import { getClipboardValue, + getAttribute, getValue, hasClass, isDisabled, @@ -23,7 +24,7 @@ import { jest.retryTimes(3); jest.setTimeout(3000); -const COLOR_REGEX = /^#[A-F0-9]{6}$/; +const COLOR_REGEX = /^[A-F0-9]{6}$/; const SVG_REGEX = /^.*<\/svg>$/; const DEFAULT_DEVICE = { @@ -129,6 +130,16 @@ describe('External links', () => { expect(page).toClick(link.getProperty('innerText')), ); }); + + it('is possible to click outdated icon link', async () => { + const reportIcons = await page.$$('a.report__icon'); + expect(page).toClick( + await getAttribute( + reportIcons[Math.floor(Math.random() * reportIcons.length)], + 'href', + ), + ); + }); }); describe('Search', () => { @@ -327,7 +338,8 @@ describe('Ordering', () => { it('orders grid items alphabetically', async () => { await expect(page).toClick('#order-alpha'); - const $gridItems = await page.$$('.grid-item'); + const $gridItems = await page.$$('button.grid-item__button.view-button'); + for (let i = 0; i < nIcons; i++) { const $gridItem = $gridItems[i]; const expectedTitle = titles[i]; @@ -340,13 +352,15 @@ describe('Ordering', () => { it('orders grid items by color', async () => { await expect(page).toClick('#order-color'); - const $gridItems = await page.$$('button.grid-item__color'); + const $gridItems = await page.$$( + '.grid-item__footer button.grid-item__color', + ); const hexes = []; for (let i = 0; i < nIcons; i++) { const $gridItem = $gridItems[i]; const color = await getTextContent($gridItem); - const hex = color.slice(1); + const hex = color; hexes.push(hex); } await expect(sortByColors(hexes)).toEqual(hexes); @@ -451,7 +465,9 @@ describe('Grid item', () => { }); it('copies the hex value when it is clicked', async () => { - await expect(page).toClick('button.copy-color'); + await expect(page).toClick( + '.grid-item__footer button.grid-item__color.copy-color', + ); const clipboardValue = await getClipboardValue(page); expect(clipboardValue).toMatch(COLOR_REGEX); }); @@ -474,6 +490,13 @@ describe('Grid item', () => { await expect(page).toClick('a[download].grid-item__button'); }, ); + + it.each(['layout-comfortable', 'layout-compact'])( + 'is possible to click on the "%s" button', + async (layoutType) => { + await expect(page).toClick(`button#${layoutType}`); + }, + ); }); describe('JavaScript disabled', () => { @@ -510,7 +533,9 @@ describe('JavaScript disabled', () => { }); it('has the color value button disabled', async () => { - const $colorButton = await page.$('button.copy-color'); + const $colorButton = await page.$( + '.grid-item__footer button.grid-item__color.copy-color', + ); expect(await isDisabled($colorButton)).toBeTruthy(); }); diff --git a/tests/modal.test.js b/tests/modal.test.js index cc16efa7..4ed23926 100644 --- a/tests/modal.test.js +++ b/tests/modal.test.js @@ -41,6 +41,6 @@ describe('Extensions modal', () => { initModal(document, domUtils); eventListeners.get(event)(newEventMock(eventParam)); - expect(domUtils.hideElement).toHaveBeenCalledTimes(1); + expect(domUtils.hideElement).toHaveBeenCalledTimes(2); }); }); From 7d8bc36d940351fcf4d5cd16b3cc5f7a92734c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 16:12:40 +0200 Subject: [PATCH 02/14] Minimal valid implementation --- locales/es.po | 32 ++++- locales/fr.po | 32 ++++- locales/it.po | 32 ++++- public/index.pug | 62 ++++----- public/removed.pug | 2 +- public/scripts/copy.js | 2 +- public/scripts/data.js | 58 +++++++++ public/scripts/dom-utils.js | 8 +- public/scripts/download-type.js | 7 +- public/scripts/index.js | 26 ++-- public/scripts/modal.js | 157 ++++++++++------------- public/stylesheet.css | 218 ++++++++++++++++++++------------ scripts/https.js | 44 ++++--- webpack.config.js | 8 +- 14 files changed, 437 insertions(+), 251 deletions(-) create mode 100644 public/scripts/data.js diff --git a/locales/es.po b/locales/es.po index 74e742af..1fbf432a 100644 --- a/locales/es.po +++ b/locales/es.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://github.com/simple-icons/simple-icons-website/issues\n" "Language: es\n" "POT-Creation-Date: 2022-09-25T01:25:24.834Z\n" -"PO-Revision-Date: 2022-09-27T00:18:49.384Z\n" +"PO-Revision-Date: 2022-09-27T13:59:24.324Z\n" "MIME-Version: 1.0\n" msgid "Extension" @@ -128,3 +128,33 @@ msgstr "Obsoleto" msgid "Removal at $version" msgstr "Se elimina en $version" + +msgid "Layout" +msgstr "" + +msgid "Comfortable" +msgstr "" + +msgid "Compact" +msgstr "" + +msgid "view $iconTitle" +msgstr "" + +msgid "Download SVG" +msgstr "" + +msgid "Download colored SVG" +msgstr "" + +msgid "Download PDF" +msgstr "" + +msgid "Report $iconTitle as outdated" +msgstr "" + +msgid "Report icon as outdated" +msgstr "" + +#~ msgid "Report outdated" +#~ msgstr "" diff --git a/locales/fr.po b/locales/fr.po index 4c1c9aeb..91145ec8 100644 --- a/locales/fr.po +++ b/locales/fr.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://github.com/simple-icons/simple-icons-website/issues\n" "Language: fr\n" "POT-Creation-Date: 2022-09-25T01:25:24.834Z\n" -"PO-Revision-Date: 2022-09-27T00:18:49.384Z\n" +"PO-Revision-Date: 2022-09-27T13:59:24.324Z\n" "MIME-Version: 1.0\n" msgid "Extension" @@ -128,3 +128,33 @@ msgstr "Obsolète" msgid "Removal at $version" msgstr "Suppression à $version" + +msgid "Layout" +msgstr "" + +msgid "Comfortable" +msgstr "" + +msgid "Compact" +msgstr "" + +msgid "view $iconTitle" +msgstr "" + +msgid "Download SVG" +msgstr "" + +msgid "Download colored SVG" +msgstr "" + +msgid "Download PDF" +msgstr "" + +msgid "Report $iconTitle as outdated" +msgstr "" + +msgid "Report icon as outdated" +msgstr "" + +#~ msgid "Report outdated" +#~ msgstr "" diff --git a/locales/it.po b/locales/it.po index fd81675a..34e17b00 100644 --- a/locales/it.po +++ b/locales/it.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2022-09-26T15:39:06.158Z\n" "MIME-Version: 1.0\n" "Project-Id-Version: simple-icons-website\n" -"PO-Revision-Date: 2022-09-27T00:18:49.384Z\n" +"PO-Revision-Date: 2022-09-27T13:59:24.324Z\n" msgid "$nIcons Free SVG icons for popular brands" msgstr "$nIcons icone SVG gratuite per marchi famosi" @@ -128,3 +128,33 @@ msgstr "Deprecato" msgid "Removal at $version" msgstr "Rimozione in $version" + +msgid "Layout" +msgstr "" + +msgid "Comfortable" +msgstr "" + +msgid "Compact" +msgstr "" + +msgid "view $iconTitle" +msgstr "" + +msgid "Download SVG" +msgstr "" + +msgid "Download colored SVG" +msgstr "" + +msgid "Download PDF" +msgstr "" + +msgid "Report $iconTitle as outdated" +msgstr "" + +msgid "Report icon as outdated" +msgstr "" + +#~ msgid "Report outdated" +#~ msgstr "" diff --git a/public/index.pug b/public/index.pug index 600d5838..14b5010d 100644 --- a/public/index.pug +++ b/public/index.pug @@ -42,6 +42,8 @@ html(lang=lang) path( d='M11.2 0a.8.8 0 0 0-.8.8v11.4L7.26 9.44a.803.803 0 0 0-1.13.074l-1.05 1.2a.8.8 0 0 0 .073 1.13l6.33 5.54a.795.795 0 0 0 1.05 0l6.32-5.54a.8.8 0 0 0 .074-1.13l-1.05-1.2a.804.804 0 0 0-1.13-.074l-3.14 2.76V.8a.8.8 0 0 0-.8-.8zm-8 20.8a.8.8 0 0 0-.8.8v1.6a.8.8 0 0 0 .8.8h17.6a.8.8 0 0 0 .8-.8v-1.6a.8.8 0 0 0-.8-.8z' ) + symbol#fg + path(d='M7 2h2v20H7V2m12 7-8 5.6V3.4L19 9Z') body.no-js.order-alpha.layout-comfortable.download-svg(tabindex='-1') .popup_modal.popup__top.hidden @@ -63,26 +65,22 @@ html(lang=lang) href=ext.author.url, rel='noopener', target='_blank' - ) #{ ext.nameAuthor } + ) #{ ext.author.name } .detail_modal.detail__top.hidden .detail-body - .icon-left - #icon_container.icon-preview - .icon-right + .detail-body__left + img#icon-preview + .detail-body__right h2#icon-title.grid-item__title - div - button#icon-hex.grid-item__color.copy-color - div - a#icon-source - div - a#icon-guidelines - div - a#icon-license + button#icon-color + a#icon-source + a#icon-guidelines + a#icon-license .detail-footer - a#icon-download-svg.detail-button(role='button', download) SVG - a#icon-download-color-svg.detail-button(role='button', download) Color SVG - a#icon-download-pdf.detail-button(role='button', download) PDF - a#icon-report.report__icon.detail-button(role='button') Report + a#icon-download-svg.detail-button(role='button', download) #{ t_('Download SVG') } + a#icon-download-color-svg.detail-button(role='button', download) #{ t_('Download colored SVG') } + a#icon-download-pdf.detail-button(role='button', download) #{ t_('Download PDF') } + a#icon-report.report__icon.detail-button(role='button') #{ t_('Report icon as outdated') } header.header ul.header__list li.header__list-item @@ -351,10 +349,10 @@ html(lang=lang) d='M17.612 7.239H24l-.006.882-.01.885-2.006.012h-2.01v2.151h3.753v1.751h-3.752v3.841h-2.357V12Zm-7.653.02c.56-.024 1.078-.02 1.545.013.92.062 1.597.221 2.217.522.843.406 1.473 1.03 1.845 1.825.614 1.315.567 3.328-.109 4.661-.793 1.567-2.167 2.308-4.564 2.458-.713.046-2.226-.015-2.79-.11L8 16.61V7.435l.164-.022a22.974 22.974 0 0 1 1.795-.151zm-7.917 0c.687-.019 1.344 0 1.71.053.623.1 1.063.255 1.47.523.834.55 1.271 1.57 1.166 2.703-.078.802-.33 1.392-.8 1.872-.462.47-1.042.759-1.842.918-.301.059-.45.071-1.04.071h-.69l-.007 1.675L2 16.748l-1.002.013H0l.006-4.66.01-4.662.14-.024c.483-.084 1.2-.137 1.886-.157Zm.78 1.62c-.283 0-.57 0-.645.019a.968.968 0 0 0-.162.045c-.018.013-.03.526-.03 1.398v1.38l.117.025c.214.043.937.024 1.148-.03.778-.206 1.19-.774 1.144-1.573-.034-.6-.32-.987-.875-1.186-.158-.059-.263-.071-.697-.078Zm8.244 0a5.62 5.62 0 0 0-.725.015 1.973 1.973 0 0 0-.254.043c-.031.013-.04.651-.04 3.057 0 2.87.002 3.045.055 3.066.096.041 1.188.026 1.417-.021 1.24-.243 2-1.036 2.233-2.329a5.674 5.674 0 0 0 .05-1.389c-.056-.46-.137-.743-.317-1.11-.142-.279-.198-.359-.443-.598-.372-.366-.72-.55-1.29-.68a4.624 4.624 0 0 0-.686-.055z' ) .control-field - label.control-field__title Layout + label.control-field__title #{ t_('Layout') } .control-field__row button#layout-comfortable.control__button.first__button( - title='Comfortable layout', + title=`${ t_('Comfortable') }`, disabled ) svg( @@ -367,7 +365,7 @@ html(lang=lang) d='M19 2a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h14zm0 4V4H5v2h14zm0 10a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2a2 2 0 0 1 2-2h14zm0 4v-2H5v2h14zm0-11a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2a2 2 0 0 1 2-2h14zm0 4v-2H5v2h14z' ) button#layout-compact.control__button( - title='Compact layout', + title=`${ t_('Compact') }`, disabled ) svg( @@ -434,13 +432,13 @@ html(lang=lang) h2.grid-item__title #{ icon.localizedTitle || icon.title } .grid-item__footer button( - class=`grid-item__color copy-button copy-color ${icon.light ? "contrast-light" : "contrast-dark"} ${icon.superLight ? "border-light" : ""} ${icon.superDark ? "border-dark" : ""}`, + class=`grid-item__color copy-button copy-color ${icon.light ? "contrast-light" : "contrast-dark"}`, style=`background-color: #${icon.shortHex}`, title=`${ t_('$iconTitle color').replace('$iconTitle', icon.localizedTitle || icon.title) }`, disabled ) ##{ icon.hex } button.grid-item__button.view-button( - title=`${icon.title} view`, + title=`${ t_('view $iconTitle').replace('$iconTitle', icon.title) }`, index=`${icon.indexByAlpha}` ) svg( @@ -456,25 +454,15 @@ html(lang=lang) role='button', download ) - svg( - role='img', - xmlns='http://www.w3.org/2000/svg', - viewBox='0 0 24 24' - ) - path( - d='M11.2 0a.8.8 0 0 0-.8.8v11.4L7.26 9.44a.803.803 0 0 0-1.13.074l-1.05 1.2a.8.8 0 0 0 .073 1.13l6.33 5.54a.795.795 0 0 0 1.05 0l6.32-5.54a.8.8 0 0 0 .074-1.13l-1.05-1.2a.804.804 0 0 0-1.13-.074l-3.14 2.76V.8a.8.8 0 0 0-.8-.8zm-8 20.8a.8.8 0 0 0-.8.8v1.6a.8.8 0 0 0 .8.8h17.6a.8.8 0 0 0 .8-.8v-1.6a.8.8 0 0 0-.8-.8z' - ) - a.report__icon.grid-item__button( + svg(role='img', viewBox='0 0 24 24') + use(href='#cp') + button.report__icon.grid-item__button( href=`https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, role='button', - title=`Report ${icon.title} as outdated` + title=`${ t_('Report $iconTitle as outdated').replace('$iconTitle', icon.localizedTitle || icon.title) }` ) - svg( - role='img', - xmlns='http://www.w3.org/2000/svg', - viewBox='0 0 24 24' - ) - path(d='M7 2h2v20H7V2m12 7-8 5.6V3.4L19 9Z') + svg(role='img', viewBox='0 0 24 24') + use(href='#fg') footer.footer .footer-description //- prettier-ignore diff --git a/public/removed.pug b/public/removed.pug index 4c834818..54eb2771 100644 --- a/public/removed.pug +++ b/public/removed.pug @@ -35,7 +35,7 @@ html(lang='en-US') li.grid-item .grid-item__row.mv-2.fg-2 button( - class=`grid-item__color copy-button copy-color ${icon.light ? "contrast-light" : "contrast-dark"} ${icon.superLight ? "border-light" : ""} ${icon.superDark ? "border-dark" : ""}`, + class=`grid-item__color copy-button copy-color ${icon.light ? "contrast-light" : "contrast-dark"}`, style=`background-color: #${icon.hex}`, title=`${icon.title} color`, disabled diff --git a/public/scripts/copy.js b/public/scripts/copy.js index 724eb0fc..78af6a38 100644 --- a/public/scripts/copy.js +++ b/public/scripts/copy.js @@ -22,7 +22,7 @@ export default (document, navigator, fetch) => { const onClickColorButton = (event) => { event.preventDefault(); - copyValue(event.target.innerHTML); + copyValue(event.target.innerText); setCopied(event.target); }; diff --git a/public/scripts/data.js b/public/scripts/data.js new file mode 100644 index 00000000..48e8f456 --- /dev/null +++ b/public/scripts/data.js @@ -0,0 +1,58 @@ +const TITLE_TO_SLUG_REPLACEMENTS = { + '+': 'plus', + '.': 'dot', + '&': 'and', + đ: 'd', + ħ: 'h', + ı: 'i', + ĸ: 'k', + ŀ: 'l', + ł: 'l', + ß: 'ss', + ŧ: 't', +}; + +const TITLE_TO_SLUG_CHARS_REGEX = RegExp( + `[${Object.keys(TITLE_TO_SLUG_REPLACEMENTS).join('')}]`, + 'g', +); + +const TITLE_TO_SLUG_RANGE_REGEX = /[^a-z0-9]/g; + +/** + * Converts a brand title into a slug/filename. + * @param {String} title The title to convert + */ +const titleToSlug = (title) => + title + .toLowerCase() + .replace( + TITLE_TO_SLUG_CHARS_REGEX, + (char) => TITLE_TO_SLUG_REPLACEMENTS[char], + ) + .normalize('NFD') + .replace(TITLE_TO_SLUG_RANGE_REGEX, ''); + +const SIMPLE_ICONS_DATA = {}; + +export const getIconData = (slug) => SIMPLE_ICONS_DATA[slug]; + +const initIconsData = async () => { + const [iconsDataResponse, icons] = await Promise.all([ + fetch('/simple-icons.json'), + import('simple-icons/icons'), + ]); + const iconsData = await iconsDataResponse.json(); + + for (const iconData of iconsData.icons) { + const slug = iconData.slug || titleToSlug(iconData.title); + const capitalizedSlug = slug.charAt(0).toUpperCase() + slug.slice(1); + const icon = icons[`si${capitalizedSlug}`]; + if (iconData.aliases) { + icon.aliases = iconData.aliases; + } + SIMPLE_ICONS_DATA[slug] = icon; + } +}; + +export default initIconsData; diff --git a/public/scripts/dom-utils.js b/public/scripts/dom-utils.js index f779479f..278560db 100644 --- a/public/scripts/dom-utils.js +++ b/public/scripts/dom-utils.js @@ -44,14 +44,14 @@ export const addClass = ($el, clazz) => { } }; -export const removeClass = ($el, clazz) => { +export const removeClass = ($el, ...clazz) => { if ($el) { - $el.classList.remove(clazz); + for (const c of clazz) { + $el.classList.remove(c); + } } }; -export const removeClasses = removeClass; - export const toggleClass = ($el, clazz) => { if ($el) { $el.classList.toggle(clazz); diff --git a/public/scripts/download-type.js b/public/scripts/download-type.js index 065b1b72..71063247 100644 --- a/public/scripts/download-type.js +++ b/public/scripts/download-type.js @@ -15,9 +15,7 @@ export default (document, storage) => { const $body = document.querySelector('body'); const $downloadPdf = document.getElementById('download-pdf'); const $downloadSvg = document.getElementById('download-svg'); - const $downloadFiles = document.getElementsByClassName( - 'grid-item__button[data-icon]', - ); + const $downloadFiles = document.getElementsByClassName('a.grid-item__button'); $downloadPdf.disabled = false; $downloadSvg.disabled = false; @@ -55,7 +53,8 @@ export default (document, storage) => { for (let i = 0; i < $downloadFiles.length; i++) { $downloadFiles[i].addEventListener('click', (event) => { - const slug = iconHrefToSlug(event.target.getAttribute('href')); + const href = event.target.getAttribute('href'); + const slug = iconHrefToSlug(href); const type = storage.getItem(STORAGE_KEY_DOWNLOAD_TYPE); event.target.setAttribute('href', `./icons/${slug}.${type}`); }); diff --git a/public/scripts/index.js b/public/scripts/index.js index ef34955c..9fc3d2e2 100644 --- a/public/scripts/index.js +++ b/public/scripts/index.js @@ -34,9 +34,16 @@ const detachedInitDownloadType = async () => { initDownloadType(document, storage); }; -const detachedInitModal = async () => { +const detachedInitData = async () => { + const iconsData = await import('./data.js'); + const { default: initData } = iconsData; + initData(); + return iconsData; +}; + +const detachedInitModal = async (iconsData) => { const { default: initModal } = await import('./modal.js'); - initModal(document, domUtils); + initModal(document, domUtils, iconsData); }; const detachedInitLayout = async () => { @@ -44,9 +51,12 @@ const detachedInitLayout = async () => { initLayout(document, storage); }; -detachedInitColorScheme(); -detachedInitCopyButtons(); -detachedInitSearch(); -detachedInitDownloadType(); -detachedInitModal(); -detachedInitLayout(); +(async () => { + detachedInitColorScheme(); + detachedInitCopyButtons(); + detachedInitSearch(); + detachedInitDownloadType(); + const iconsData = await detachedInitData(); + detachedInitModal(iconsData); + detachedInitLayout(); +})(); diff --git a/public/scripts/modal.js b/public/scripts/modal.js index e3e6b8f5..8a33d0e3 100644 --- a/public/scripts/modal.js +++ b/public/scripts/modal.js @@ -1,11 +1,6 @@ -import * as simpleIcons from 'simple-icons/icons'; import getRelativeLuminance from 'get-relative-luminance'; -const icons = Object.values(simpleIcons).sort((icon1, icon2) => - icon1.title.localeCompare(icon2.title), -); - -export default (document, domUtils) => { +export default (document, domUtils, iconsData) => { const $modalTrigger = document.querySelector('.popup-trigger'); const $popupModal = document.querySelector('.popup_modal'); const $popupBody = document.querySelector('.popup-body'); @@ -19,99 +14,75 @@ export default (document, domUtils) => { const $detailModal = document.querySelector('.detail_modal'); const $detailBody = document.querySelector('.detail-body'); const $detailFooter = document.querySelector('.detail-footer'); - $detailButtons.forEach((button) => - button.addEventListener('click', (e) => { - domUtils.toggleVisibleElement($detailModal); - const index = e.target.getAttribute('index'); - const icon = icons[index]; - const luminance = getRelativeLuminance(`#${icon.hex}`); - const $iconHex = $detailBody.querySelector('#icon-hex'); - domUtils.removeClasses( - $iconHex, - 'contrast-light', - 'contrast-dark', - 'border-light', - 'border-dark', - ); - domUtils.addClass( - $iconHex, - luminance < 0.4 ? 'contrast-light' : 'contrast-dark', - ); - if (luminance > 0.95) domUtils.addClass($iconHex, 'border-light'); - if (luminance < 0.02) domUtils.addClass($iconHex, 'border-dark'); - $detailBody - .querySelector('#icon-hex') - .setAttribute('style', `background-color: #${icon.hex}`); - $iconHex.innerHTML = icon.hex; - $detailBody.querySelector('#icon_container').innerHTML = icon.svg; - $detailBody.querySelector('#icon-title').innerHTML = icon.title; + const onClickDetailButton = (e) => { + const $iconGridItem = e.target.closest('.grid-item'); + const $iconImage = $iconGridItem.children[0].children[0].children[0]; + const filename = $iconImage.getAttribute('src').split('/').pop(); + const slug = filename.substring(0, filename.length - 4); + const icon = iconsData.getIconData(slug); - $detailBody - .querySelector('#icon-source') - .setAttribute('href', icon.source); - $detailBody.querySelector('#icon-source').innerHTML = icon.source.slice( - 0, - 25, - ); + domUtils.toggleVisibleElement($detailModal); + + const luminance = getRelativeLuminance.default(`#${icon.hex}`); + const $hexContainer = $detailBody.querySelector('#icon-color'); + + $hexContainer.setAttribute( + 'style', + `background-color: #${icon.hex}; color: #${ + luminance < 0.4 ? 'eee' : '222' + }`, + ); + $hexContainer.innerText = `#${icon.hex}`; + $detailBody.querySelector('img#icon-preview').src = $iconImage.src; + $detailBody.querySelector('#icon-title').innerText = icon.title; + $detailBody.querySelector('#icon-source').setAttribute('href', icon.source); - if (icon.guidelines) { - $detailBody.querySelector('#icon-guidelines').innerHTML = 'Guidelines'; - domUtils.removeClass( - $detailBody.querySelector('#icon-guidelines'), - 'italic-text', - ); - $detailBody - .querySelector('#icon-guidelines') - .setAttribute('href', icon.guidelines); - } else { - domUtils.addClass( - $detailBody.querySelector('#icon-guidelines'), - 'italic-text', - ); - $detailBody.querySelector('#icon-guidelines').innerHTML = - 'no guidelines'; - } + const $iconGuidelines = $detailBody.querySelector('#icon-guidelines'); + if (icon.guidelines) { + $iconGuidelines.innerHTML = 'Guidelines'; + domUtils.removeClass($iconGuidelines, 'italic-text'); + $iconGuidelines.setAttribute('href', icon.guidelines); + } else { + domUtils.addClass($iconGuidelines, 'italic-text'); + $iconGuidelines.innerHTML = 'no guidelines'; + } + + const $iconLicense = $detailBody.querySelector('#icon-license'); + if (icon.license) { + $iconLicense.setAttribute('href', icon.license.url); + domUtils.removeClass($iconLicense, 'italic-text'); + $iconLicense.innerHTML = icon.license.type; + } else { + domUtils.addClass($iconLicense, 'italic-text'); + $iconLicense.innerHTML = 'no license'; + } - if (icon.license) { - $detailBody - .querySelector('#icon-license') - .setAttribute('href', icon.license.url); - domUtils.removeClass( - $detailBody.querySelector('#icon-license'), - 'italic-text', - ); - $detailBody.querySelector('#icon-license').innerHTML = - icon.license.type; - } else { - domUtils.addClass( - $detailBody.querySelector('#icon-license'), - 'italic-text', - ); - $detailBody.querySelector('#icon-license').innerHTML = 'no license'; - } + const iconSVG = icon.svg.replace('svg', `svg fill="%23${icon.hex}"`); + const colorSVG = `data:image/svg+xml,${iconSVG}`; - const iconSVG = icon.svg.replace('svg', `svg fill="%23${icon.hex}"`); - const colorSVG = `data:image/svg+xml,${iconSVG}`; + $detailFooter + .querySelector('#icon-download-svg') + .setAttribute('href', `./icons/${icon.slug}.svg`); + $detailFooter + .querySelector('#icon-download-color-svg') + .setAttribute('href', colorSVG); + $detailFooter + .querySelector('#icon-download-pdf') + .setAttribute('href', `./icons/${icon.slug}.pdf`); + $detailFooter + .querySelector('#icon-report') + .setAttribute( + 'href', + `https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, + ); + + e.stopPropagation(); + }; - $detailFooter - .querySelector('#icon-download-svg') - .setAttribute('href', `./icons/${icon.slug}.svg`); - $detailFooter - .querySelector('#icon-download-color-svg') - .setAttribute('href', colorSVG); - $detailFooter - .querySelector('#icon-download-pdf') - .setAttribute('href', `./icons/${icon.slug}.pdf`); - $detailFooter - .querySelector('#icon-report') - .setAttribute( - 'href', - `https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, - ); - e.stopPropagation(); - }), - ); + for (const $detailButton of $detailButtons) { + $detailButton.addEventListener('click', onClickDetailButton); + } document.addEventListener('keyup', (e) => { if (e.key === 'Escape') { diff --git a/public/stylesheet.css b/public/stylesheet.css index c8d44d34..1bdc69f6 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -70,37 +70,6 @@ --lm-color-link-visited: rgb(85, 26, 139); } -.icon-left { - width: 50%; - height: auto; - float: left; - padding: 5px; -} - -.icon-right { - padding: 5px; -} - -.detail-footer { - width: 100%; - height: auto; - display: flex; -} - -.detail-footer a:hover { - color: var(--color-button-text-hover); - background: var(--color-button-hover); -} - -.italic-text { - font-style: italic; -} - -.detail-body { - padding-top: 5px; - display: flex; -} - @media (max-width: 1280px) { :root { --side-offset: 3rem; @@ -252,51 +221,6 @@ a { } /* Modal */ -.detail_modal { - width: 400px; - height: auto; - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - border: 0.13rem solid var(--color-button-border); - z-index: 101; - background-color: var(--color-background); - border-radius: var(--border-radius-large); -} -.popup__top { - top: calc(var(--header-top-offset) + 65px); - right: var(--side-offset); -} -@media (max-width: 860px) { - .popup__top { - top: calc(var(--header-top-offset) + 65px); - } -} -@media (max-width: 640px) { - .popup__top { - top: calc(var(--header-top-offset) + 65px); - } -} - -.popup-trigger { - display: inline-block; -} - -.popup_modal { - background-color: #fff; - position: absolute; - border: 0.13rem solid var(--color-button-border); - z-index: 100; - background-color: var(--color-background); - border-radius: var(--border-radius-large); -} - -.popup__close { - font-size: 1.2rem; - cursor: pointer; - z-index: 100; -} /* Extensions */ .extensions__table { @@ -770,7 +694,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .layout-comfortable .grid-item__color { border-top: 1px solid var(--color-grid-item-divider); - color: #000; flex-grow: 2; font-family: var(--font-family-stylized); font-size: 0.75rem; @@ -783,7 +706,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .layout-compact .grid-item__color { border-top: 1px solid var(--color-grid-item-divider); - color: #000; flex-grow: 2; font-family: var(--font-family-stylized); font-size: 0.75rem; @@ -798,10 +720,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { top: 1.21rem; } -.grid-item__color.contrast-light { - color: #fff; -} - .layout-comfortable .grid-item__button { fill: var(--color-button-active); border-top: 1px solid var(--color-grid-item-divider); @@ -1091,6 +1009,134 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { color: var(--color-text-light); } +.detail_modal { + width: 600px; + height: 320px; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border: 0.13rem solid var(--color-button-border); + z-index: 101; + background-color: var(--color-background); + border-radius: var(--border-radius-large); + padding: 5px; +} + +.detail-body { + padding: 10px; + display: flex; +} + +.detail-body__left, +.detail-body__right { + width: 50%; + height: auto; + float: left; + padding: 5px; + display: block; +} + +.detail-body__right > * { + display: block; +} + +.detail_modal #icon-preview { + width: 80%; + position: relative; + top: 15px; + left: 25px; + margin-bottom: 20px; +} + +.detail_modal #icon-title { + font-size: 26px; + font-family: var(--font-family-text); + font-weight: bold; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + top: 20px; + padding: 6px 0px; +} + +.detail_modal #icon-color { + font-family: var(--font-family-text); + font-size: 15px; + font-weight: 600; + padding: 0px 4px; + margin-bottom: 15px; +} + +.detail_modal #icon-guidelines, +.detail_modal #icon-license { + font-style: italic; + font-size: 16px; + padding: 6px 0; +} + +.detail_modal #icon-guidelines.italic-text:hover, +.detail_modal #icon-license.italic-text:hover { + cursor: default; +} + +.detail-footer { + width: auto; + margin: 0 auto; + display: flex; + justify-content: space-around; + height: 30px; +} + +.detail-footer a { + color: var(--color-button-text); + padding: 3px 7px; + border-radius: 3px; +} + +.detail-footer a:hover { + color: var(--color-button-text-hover); + background: var(--color-button-hover); +} + +.italic-text { + font-style: italic; +} + +.popup__top { + top: calc(var(--header-top-offset) + 65px); + right: var(--side-offset); +} +@media (max-width: 860px) { + .popup__top { + top: calc(var(--header-top-offset) + 65px); + } +} +@media (max-width: 640px) { + .popup__top { + top: calc(var(--header-top-offset) + 65px); + } +} + +.popup-trigger { + display: inline-block; +} + +.popup_modal { + background-color: #fff; + position: absolute; + border: 0.13rem solid var(--color-button-border); + z-index: 100; + background-color: var(--color-background); + border-radius: var(--border-radius-large); +} + +.popup__close { + font-size: 1.2rem; + cursor: pointer; + z-index: 100; +} + /* Utility */ .fg-2 { @@ -1106,3 +1152,11 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { height: 0; width: 0; } + +.contrast-light { + color: #eee; +} + +.contrast-dark { + color: #222; +} diff --git a/scripts/https.js b/scripts/https.js index e6db3b24..3bf3abdf 100644 --- a/scripts/https.js +++ b/scripts/https.js @@ -5,18 +5,16 @@ import https from 'node:https'; -export const GET = (hostname, path) => { +export const GET = (hostname, path, options) => { return new Promise((resolve, reject) => { - const options = { + const requestOptions = { hostname, path, method: 'GET', - headers: { - 'user-agent': 'simple-icons-website', - }, }; - const req = https.request(options, (res) => { + const opts = Object.assign(requestOptions, options); + const req = https.request(opts, (res) => { let result = ''; res.on('data', (chunk) => { @@ -36,18 +34,15 @@ export const GET = (hostname, path) => { }); }; -export const POST = (hostname, path, data) => { +export const POST = (hostname, path, data, options) => { return new Promise((resolve, reject) => { - const options = { + const requestOptions = { hostname, path, method: 'POST', - headers: { - 'user-agent': 'simple-icons-website', - }, }; - - const req = https.request(options, (res) => { + const opts = Object.assign(requestOptions, options); + const req = https.request(opts, (res) => { let result = ''; res.on('data', (chunk) => { @@ -68,13 +63,28 @@ export const POST = (hostname, path, data) => { }); }; +const fillGithubOptions = (options) => { + const ghToken = process.env.GITHUB_TOKEN; + + if (!options.headers) { + options.headers = {}; + } + options.headers['User-Agent'] = 'simple-icons-website'; + + if (ghToken) { + options.headers.Authorization = `token ${ghToken}`; + } +}; + /* eslint-disable require-await */ export const githubAPI = { - GET: async (path) => { - return GET('api.github.com', path); + GET: async (path, options = {}) => { + fillGithubOptions(options); + return GET('api.github.com', path, options); }, - POST: async (path, data) => { - return POST('api.github.com', path, data); + POST: async (path, data, options = {}) => { + fillGithubOptions(options); + return POST('api.github.com', path, data, options); }, }; /* eslint-enable require-await */ diff --git a/webpack.config.js b/webpack.config.js index b899c3d3..9963181f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -217,7 +217,6 @@ const generateStructuredData = async () => { siMembersFileContent = await fs.readFile(siMembersCachePath, 'utf8'); } catch (error) { const siOrgMembers = await githubAPI.GET('/orgs/simple-icons/members'); - const users = await Promise.all( siOrgMembers.map(async (member) => Object.assign(member, await githubAPI.GET(`/users/${member.login}`)), @@ -352,6 +351,13 @@ export default async (env, argv) => { plugins: [ new CopyPlugin({ patterns: [ + { + from: path.resolve( + NODE_MODULES, + 'simple-icons/_data/simple-icons.json', + ), + to: path.resolve(OUT_DIR, 'simple-icons.json'), + }, { from: path.resolve(NODE_MODULES, 'simple-icons/icons'), to: path.resolve(OUT_DIR, 'icons'), From e117043ae5415103d8cc59fa8b937caacbe82f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 16:14:46 +0200 Subject: [PATCH 03/14] Remove 'removed.pug' --- public/removed.pug | 67 ---------------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 public/removed.pug diff --git a/public/removed.pug b/public/removed.pug deleted file mode 100644 index 54eb2771..00000000 --- a/public/removed.pug +++ /dev/null @@ -1,67 +0,0 @@ -doctype html -html(lang='en-US') - head - meta(charset='UTF-8') - meta( - content='initial-scale=1, shrink-to-fit=no, width=device-width', - name='viewport' - ) - link(rel='preconnect', href='https://fonts.gstatic.com') - title #{ pageTitle } - meta(name='description', content=pageDescription) - meta(property='og:type', content='website') - meta(property='og:title', content=pageTitle) - meta(property='og:description', content=pageDescription) - meta(property='og:url', content=pageUrl) - meta(property='og:site_name', content=pageTitle) - meta(property='og:image', content=`${pageUrl}/images/og.png`) - link(rel='icon', type='image/x-icon', href=`${pageUrl}/images/favicon.ico`) - link(rel='icon', type='image/png', href=`${pageUrl}/images/favicon.png`) - link(rel='apple-touch-icon', href=`${pageUrl}/images/apple-touch-icon.png`) - link(rel='mask-icon', href=`${pageUrl}/images/logo.svg`, color='#111111') - link( - rel='stylesheet', - href='https://fonts.googleapis.com/css2?family=Open+Sans:wght@600&family=Roboto+Mono:wght@400;600&display=swap' - ) - link(rel='license', href='license.txt') - link(rel='canonical', href=pageUrl) - - body.no-js.removed - .header - p.control-field__title Removed icons - main.main.no-header - ul.grid.grid-top-padding - each icon in removedIcons - li.grid-item - .grid-item__row.mv-2.fg-2 - button( - class=`grid-item__color copy-button copy-color ${icon.light ? "contrast-light" : "contrast-dark"}`, - style=`background-color: #${icon.hex}`, - title=`${icon.title} color`, - disabled - ) #{ icon.hex } - button.grid-item__preview.copy-button.copy-svg( - title=`${icon.title} SVG`, - disabled - ) - if (icon.path) - svg.icon-preview( - role='img', - viewBox='0 0 24 24', - xmlns='http://www.w3.org/2000/svg', - alt=`${icon.title} icon` - ) - path(fill=`#${icon.hex}`, d=`${icon.path}`) - else - svg.icon-preview( - role='img', - viewBox='0 0 24 24', - xmlns='http://www.w3.org/2000/svg', - alt=`${icon.title} icon` - ) - path( - fill='#DDDDDD', - d='M 11.455899,0.00555608 C 10.337678,0.07713592 9.6134609,0.19580776 8.6978704,0.4557556 5.4501509,1.3768751 2.7108843,3.673081 1.2117925,6.72841 0.56637626,8.0432186 0.18362942,9.4258398 0.03540883,10.96669 c -0.05816251,0.623498 -0.04315283,1.748055 0.03377178,2.401692 0.26642182,2.273602 1.14261189,4.375789 2.56477909,6.150215 0.3808706,0.476571 1.0412965,1.162231 1.4859583,1.546501 1.8368096,1.582292 4.0000797,2.550503 6.369733,2.850008 0.568492,0.07158 0.829285,0.08665 1.529111,0.08477 0.733598,0 1.060059,-0.0226 1.688589,-0.113021 2.078841,-0.295738 4.037604,-1.132092 5.69805,-2.431831 0.788008,-0.615963 1.58915,-1.43348 2.197042,-2.243463 1.283327,-1.706614 2.076964,-3.699547 2.328376,-5.843175 0.07692,-0.653637 0.09193,-1.778194 0.03377,-2.401692 -0.0394,-0.403108 -0.10882,-0.902283 -0.174487,-1.2432288 C 23.09403,6.1030282 20.754396,2.9949562 17.45039,1.3034116 16.084509,0.60456632 14.637951,0.18827304 13.060059,0.041346 12.763617,0.0130908 11.696054,-0.01139704 11.455899,0.00555608 Z m 0.981258,3.84082352 c 1.371509,0.050859 2.874354,0.5726387 4.056366,1.407109 0.300194,0.2109721 0.617273,0.4690363 0.598511,0.4841057 -0.01689,0.01507 -5.382847,3.9387749 -10.274126,7.5139997 -1.2364224,0.904166 -2.2552044,1.642569 -2.2627093,1.642569 -0.033772,0 -0.2495359,-0.717682 -0.339594,-1.130208 C 3.7840764,11.795509 4.1067845,9.648114 5.1011758,7.90571 5.6640388,6.916778 6.4445422,6.0314484 7.3376181,5.3721604 8.4464583,4.5546433 9.7072714,4.049817 11.071276,3.8840532 c 0.260793,-0.032023 0.833037,-0.062161 1.003772,-0.054627 0.05629,0.00377 0.219517,0.011302 0.362109,0.016953 z m 7.082693,5.4476026 c 0.529091,1.5088278 0.594758,3.2116748 0.181992,4.8184538 -0.230774,0.896631 -0.619149,1.76124 -1.138859,2.533549 -0.470929,0.698845 -1.076945,1.348715 -1.750504,1.874262 -1.804914,1.41276 -4.174568,1.966562 -6.407257,1.495642 C 9.4164588,19.808684 8.5083732,19.424413 7.6565738,18.857426 7.3676375,18.66529 6.9811382,18.369552 6.9811382,18.341297 c 0,-0.01507 12.4617868,-9.1509172 12.4880538,-9.1528009 0.0075,-0.00188 0.02814,0.047092 0.05066,0.1054861 z' - ) - .grid-item__row - h2.grid-item__title(title=`${icon.title}`) #{ icon.title } From 9a5076056dddb4c2e61dade835299776cc093bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 17:00:37 +0200 Subject: [PATCH 04/14] Fix some errors --- public/index.pug | 3 ++- public/scripts/modal.js | 16 ++++++++-------- public/stylesheet.css | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/public/index.pug b/public/index.pug index 14b5010d..cae079c7 100644 --- a/public/index.pug +++ b/public/index.pug @@ -71,7 +71,7 @@ html(lang=lang) .detail-body__left img#icon-preview .detail-body__right - h2#icon-title.grid-item__title + h2#icon-title button#icon-color a#icon-source a#icon-guidelines @@ -81,6 +81,7 @@ html(lang=lang) a#icon-download-color-svg.detail-button(role='button', download) #{ t_('Download colored SVG') } a#icon-download-pdf.detail-button(role='button', download) #{ t_('Download PDF') } a#icon-report.report__icon.detail-button(role='button') #{ t_('Report icon as outdated') } + header.header ul.header__list li.header__list-item diff --git a/public/scripts/modal.js b/public/scripts/modal.js index 8a33d0e3..76d9f229 100644 --- a/public/scripts/modal.js +++ b/public/scripts/modal.js @@ -1,12 +1,11 @@ import getRelativeLuminance from 'get-relative-luminance'; export default (document, domUtils, iconsData) => { - const $modalTrigger = document.querySelector('.popup-trigger'); + const $popupModalTrigger = document.querySelector('.popup-trigger'); const $popupModal = document.querySelector('.popup_modal'); const $popupBody = document.querySelector('.popup-body'); - $modalTrigger.addEventListener('click', (e) => { + $popupModalTrigger.addEventListener('click', () => { domUtils.toggleVisibleElement($popupModal); - e.stopPropagation(); }); // Detail view @@ -22,7 +21,9 @@ export default (document, domUtils, iconsData) => { const slug = filename.substring(0, filename.length - 4); const icon = iconsData.getIconData(slug); - domUtils.toggleVisibleElement($detailModal); + if ($detailModal.classList.contains('hidden')) { + domUtils.toggleVisibleElement($detailModal); + } const luminance = getRelativeLuminance.default(`#${icon.hex}`); const $hexContainer = $detailBody.querySelector('#icon-color'); @@ -76,8 +77,6 @@ export default (document, domUtils, iconsData) => { 'href', `https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, ); - - e.stopPropagation(); }; for (const $detailButton of $detailButtons) { @@ -92,10 +91,11 @@ export default (document, domUtils, iconsData) => { }); document.addEventListener('click', (e) => { - if (!e.composedPath().includes($popupBody)) { + const composedPath = e.composedPath(); + if (!composedPath.includes($popupBody)) { domUtils.hideElement($popupModal); } - if (!e.composedPath().includes($detailModal)) { + if (!composedPath.includes($detailModal)) { domUtils.hideElement($detailModal); } }); diff --git a/public/stylesheet.css b/public/stylesheet.css index 1bdc69f6..fa6b12fa 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1010,7 +1010,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { } .detail_modal { - width: 600px; + width: 610px; height: 320px; position: fixed; top: 50%; @@ -1045,7 +1045,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { width: 80%; position: relative; top: 15px; - left: 25px; + left: 20px; margin-bottom: 20px; } From 108ea1db56176896eb94087489345f8b90081339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 17:10:44 +0200 Subject: [PATCH 05/14] Fix errors --- public/scripts/modal.js | 20 ++++++++++++++++---- public/stylesheet.css | 6 ++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/public/scripts/modal.js b/public/scripts/modal.js index 76d9f229..6570b2e8 100644 --- a/public/scripts/modal.js +++ b/public/scripts/modal.js @@ -1,12 +1,11 @@ import getRelativeLuminance from 'get-relative-luminance'; +let DETAILS_MODAL_OPENED = false; + export default (document, domUtils, iconsData) => { const $popupModalTrigger = document.querySelector('.popup-trigger'); const $popupModal = document.querySelector('.popup_modal'); const $popupBody = document.querySelector('.popup-body'); - $popupModalTrigger.addEventListener('click', () => { - domUtils.toggleVisibleElement($popupModal); - }); // Detail view const $detailButtons = document.querySelectorAll('.view-button'); @@ -14,14 +13,23 @@ export default (document, domUtils, iconsData) => { const $detailBody = document.querySelector('.detail-body'); const $detailFooter = document.querySelector('.detail-footer'); + $popupModalTrigger.addEventListener('click', (e) => { + domUtils.toggleVisibleElement($popupModal); + e.stopPropagation(); + domUtils.hideElement($detailModal); + DETAILS_MODAL_OPENED = false; + }); + const onClickDetailButton = (e) => { + domUtils.hideElement($popupModal); + const $iconGridItem = e.target.closest('.grid-item'); const $iconImage = $iconGridItem.children[0].children[0].children[0]; const filename = $iconImage.getAttribute('src').split('/').pop(); const slug = filename.substring(0, filename.length - 4); const icon = iconsData.getIconData(slug); - if ($detailModal.classList.contains('hidden')) { + if (!DETAILS_MODAL_OPENED) { domUtils.toggleVisibleElement($detailModal); } @@ -77,6 +85,9 @@ export default (document, domUtils, iconsData) => { 'href', `https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, ); + + DETAILS_MODAL_OPENED = true; + e.stopPropagation(); }; for (const $detailButton of $detailButtons) { @@ -97,6 +108,7 @@ export default (document, domUtils, iconsData) => { } if (!composedPath.includes($detailModal)) { domUtils.hideElement($detailModal); + DETAILS_MODAL_OPENED = false; } }); }; diff --git a/public/stylesheet.css b/public/stylesheet.css index fa6b12fa..17fcc2be 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1047,6 +1047,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { top: 15px; left: 20px; margin-bottom: 20px; + cursor: default; } .detail_modal #icon-title { @@ -1066,6 +1067,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { font-weight: 600; padding: 0px 4px; margin-bottom: 15px; + cursor: default; } .detail_modal #icon-guidelines, @@ -1075,8 +1077,8 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { padding: 6px 0; } -.detail_modal #icon-guidelines.italic-text:hover, -.detail_modal #icon-license.italic-text:hover { +.detail_modal #icon-guidelines.italic-text, +.detail_modal #icon-license.italic-text { cursor: default; } From 92077b484cee93f6ccb083b5bf155c1543f164a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 17:16:53 +0200 Subject: [PATCH 06/14] Fix error --- locales/es.po | 21 +++++++++------------ public/stylesheet.css | 5 ++--- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/locales/es.po b/locales/es.po index 1fbf432a..f430d41c 100644 --- a/locales/es.po +++ b/locales/es.po @@ -130,31 +130,28 @@ msgid "Removal at $version" msgstr "Se elimina en $version" msgid "Layout" -msgstr "" +msgstr "Diseño" msgid "Comfortable" -msgstr "" +msgstr "Confortable" msgid "Compact" -msgstr "" +msgstr "Compacto" msgid "view $iconTitle" -msgstr "" +msgstr "ver $iconTitle" msgid "Download SVG" -msgstr "" +msgstr "Descargar SVG" msgid "Download colored SVG" -msgstr "" +msgstr "Descargar SVG coloreado" msgid "Download PDF" -msgstr "" +msgstr "Descargar PDF" msgid "Report $iconTitle as outdated" -msgstr "" +msgstr "Reportar $iconTitle como desactualizado" msgid "Report icon as outdated" -msgstr "" - -#~ msgid "Report outdated" -#~ msgstr "" +msgstr "Reportar icono desactualizado" diff --git a/public/stylesheet.css b/public/stylesheet.css index 17fcc2be..2aaabf98 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1011,7 +1011,8 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal { width: 610px; - height: 320px; + min-height: 320px; + max-height: 360px; position: fixed; top: 50%; left: 50%; @@ -1034,7 +1035,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { height: auto; float: left; padding: 5px; - display: block; } .detail-body__right > * { @@ -1087,7 +1087,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { margin: 0 auto; display: flex; justify-content: space-around; - height: 30px; } .detail-footer a { From 95f5e79c354ea0676c0cb2e198a1150dd4251211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 19:53:09 +0200 Subject: [PATCH 07/14] Add deprecation note into detail view --- locales/zh-CN.po | 27 +++++++++++++++++++++++++++ public/index.pug | 6 +++++- public/scripts/modal.js | 17 +++++++++++++++++ public/stylesheet.css | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 81 insertions(+), 2 deletions(-) diff --git a/locales/zh-CN.po b/locales/zh-CN.po index 3568d9a5..59f200c0 100644 --- a/locales/zh-CN.po +++ b/locales/zh-CN.po @@ -128,3 +128,30 @@ msgstr "项目地址" msgid "Made with ❤️ on GitHub" msgstr "Made with ❤️ on GitHub" + +msgid "Download SVG" +msgstr "" + +msgid "Download colored SVG" +msgstr "" + +msgid "Download PDF" +msgstr "" + +msgid "Report icon as outdated" +msgstr "" + +msgid "Layout" +msgstr "" + +msgid "Comfortable" +msgstr "" + +msgid "Compact" +msgstr "" + +msgid "view $iconTitle" +msgstr "" + +msgid "Report $iconTitle as outdated" +msgstr "" diff --git a/public/index.pug b/public/index.pug index cae079c7..d6b4d8f0 100644 --- a/public/index.pug +++ b/public/index.pug @@ -76,6 +76,9 @@ html(lang=lang) a#icon-source a#icon-guidelines a#icon-license + #icon-deprecated(style='display: none') + span.deprecated__text #{ t_('Deprecated') } + a.deprecated__message(target='_blank') .detail-footer a#icon-download-svg.detail-button(role='button', download) #{ t_('Download SVG') } a#icon-download-color-svg.detail-button(role='button', download) #{ t_('Download colored SVG') } @@ -396,7 +399,8 @@ html(lang=lang) li.grid-item( order-color=icon.indexByColor, order-alpha=icon.indexByAlpha, - aliases=icon.plainAliases + aliases=icon.plainAliases, + deprecated=icon.deprecatedAt === false ? false : JSON.stringify(icon.deprecatedAt) ) .grid-item__row.mv-2.fg-2 button.grid-item__preview.copy-button.copy-svg( diff --git a/public/scripts/modal.js b/public/scripts/modal.js index 6570b2e8..d94b4e77 100644 --- a/public/scripts/modal.js +++ b/public/scripts/modal.js @@ -67,6 +67,23 @@ export default (document, domUtils, iconsData) => { $iconLicense.innerHTML = 'no license'; } + const $iconDeprecated = $detailBody.querySelector('#icon-deprecated'); + const $iconDeprecatedMessage = $iconDeprecated.children[1]; + + if ($iconGridItem.hasAttribute('deprecated')) { + const deprecatedAt = JSON.parse($iconGridItem.getAttribute('deprecated')); + $iconDeprecated.style.display = ''; + $iconDeprecatedMessage.setAttribute( + 'href', + `https://github.com/simple-icons/simple-icons/milestone/${deprecatedAt.milestoneNumber}`, + ); + $iconDeprecatedMessage.innerText = `It will be removed at version ${deprecatedAt.version}`; + } else { + $iconDeprecated.style.display = 'none'; + $iconDeprecatedMessage.removeAttribute('href'); + $iconDeprecatedMessage.innerText = ''; + } + const iconSVG = icon.svg.replace('svg', `svg fill="%23${icon.hex}"`); const colorSVG = `data:image/svg+xml,${iconSVG}`; diff --git a/public/stylesheet.css b/public/stylesheet.css index 7a0f1378..28cff65d 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -931,13 +931,16 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { font-family: var(--font-family-stylized); } +.deprecated .deprecated__text { + font-size: 11px; +} + .deprecated__text { position: relative; float: right; top: -18px; right: 13px; text-transform: uppercase; - font-size: 11px; } .deprecated__text::before { @@ -952,6 +955,10 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { transform: scale(1.25, 1.25); } +.deprecated .deprecated__message { + font-size: 12px; +} + .deprecated__message { position: absolute; right: 9px; @@ -963,6 +970,10 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { color: var(--color-text-light); } +.layout-compact .deprecated__message { + display: none; +} + /* .link-button */ .link-button::before { @@ -1083,6 +1094,26 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { cursor: default; } +.detail_modal #icon-deprecated { + position: relative; + top: 40px; +} + +.detail_modal #icon-deprecated span { + font-size: 14px; +} + +.detail_modal #icon-deprecated span::before { + transform: scale(1.4); + left: 0px; + top: 6px; +} + +.detail_modal #icon-deprecated a { + font-size: 16px; + top: 3px; +} + .detail-footer { width: auto; margin: 0 auto; From 8e8e32bc46ac556d80ecb27689c2db6ab8079eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 21:11:56 +0200 Subject: [PATCH 08/14] Fix styling errors --- public/stylesheet.css | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/public/stylesheet.css b/public/stylesheet.css index 28cff65d..4e1e5258 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1036,6 +1036,14 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { padding: 5px; } +@media (max-width: 560px) { + .detail_modal { + width: 440px; + min-height: 370px; + max-height: 410px; + } +} + .detail-body { padding: 10px; display: flex; @@ -1069,7 +1077,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - top: 20px; + top: 15px; padding: 6px 0px; } @@ -1101,6 +1109,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal #icon-deprecated span { font-size: 14px; + white-space: nowrap; } .detail_modal #icon-deprecated span::before { @@ -1112,6 +1121,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal #icon-deprecated a { font-size: 16px; top: 3px; + white-space: nowrap; } .detail-footer { @@ -1119,6 +1129,9 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { margin: 0 auto; display: flex; justify-content: space-around; + position: absolute; + bottom: 13px; + left: 18px; } .detail-footer a { From 5959d2dcb2c043b311c6f2cbc67f880a5e7b0bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Tue, 27 Sep 2022 21:32:03 +0200 Subject: [PATCH 09/14] Improve styles and fix errors --- public/scripts/download-type.js | 4 +++- public/stylesheet.css | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/public/scripts/download-type.js b/public/scripts/download-type.js index 71063247..209d8fb8 100644 --- a/public/scripts/download-type.js +++ b/public/scripts/download-type.js @@ -15,7 +15,9 @@ export default (document, storage) => { const $body = document.querySelector('body'); const $downloadPdf = document.getElementById('download-pdf'); const $downloadSvg = document.getElementById('download-svg'); - const $downloadFiles = document.getElementsByClassName('a.grid-item__button'); + const $downloadFiles = document.getElementsByClassName( + 'a[download].grid-item__button', + ); $downloadPdf.disabled = false; $downloadSvg.disabled = false; diff --git a/public/stylesheet.css b/public/stylesheet.css index 4e1e5258..fdf0eb4a 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1070,6 +1070,10 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { cursor: default; } +body:not(.dark):not(.light) .detail_modal #icon-preview { + filter: invert(1); +} + .detail_modal #icon-title { font-size: 26px; font-family: var(--font-family-text); @@ -1092,7 +1096,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal #icon-guidelines, .detail_modal #icon-license { - font-style: italic; font-size: 16px; padding: 6px 0; } @@ -1100,6 +1103,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal #icon-guidelines.italic-text, .detail_modal #icon-license.italic-text { cursor: default; + opacity: 0.75; } .detail_modal #icon-deprecated { @@ -1110,6 +1114,8 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal #icon-deprecated span { font-size: 14px; white-space: nowrap; + font-weight: 600; + font-style: var(--font-family-text); } .detail_modal #icon-deprecated span::before { @@ -1126,7 +1132,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail-footer { width: auto; - margin: 0 auto; display: flex; justify-content: space-around; position: absolute; @@ -1135,6 +1140,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { } .detail-footer a { + font-size: 16px; color: var(--color-button-text); padding: 3px 7px; border-radius: 3px; @@ -1145,6 +1151,17 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { background: var(--color-button-hover); } +@media (max-width: 560px) { + .detail-footer { + bottom: 8px; + left: 5px; + } + + .detail-footer a { + font-size: 15px; + } +} + .italic-text { font-style: italic; } From 0154432c1bd7359d05293768a0d3f97cae5aadf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Wed, 28 Sep 2022 15:15:04 +0200 Subject: [PATCH 10/14] Fix tests and styling errors --- public/stylesheet.css | 13 ++++++++++++- tests/e2e.test.js | 10 ++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/public/stylesheet.css b/public/stylesheet.css index 6f41ba5a..dc2b0403 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -373,12 +373,23 @@ a { .control-field { display: flex; flex-direction: column; - margin-right: 1rem; } .control-field:first-of-type { flex-basis: 25%; min-width: 260px; } +.control-field:not(:last-of-type) { + margin-right: 1rem; +} +@media (max-width: 735px) { + .control-field:first-of-type { + min-width: 190px; + } + .control-field:not(:last-of-type) { + margin-right: 0.6rem; + } +} + @media (max-width: 640px) { .control-field { margin: 0.5rem 0 0.5rem 1rem; diff --git a/tests/e2e.test.js b/tests/e2e.test.js index fa07b980..c643c7ae 100644 --- a/tests/e2e.test.js +++ b/tests/e2e.test.js @@ -24,7 +24,7 @@ import { jest.retryTimes(3); jest.setTimeout(3000); -const COLOR_REGEX = /^[A-F0-9]{6}$/; +const COLOR_REGEX = /^#[A-F0-9]{6}$/; const SVG_REGEX = /^.*<\/svg>$/; const DEFAULT_DEVICE = { @@ -338,14 +338,12 @@ describe('Ordering', () => { it('orders grid items alphabetically', async () => { await expect(page).toClick('#order-alpha'); - const $gridItems = await page.$$('button.grid-item__button.view-button'); + const $gridItemTitles = await page.$$('.grid-item .grid-item__title'); for (let i = 0; i < nIcons; i++) { - const $gridItem = $gridItems[i]; + const $gridItemTitle = $gridItemTitles[i]; const expectedTitle = titles[i]; - const title = await ( - await $gridItem.getProperty('textContent') - ).jsonValue(); + const title = await getTextContent($gridItemTitle); await expect(title).toMatch(expectedTitle); } }); From 714df809edd79eee758f7dc8371ba9b3afb35a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Wed, 28 Sep 2022 16:01:15 +0200 Subject: [PATCH 11/14] Translate all messages and fix errors in styles --- locales/es.po | 12 ++++++++++++ locales/fr.po | 14 +++++++++++++- locales/it.po | 14 +++++++++++++- locales/zh-CN.po | 12 ++++++++++++ public/index.pug | 13 +++++++++---- public/scripts/modal.js | 32 +++++++++++++++++++++----------- public/stylesheet.css | 39 +++++++++++++++++++++++++-------------- 7 files changed, 105 insertions(+), 31 deletions(-) diff --git a/locales/es.po b/locales/es.po index f430d41c..574a7872 100644 --- a/locales/es.po +++ b/locales/es.po @@ -155,3 +155,15 @@ msgstr "Reportar $iconTitle como desactualizado" msgid "Report icon as outdated" msgstr "Reportar icono desactualizado" + +msgid "Guidelines" +msgstr "" + +msgid "no guidelines" +msgstr "" + +msgid "no license" +msgstr "" + +msgid "It will be removed at version $version" +msgstr "" diff --git a/locales/fr.po b/locales/fr.po index 91145ec8..bf5ee81d 100644 --- a/locales/fr.po +++ b/locales/fr.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://github.com/simple-icons/simple-icons-website/issues\n" "Language: fr\n" "POT-Creation-Date: 2022-09-25T01:25:24.834Z\n" -"PO-Revision-Date: 2022-09-27T13:59:24.324Z\n" +"PO-Revision-Date: 2022-09-28T13:46:47.310Z\n" "MIME-Version: 1.0\n" msgid "Extension" @@ -156,5 +156,17 @@ msgstr "" msgid "Report icon as outdated" msgstr "" +msgid "Guidelines" +msgstr "" + +msgid "no guidelines" +msgstr "" + +msgid "no license" +msgstr "" + +msgid "It will be removed at version $version" +msgstr "" + #~ msgid "Report outdated" #~ msgstr "" diff --git a/locales/it.po b/locales/it.po index 34e17b00..13a59776 100644 --- a/locales/it.po +++ b/locales/it.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2022-09-26T15:39:06.158Z\n" "MIME-Version: 1.0\n" "Project-Id-Version: simple-icons-website\n" -"PO-Revision-Date: 2022-09-27T13:59:24.324Z\n" +"PO-Revision-Date: 2022-09-28T13:46:47.310Z\n" msgid "$nIcons Free SVG icons for popular brands" msgstr "$nIcons icone SVG gratuite per marchi famosi" @@ -156,5 +156,17 @@ msgstr "" msgid "Report icon as outdated" msgstr "" +msgid "Guidelines" +msgstr "" + +msgid "no guidelines" +msgstr "" + +msgid "no license" +msgstr "" + +msgid "It will be removed at version $version" +msgstr "" + #~ msgid "Report outdated" #~ msgstr "" diff --git a/locales/zh-CN.po b/locales/zh-CN.po index 59f200c0..289d25b8 100644 --- a/locales/zh-CN.po +++ b/locales/zh-CN.po @@ -155,3 +155,15 @@ msgstr "" msgid "Report $iconTitle as outdated" msgstr "" + +msgid "Guidelines" +msgstr "" + +msgid "no guidelines" +msgstr "" + +msgid "no license" +msgstr "" + +msgid "It will be removed at version $version" +msgstr "" diff --git a/public/index.pug b/public/index.pug index d6b4d8f0..0a61eae9 100644 --- a/public/index.pug +++ b/public/index.pug @@ -74,11 +74,16 @@ html(lang=lang) h2#icon-title button#icon-color a#icon-source - a#icon-guidelines - a#icon-license + a#guidelines.icon-guidelines(style='display: none') #{ t_('Guidelines') } + a#no-guidelines.icon-guidelines.italic-text(style='display: none') #{ t_('no guidelines') } + a#license.icon-license(style='display: none') + a#no-license.icon-license.italic-text(style='display: none') #{ t_('no license') } #icon-deprecated(style='display: none') span.deprecated__text #{ t_('Deprecated') } - a.deprecated__message(target='_blank') + a.deprecated__message( + target='_blank', + removal-msg-schema=`${ t_('It will be removed at version $version') }` + ) .detail-footer a#icon-download-svg.detail-button(role='button', download) #{ t_('Download SVG') } a#icon-download-color-svg.detail-button(role='button', download) #{ t_('Download colored SVG') } @@ -461,7 +466,7 @@ html(lang=lang) ) svg(role='img', viewBox='0 0 24 24') use(href='#cp') - button.report__icon.grid-item__button( + a.report__icon.grid-item__button( href=`https://github.com/simple-icons/simple-icons/issues/new?labels=icon+outdated&template=icon_update.md&title=Update%20${icon.title}%20icon`, role='button', title=`${ t_('Report $iconTitle as outdated').replace('$iconTitle', icon.localizedTitle || icon.title) }` diff --git a/public/scripts/modal.js b/public/scripts/modal.js index d94b4e77..3441d50d 100644 --- a/public/scripts/modal.js +++ b/public/scripts/modal.js @@ -47,24 +47,32 @@ export default (document, domUtils, iconsData) => { $detailBody.querySelector('#icon-title').innerText = icon.title; $detailBody.querySelector('#icon-source').setAttribute('href', icon.source); - const $iconGuidelines = $detailBody.querySelector('#icon-guidelines'); + const $iconGuidelines = $detailBody.querySelector( + '.icon-guidelines#guidelines', + ); + const $iconGuidelinesNoGuidelines = $detailBody.querySelector( + '.icon-guidelines#no-guidelines', + ); if (icon.guidelines) { - $iconGuidelines.innerHTML = 'Guidelines'; - domUtils.removeClass($iconGuidelines, 'italic-text'); + $iconGuidelines.style.display = ''; + $iconGuidelinesNoGuidelines.style.display = 'none'; $iconGuidelines.setAttribute('href', icon.guidelines); } else { - domUtils.addClass($iconGuidelines, 'italic-text'); - $iconGuidelines.innerHTML = 'no guidelines'; + $iconGuidelines.style.display = 'none'; + $iconGuidelinesNoGuidelines.style.display = ''; } - const $iconLicense = $detailBody.querySelector('#icon-license'); + const $iconLicense = $detailBody.querySelector('.icon-license#license'); + const $iconLicenseNoLicense = $detailBody.querySelector( + '.icon-license#no-license', + ); if (icon.license) { + $iconLicense.style.display = ''; + $iconLicenseNoLicense.style.display = 'none'; $iconLicense.setAttribute('href', icon.license.url); - domUtils.removeClass($iconLicense, 'italic-text'); - $iconLicense.innerHTML = icon.license.type; } else { - domUtils.addClass($iconLicense, 'italic-text'); - $iconLicense.innerHTML = 'no license'; + $iconLicense.style.display = 'none'; + $iconLicenseNoLicense.style.display = ''; } const $iconDeprecated = $detailBody.querySelector('#icon-deprecated'); @@ -77,7 +85,9 @@ export default (document, domUtils, iconsData) => { 'href', `https://github.com/simple-icons/simple-icons/milestone/${deprecatedAt.milestoneNumber}`, ); - $iconDeprecatedMessage.innerText = `It will be removed at version ${deprecatedAt.version}`; + $iconDeprecatedMessage.innerText = $iconDeprecatedMessage + .getAttribute('removal-msg-schema') + .replace('$version', deprecatedAt.version); } else { $iconDeprecated.style.display = 'none'; $iconDeprecatedMessage.removeAttribute('href'); diff --git a/public/stylesheet.css b/public/stylesheet.css index dc2b0403..233f775e 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -686,6 +686,11 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { opacity: 1; text-decoration: underline; } + +.layout-compact .grid-item__link { + font-size: 0.63rem; +} + @media (hover: hover) { .grid-item__link:hover { opacity: 1; @@ -940,7 +945,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { /* Deprecated notice */ .deprecated { position: relative; - font-family: var(--font-family-stylized); } .deprecated .deprecated__text { @@ -950,9 +954,10 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .deprecated__text { position: relative; float: right; - top: -18px; + top: -17px; right: 13px; text-transform: uppercase; + font-family: var(--font-family-stylized); } .deprecated__text::before { @@ -962,7 +967,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { height: 100%; left: -8px; position: absolute; - top: 3px; + top: 4px; width: 100%; transform: scale(1.25, 1.25); } @@ -982,7 +987,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { color: var(--color-text-light); } -.layout-compact .deprecated__message { +.layout-compact .deprecated .deprecated__message { display: none; } @@ -1069,8 +1074,11 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { padding: 5px; } -.detail-body__right > * { - display: block; +.detail-body__right { + display: flex; + flex-direction: column; + justify-content: space-around; + height: 161px; } .detail_modal #icon-preview { @@ -1098,22 +1106,24 @@ body:not(.dark):not(.light) .detail_modal #icon-preview { } .detail_modal #icon-color { - font-family: var(--font-family-text); + font-family: var(--font-family-stylized); font-size: 15px; font-weight: 600; - padding: 0px 4px; margin-bottom: 15px; cursor: default; + width: 75px; + height: 25px; + border-radius: 2px; } -.detail_modal #icon-guidelines, -.detail_modal #icon-license { +.detail_modal .icon-guidelines, +.detail_modal .icon-license { font-size: 16px; padding: 6px 0; } -.detail_modal #icon-guidelines.italic-text, -.detail_modal #icon-license.italic-text { +.detail_modal .icon-guidelines.italic-text, +.detail_modal .icon-license.italic-text { cursor: default; opacity: 0.75; } @@ -1121,13 +1131,13 @@ body:not(.dark):not(.light) .detail_modal #icon-preview { .detail_modal #icon-deprecated { position: relative; top: 40px; + height: 0px; } .detail_modal #icon-deprecated span { font-size: 14px; white-space: nowrap; font-weight: 600; - font-style: var(--font-family-text); } .detail_modal #icon-deprecated span::before { @@ -1138,8 +1148,9 @@ body:not(.dark):not(.light) .detail_modal #icon-preview { .detail_modal #icon-deprecated a { font-size: 16px; - top: 3px; + top: 5px; white-space: nowrap; + font-style: var(--font-family-text); } .detail-footer { From 0f606f2007cd8356c28ae6b670eb8127f8d402cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Wed, 28 Sep 2022 16:17:52 +0200 Subject: [PATCH 12/14] Add translations --- .husky/pre-commit | 1 + locales/es.po | 17 +++++++---------- locales/fr.po | 38 ++++++++++++++++---------------------- locales/it.po | 38 ++++++++++++++++---------------------- locales/zh-CN.po | 35 ++++++++++++++++------------------- public/index.pug | 6 +++--- public/scripts/copy.js | 2 +- public/stylesheet.css | 4 ++-- 8 files changed, 62 insertions(+), 79 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 9521eee0..2a4db950 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,6 @@ #!/bin/sh . "$(dirname $0)/_/husky.sh" +npm run locale npm run format git add . diff --git a/locales/es.po b/locales/es.po index 574a7872..306ed856 100644 --- a/locales/es.po +++ b/locales/es.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://github.com/simple-icons/simple-icons-website/issues\n" "Language: es\n" "POT-Creation-Date: 2022-09-25T01:25:24.834Z\n" -"PO-Revision-Date: 2022-09-27T13:59:24.324Z\n" +"PO-Revision-Date: 2022-09-28T14:06:20.828Z\n" "MIME-Version: 1.0\n" msgid "Extension" @@ -156,14 +156,11 @@ msgstr "Reportar $iconTitle como desactualizado" msgid "Report icon as outdated" msgstr "Reportar icono desactualizado" -msgid "Guidelines" -msgstr "" +msgid "It will be removed at version $version" +msgstr "Será eliminado en la versión $version" -msgid "no guidelines" -msgstr "" +msgid "no brand guidelines" +msgstr "sin directrices de marca" -msgid "no license" -msgstr "" - -msgid "It will be removed at version $version" -msgstr "" +msgid "no icon license" +msgstr "sin licencia de icono" diff --git a/locales/fr.po b/locales/fr.po index bf5ee81d..cd9ad94f 100644 --- a/locales/fr.po +++ b/locales/fr.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://github.com/simple-icons/simple-icons-website/issues\n" "Language: fr\n" "POT-Creation-Date: 2022-09-25T01:25:24.834Z\n" -"PO-Revision-Date: 2022-09-28T13:46:47.310Z\n" +"PO-Revision-Date: 2022-09-28T14:06:03.221Z\n" "MIME-Version: 1.0\n" msgid "Extension" @@ -130,43 +130,37 @@ msgid "Removal at $version" msgstr "Suppression à $version" msgid "Layout" -msgstr "" +msgstr "Disposition" msgid "Comfortable" -msgstr "" +msgstr "Confortable" msgid "Compact" -msgstr "" +msgstr "Compact" msgid "view $iconTitle" -msgstr "" +msgstr "voir $iconTitle" msgid "Download SVG" -msgstr "" +msgstr "Télécharger SVG" msgid "Download colored SVG" -msgstr "" +msgstr "Télécharger SVG coloré" msgid "Download PDF" -msgstr "" +msgstr "Télécharger PDF" msgid "Report $iconTitle as outdated" -msgstr "" +msgstr "Signaler $iconTitle comme obsolète" msgid "Report icon as outdated" -msgstr "" - -msgid "Guidelines" -msgstr "" - -msgid "no guidelines" -msgstr "" - -msgid "no license" -msgstr "" +msgstr "Signaler l'icône comme obsolète" msgid "It will be removed at version $version" -msgstr "" +msgstr "Il sera supprimé à la version $version" + +msgid "no brand guidelines" +msgstr "aucune directive de marque" -#~ msgid "Report outdated" -#~ msgstr "" +msgid "no icon license" +msgstr "aucune licence d'icône" diff --git a/locales/it.po b/locales/it.po index 13a59776..58abf5f8 100644 --- a/locales/it.po +++ b/locales/it.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2022-09-26T15:39:06.158Z\n" "MIME-Version: 1.0\n" "Project-Id-Version: simple-icons-website\n" -"PO-Revision-Date: 2022-09-28T13:46:47.310Z\n" +"PO-Revision-Date: 2022-09-28T14:06:03.221Z\n" msgid "$nIcons Free SVG icons for popular brands" msgstr "$nIcons icone SVG gratuite per marchi famosi" @@ -130,43 +130,37 @@ msgid "Removal at $version" msgstr "Rimozione in $version" msgid "Layout" -msgstr "" +msgstr "Layout" msgid "Comfortable" -msgstr "" +msgstr "Comodo" msgid "Compact" -msgstr "" +msgstr "Compatto" msgid "view $iconTitle" -msgstr "" +msgstr "visualizza $iconTitle" msgid "Download SVG" -msgstr "" +msgstr "Scarica SVG" msgid "Download colored SVG" -msgstr "" +msgstr "Scarica SVG colorato" msgid "Download PDF" -msgstr "" +msgstr "Scarica PDF" msgid "Report $iconTitle as outdated" -msgstr "" +msgstr "Segnala $iconTitle come obsoleto" msgid "Report icon as outdated" -msgstr "" - -msgid "Guidelines" -msgstr "" - -msgid "no guidelines" -msgstr "" - -msgid "no license" -msgstr "" +msgstr "Segnala icona come obsoleta" msgid "It will be removed at version $version" -msgstr "" +msgstr "Sarà rimosso nella versione $version" + +msgid "no brand guidelines" +msgstr "nessuna guida del marchio" -#~ msgid "Report outdated" -#~ msgstr "" +msgid "no icon license" +msgstr "nessuna licenza dell'icona" diff --git a/locales/zh-CN.po b/locales/zh-CN.po index 289d25b8..7c6a4f1c 100644 --- a/locales/zh-CN.po +++ b/locales/zh-CN.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2022-09-27T13:42:46.869Z\n" "MIME-Version: 1.0\n" "Project-Id-Version: simple-icons-website\n" -"PO-Revision-Date: 2022-09-27T13:42:46.869Z\n" +"PO-Revision-Date: 2022-09-28T14:06:03.221Z\n" msgid "$nIcons Free SVG icons for popular brands" msgstr "囊括 $nIcons 种流行品牌的免费 SVG 图标" @@ -130,40 +130,37 @@ msgid "Made with ❤️ on GitHub" msgstr "Made with ❤️ on GitHub" msgid "Download SVG" -msgstr "" +msgstr "下载 SVG" msgid "Download colored SVG" -msgstr "" +msgstr "下载彩色 SVG" msgid "Download PDF" -msgstr "" +msgstr "下载 PDF" msgid "Report icon as outdated" -msgstr "" +msgstr "报告图标过时" msgid "Layout" -msgstr "" +msgstr "布局" msgid "Comfortable" -msgstr "" +msgstr "舒适" msgid "Compact" -msgstr "" +msgstr "紧凑" msgid "view $iconTitle" -msgstr "" +msgstr "查看 $iconTitle" msgid "Report $iconTitle as outdated" -msgstr "" +msgstr "报告 $iconTitle 过时" -msgid "Guidelines" -msgstr "" - -msgid "no guidelines" -msgstr "" +msgid "It will be removed at version $version" +msgstr "将在 $version 中删除" -msgid "no license" -msgstr "" +msgid "no brand guidelines" +msgstr "无品牌指南" -msgid "It will be removed at version $version" -msgstr "" +msgid "no icon license" +msgstr "无图标许可证" diff --git a/public/index.pug b/public/index.pug index 0a61eae9..a3b47b2d 100644 --- a/public/index.pug +++ b/public/index.pug @@ -74,10 +74,10 @@ html(lang=lang) h2#icon-title button#icon-color a#icon-source - a#guidelines.icon-guidelines(style='display: none') #{ t_('Guidelines') } - a#no-guidelines.icon-guidelines.italic-text(style='display: none') #{ t_('no guidelines') } + a#guidelines.icon-guidelines(style='display: none') #{ t_('Brand Guidelines') } + a#no-guidelines.icon-guidelines.italic-text(style='display: none') #{ t_('no brand guidelines') } a#license.icon-license(style='display: none') - a#no-license.icon-license.italic-text(style='display: none') #{ t_('no license') } + a#no-license.icon-license.italic-text(style='display: none') #{ t_('no icon license') } #icon-deprecated(style='display: none') span.deprecated__text #{ t_('Deprecated') } a.deprecated__message( diff --git a/public/scripts/copy.js b/public/scripts/copy.js index 78af6a38..724eb0fc 100644 --- a/public/scripts/copy.js +++ b/public/scripts/copy.js @@ -22,7 +22,7 @@ export default (document, navigator, fetch) => { const onClickColorButton = (event) => { event.preventDefault(); - copyValue(event.target.innerText); + copyValue(event.target.innerHTML); setCopied(event.target); }; diff --git a/public/stylesheet.css b/public/stylesheet.css index 233f775e..9625c062 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1090,7 +1090,7 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { cursor: default; } -body:not(.dark):not(.light) .detail_modal #icon-preview { +body:not(.light) .detail_modal #icon-preview { filter: invert(1); } @@ -1154,7 +1154,7 @@ body:not(.dark):not(.light) .detail_modal #icon-preview { } .detail-footer { - width: auto; + width: 90%; display: flex; justify-content: space-around; position: absolute; From 222c42e59681bd69fd293cc8d4eb213bd2b90d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Wed, 28 Sep 2022 16:21:53 +0200 Subject: [PATCH 13/14] Remove 'si-utils.js' from PR --- si-utils.js | 201 ---------------------------------------------------- 1 file changed, 201 deletions(-) delete mode 100644 si-utils.js diff --git a/si-utils.js b/si-utils.js deleted file mode 100644 index 8cf6cee3..00000000 --- a/si-utils.js +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @fileoverview - * Some common utilities for scripts. - */ - -import path from 'node:path'; -import fs from 'node:fs/promises'; -import { fileURLToPath } from 'node:url'; - -const TITLE_TO_SLUG_REPLACEMENTS = { - '+': 'plus', - '.': 'dot', - '&': 'and', - đ: 'd', - ħ: 'h', - ı: 'i', - ĸ: 'k', - ŀ: 'l', - ł: 'l', - ß: 'ss', - ŧ: 't', -}; - -const TITLE_TO_SLUG_CHARS_REGEX = RegExp( - `[${Object.keys(TITLE_TO_SLUG_REPLACEMENTS).join('')}]`, - 'g', -); - -const TITLE_TO_SLUG_RANGE_REGEX = /[^a-z0-9]/g; - -export const URL_REGEX = /^https:\/\/[^\s]+$/; - -/** - * Get the slug/filename for an icon. - * @param {Object} icon The icon data as it appears in _data/simple-icons.json - */ -export const getIconSlug = (icon) => icon.slug || titleToSlug(icon.title); - -/** - * Extract the path from an icon SVG content. - * @param {Object} svg The icon SVG content - **/ -export const svgToPath = (svg) => svg.match(/ - title - .toLowerCase() - .replace( - TITLE_TO_SLUG_CHARS_REGEX, - (char) => TITLE_TO_SLUG_REPLACEMENTS[char], - ) - .normalize('NFD') - .replace(TITLE_TO_SLUG_RANGE_REGEX, ''); - -/** - * Converts a slug into a variable name that can be exported. - * @param {String} slug The slug to convert - */ -export const slugToVariableName = (slug) => { - const slugFirstLetter = slug[0].toUpperCase(); - const slugRest = slug.slice(1); - return `si${slugFirstLetter}${slugRest}`; -}; - -/** - * Converts a brand title (as it is seen in simple-icons.json) into a brand - * title in HTML/SVG friendly format. - * @param {String} brandTitle The title to convert - */ -export const titleToHtmlFriendly = (brandTitle) => - brandTitle - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(//g, '>') - .replace(/./g, (char) => { - const charCode = char.charCodeAt(0); - return charCode > 127 ? `&#${charCode};` : char; - }); - -/** - * Converts a brand title in HTML/SVG friendly format into a brand title (as - * it is seen in simple-icons.json) - * @param {String} htmlFriendlyTitle The title to convert - */ -export const htmlFriendlyToTitle = (htmlFriendlyTitle) => - htmlFriendlyTitle - .replace(/&#([0-9]+);/g, (_, num) => String.fromCharCode(parseInt(num))) - .replace( - /&(quot|amp|lt|gt);/g, - (_, ref) => ({ quot: '"', amp: '&', lt: '<', gt: '>' }[ref]), - ); - -/** - * Get path of _data/simpe-icons.json. - * @param {String|undefined} rootDir Path to the root directory of the project. - */ -export const getIconDataPath = (rootDir) => { - if (rootDir === undefined) { - rootDir = path.resolve(getDirnameFromImportMeta(import.meta.url), '..'); - } - return path.resolve(rootDir, '_data', 'simple-icons.json'); -}; - -/** - * Get contents of _data/simple-icons.json. - * @param {String|undefined} rootDir Path to the root directory of the project. - */ -export const getIconsDataString = (rootDir) => { - return fs.readFile(getIconDataPath(rootDir), 'utf8'); -}; - -/** - * Get icons data as object from _data/simple-icons.json. - * @param {String|undefined} rootDir Path to the root directory of the project. - */ -export const getIconsData = async (rootDir) => { - const fileContents = await getIconsDataString(rootDir); - return JSON.parse(fileContents).icons; -}; - -/** - * Write icons data to _data/simple-icons.json. - * @param {Object} iconsData Icons data object. - * @param {String|undefined} rootDir Path to the root directory of the project. - */ -export const writeIconsData = async (iconsData, rootDir) => { - return fs.writeFile( - getIconDataPath(rootDir), - `${JSON.stringify(iconsData, null, 4)}\n`, - 'utf8', - ); -}; - -/** - * Get the directory name where this file is located from `import.meta.url`, - * equivalent to the `__dirname` global variable in CommonJS. - * @param {String} importMetaUrl import.meta.url - */ -export const getDirnameFromImportMeta = (importMetaUrl) => - path.dirname(fileURLToPath(importMetaUrl)); - -/** - * Replace Windows newline characters by Unix ones. - * @param {String} text The text to replace - */ -export const normalizeNewlines = (text) => { - return text.replace(/\r\n/g, '\n'); -}; - -/** - * Convert non-6-digit hex color to 6-digit. - * @param {String} text The color text - */ -export const normalizeColor = (text) => { - let color = text.replace('#', '').toUpperCase(); - if (color.length < 6) { - color = [...color.slice(0, 3)].map((x) => x.repeat(2)).join(''); - } else if (color.length > 6) { - color = color.slice(0, 6); - } - return color; -}; - -/** - * Get information about third party extensions. - * @param {String} readmePath Path to the README file - */ -export const getThirdPartyExtensions = async (readmePath) => - normalizeNewlines(await fs.readFile(readmePath, 'utf8')) - .split('## Third-Party Extensions\n\n')[1] - .split('\n\n')[0] - .split('\n') - .slice(2) - .map((line) => { - const [module, author] = line.split(' | '); - return { - module: { - name: /\[(.+)\]/.exec(module)[1], - url: /\((.+)\)/.exec(module)[1], - }, - author: { - name: /\[(.+)\]/.exec(author)[1], - url: /\((.+)\)/.exec(author)[1], - }, - }; - }); - -/** - * `Intl.Collator` object ready to be used for icon titles sorting. - * @type {Intl.Collator} - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator - **/ -export const collator = new Intl.Collator('en', { - usage: 'search', - caseFirst: 'upper', -}); From e165cce2280a8a24df7903ee7d5663565b4c55f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Wed, 28 Sep 2022 16:33:20 +0200 Subject: [PATCH 14/14] Improve detail modals styles --- public/stylesheet.css | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/public/stylesheet.css b/public/stylesheet.css index 9625c062..33ba7213 100644 --- a/public/stylesheet.css +++ b/public/stylesheet.css @@ -1039,9 +1039,9 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { } .detail_modal { - width: 610px; - min-height: 320px; - max-height: 360px; + width: 620px; + min-height: 330px; + max-height: 370px; position: fixed; top: 50%; left: 50%; @@ -1084,7 +1084,6 @@ body:not(.dark):not(.light) #color-scheme-system:not(:disabled) { .detail_modal #icon-preview { width: 80%; position: relative; - top: 15px; left: 20px; margin-bottom: 20px; cursor: default; @@ -1095,14 +1094,14 @@ body:not(.light) .detail_modal #icon-preview { } .detail_modal #icon-title { - font-size: 26px; + font-size: 27px; font-family: var(--font-family-text); font-weight: bold; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; top: 15px; - padding: 6px 0px; + padding: 2px 0px 7px; } .detail_modal #icon-color { @@ -1154,7 +1153,7 @@ body:not(.light) .detail_modal #icon-preview { } .detail-footer { - width: 90%; + width: 95%; display: flex; justify-content: space-around; position: absolute; @@ -1163,10 +1162,11 @@ body:not(.light) .detail_modal #icon-preview { } .detail-footer a { - font-size: 16px; + font-size: 15px; color: var(--color-button-text); padding: 3px 7px; border-radius: 3px; + text-align: center; } .detail-footer a:hover {