1
0
mirror of https://github.com/konpa/devicon.git synced 2025-01-18 22:07:57 +01:00

Merge pull request #1081 from devicons/revert-1080-develop

Revert "Release v2.15.0"
This commit is contained in:
Thomas Bui 2022-03-22 11:05:18 -07:00 committed by GitHub
commit aac09ddfd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
210 changed files with 995 additions and 8148 deletions

View File

@ -1,37 +1,26 @@
name: Bug Report
description: Report a bug/issue that you found in the SVGs, CSS files, etc.
title: '[BUG] <bug name>'
labels: [bug]
body:
- type: markdown
attributes:
value: "## Before you continue, please search our open/closed issues to see if a similar issue has been addressed."
- type: checkboxes
attributes:
label: I have searched through the issues and didn't find my problem.
options:
- label: Confirm
required: true
- type: textarea
id: description
attributes:
label: Bug description
description: Short description of the bug that you found. Provide images/code if applicable.
validations:
required: true
- type: textarea
id: howtoreplicate
attributes:
label: Possible fixes or solutions
description: List any possible fixes/suggestions that you have in mind that could solve this issue.
validations:
required: true
- type: textarea
id: extrainformation
attributes:
label: Additional information
description: Is there anything else we should know about this bug?
name: Bug Report
description: Report a bug/issue that you found in the SVGs, CSS files, etc.
title: '[BUG] <bug name>'
labels: [bug]
body:
- type: textarea
id: description
attributes:
label: Bug description
description: Short description of the bug that you found. Provide images/code if applicable.
validations:
required: true
- type: textarea
id: howtoreplicate
attributes:
label: Possible fixes or solutions
description: List any possible fixes/suggestions that you have in mind that could solve this issue.
validations:
required: true
- type: textarea
id: extrainformation
attributes:
label: Additional information
description: Is there anything else we should know about this bug?
validations:
required: false

View File

@ -1,5 +1 @@
blank_issues_enabled: false
contact_links:
- name: Discord community
url: https://discord.gg/hScy8KWACQ
about: Found any bug? Need help? Feel free to contact us via Discord.

View File

@ -1,35 +1,33 @@
name: Feature Request
description: Requesting a new feature or changes to an existing feature
title: '[FEATURE REQUEST] <feature name>'
labels: [enhancement]
body:
- type: markdown
attributes:
value: "## Before you continue, please search our open/closed issues to see if a similar issue has been addressed."
- type: checkboxes
attributes:
label: I have searched through the issues and didn't find my problem.
options:
- label: Confirm
required: true
- type: textarea
id: currentproblem
attributes:
label: Problem
description: Tell us about the problem and its negative impacts.
validations:
required: true
- type: textarea
id: possiblesolution
attributes:
label: Possible Solution
description: If you have an idea, please tell us what might solve the above problem and the benefits it provides.
- type: textarea
id: extrainformation
attributes:
label: Additional information
description: Is there anything else we should know about this feature request?
name: Feature Request
description: Requesting a new feature or changes to an existing feature
title: '[FEATURE REQUEST] <feature name>'
labels: [enhancement]
body:
- type: textarea
id: currentproblem
attributes:
label: Problem
description: Tell us about the current problem that you face that this feature might help you with.
validations:
required: true
- type: textarea
id: suggestedfeat
attributes:
label: Suggested feature
description: Tell us about the feature that might solve the above problem.
validations:
required: true
- type: textarea
id: why
attributes:
label: Why should we have this feature?
description: List any extra benefits, other than solving your problem, that this feature will bring to the repository. If none, leave blank.
validations:
required: false
- type: textarea
id: extrainformation
attributes:
label: Additional information
description: Is there anything else we should know about this feature request?
validations:
required: false

View File

@ -1,37 +1,26 @@
name: Icon Request
description: Requesting a new icon or changes to an existing icon
title: '[ICON REQUEST]: <icon name>'
labels: ["request:icon"]
body:
- type: markdown
attributes:
value: "## Before you continue, please search our open/closed issues to see if a similar issue has been addressed."
- type: checkboxes
attributes:
label: I have searched through the issues and didn't find my problem.
options:
- label: Confirm
required: true
- type: input
id: about
attributes:
label: About the icon
description: Short description of why you think this icon belongs in our project.
validations:
required: true
- type: textarea
id: links
attributes:
label: Links and sources
description: Provide links to the icon's official website/repository/anywhere that shows what the technology is about, and its official logo. If available, also provide some resources where the icon/SVG can be found (Font Awesome, Icomoon, etc.).
validations:
required: true
- type: textarea
id: extrainformation
attributes:
label: Additional information
description: Is there anything else we should know about this icon?
name: Icon Request
description: Requesting a new icon or changes to an existing icon
title: 'Icon request: [NAME]'
labels: ["request:icon"]
body:
- type: input
id: about
attributes:
label: About the icon
description: Short description of why you think this icon belongs in our project.
validations:
required: true
- type: textarea
id: links
attributes:
label: Links and sources
description: Provide links to the icon's official website/repository/anywhere that shows what the technology is about, and its official logo. If available, also provide some resources where the icon/SVG can be found (Font Awesome, Icomoon, etc.).
validations:
required: true
- type: textarea
id: extrainformation
attributes:
label: Additional information
description: Is there anything else we should know about this icon?
validations:
required: false

View File

@ -1,29 +1,22 @@
name: Other
description: Use this for any other issues. Do not create blank issues
title: "[OTHER] <description>"
labels: ["awaiting triage"]
body:
- type: markdown
attributes:
value: "## Before you continue, please search our open/closed issues to see if a similar issue has been addressed."
- type: checkboxes
attributes:
label: I have searched through the issues and didn't find my problem.
options:
- label: Confirm
required: true
- type: textarea
id: issuedescription
attributes:
label: What would you like to share?
description: Provide a clear and concise explanation of your issue.
validations:
required: true
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this issue?
name: Other
description: Use this for any other issues. Do not create blank issues
title: "[OTHER] <description>"
labels: ["awaiting triage"]
body:
- type: markdown
attributes:
value: "# Other issue"
- type: textarea
id: issuedescription
attributes:
label: What would you like to share?
description: Provide a clear and concise explanation of your issue.
validations:
required: true
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this issue?
validations:
required: false

View File

@ -1,13 +0,0 @@
## Double check these details before you open a PR
<!-- Tick the checkboxes to ensure you've done everything correctly -->
- [ ] PR does not match another non-stale PR currently opened
## Features
<!-- List your features here and the benefits they bring. Include images/codes as appropriate -->
**This PR closes NONE**
<!-- List issues that this PR would close above. Ex: This PR closes #1, #2, #3. -->
## Notes
<!-- List anything note-worthy here (potential issues, this needs to be merged to `master` before working, etc.). -->

View File

@ -1,17 +0,0 @@
## Double check these details before you open a PR
<!-- Tick the checkboxes to ensure you've done everything correctly -->
- [ ] PR does not match another non-stale PR currently opened
- [ ] PR name matches the format *new icon: <i>Icon name</i> (<i>versions separated by comma</i>)*. More details [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#overview)
- [ ] PR's base is the `develop` branch.
- [ ] Your icons are inside a folder as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#organizational-guidelines)
- [ ] SVG matches the standards laid out [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#svgStandards)
- [ ] A new object is added in the `devicon.json` file as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#-updating-the-deviconjson-)
<!-- Refer to the [contributing](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#contributing-to-devicon) guidelines for more details. -->
**This PR closes NONE**
<!-- List issues that this PR would close above. Ex: This PR closes #1, #2, #3. -->
## Link to prove your SVG is correct and up-to-date.
<!-- Link to an official page/wiki goes here. Anything that proves your SVGs are the correct ones. -->

View File

@ -0,0 +1,24 @@
---
name: New Feature
about: Add a new feature to the repository.
title: 'New Feature: [NAME]'
labels: 'enhancement'
assignees: ''
---
<!-- If you are adding a new icon, follow the steps listed here, and delete the **New Icon** section above. -->
## Double check these details before you open a PR**
<!-- Tick the checkboxes to ensure you've done everything correctly -->
- [] PR does not match another non-stale PR currently opened
- [] PR name matches the format *New Feature: brief description of feature*
## This PR adds/fixes...
<!-- List your features here and the benefits they bring. -->
## Notes
<!-- List anything note-worthy here (potential issues, this needs to be merged to `master` before working, etc.). -->

View File

@ -0,0 +1,23 @@
---
name: New Icon
about: Add a new icon to the repository.
title: 'new icon: [NAME] (versions)'
labels: 'feature:icon'
assignees: ''
---
<!-- If you are adding a new icon, follow the steps listed here, and delete the **New Feature** section below. -->
## Double check these details before you open a PR
<!-- Tick the checkboxes to ensure you've done everything correctly -->
- [] PR does not match another non-stale PR currently opened
- [] PR name matches the format *new icon: <i>Icon name</i> (<i>versions separated by comma</i>)*. More details [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#overview)
- [] PR's base is the `develop` branch.
- [] Your icons are inside a folder as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#organizational-guidelines)
- [] SVG matches the standards laid out [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#svgStandards)
- [] A new object is added in the `devicon.json` file as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#-updating-the-deviconjson-)
<!-- Refer to the [contributing](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#contributing-to-devicon) guidelines for more details. -->
## Link to prove your SVG is correct and up-to-date.
<!-- Link to an official page/wiki goes here. Anything that proves your SVGs are the correct ones. -->

View File

@ -1,5 +1,38 @@
### Adding a New Icon?
- Add `?quick_pull=1&template=new_icon.md` to the end of your current URL and press `Enter`
# **New icon section**
### Adding a New Feature or fixing a bug?
- Add `?quick_pull=1&template=new_feature.md` to the end of your current URL and press `Enter`.
<!-- If you are adding a new icon, follow the steps listed here, and delete the **New feature** section below. -->
## Double check these details before you open a PR
<!-- Tick the checkboxes to ensure you've done everything correctly -->
- [ ] PR does not match another non-stale PR currently opened
- [ ] PR name matches the format *new icon: <i>Icon name</i> (<i>versions separated by comma</i>)*. More details [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#overview)
- [ ] The PR's base is the `develop` branch.
- [ ] Your icons are inside a folder as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#organizational-guidelines)
- [ ] SVG matches the standards laid out [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#svgStandards)
- [ ] A new object is added in the `devicon.json` file as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#-updating-the-deviconjson-)
<!-- Refer to the contributing guidelines for more details https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#contributing-to-devicon -->
## Link to prove your SVG is correct and up-to-date
<!-- Link to an official page/wiki goes here. Anything that proves your SVGs are the correct ones. -->
---
# **New feature section**
<!-- If you are adding a new feature, follow the steps listed here, and delete the **New icon** section above. -->
## Double check these details before you open a PR
<!-- Tick the checkboxes to ensure you've done everything correctly -->
- [ ] PR does not match another non-stale PR currently opened
- [ ] PR name matches the format *New Feature: a brief description of feature*
## This PR adds/fixes
<!-- List your features here and the benefits they bring. -->
## Notes
<!-- List anything note-worthy here (potential issues, this needs to be merged to `develop` before working, etc.). -->

View File

@ -1,14 +1,9 @@
import requests
import sys
import re
from typing import List
from io import FileIO
# our base url which leads to devicon
base_url = "https://api.github.com/repos/devicons/devicon/"
def get_merged_pull_reqs_since_last_release(token, log_output: FileIO=sys.stdout):
def get_merged_pull_reqs_since_last_release(token):
"""
Get all the merged pull requests since the last release.
"""
@ -17,8 +12,9 @@ def get_merged_pull_reqs_since_last_release(token, log_output: FileIO=sys.stdout
found_last_release = False
page = 1
print("Getting PRs since last release.")
while not found_last_release:
data = get_merged_pull_reqs(token, page, log_output)
data = get_merged_pull_reqs(token, page)
# assume we don't encounter it during the loop
last_release_index = 101
@ -34,7 +30,7 @@ def get_merged_pull_reqs_since_last_release(token, log_output: FileIO=sys.stdout
return pull_reqs
def get_merged_pull_reqs(token, page, log_output: FileIO=sys.stdout):
def get_merged_pull_reqs(token, page):
"""
Get the merged pull requests based on page. There are
100 results per page. See https://docs.github.com/en/rest/reference/pulls
@ -42,7 +38,7 @@ def get_merged_pull_reqs(token, page, log_output: FileIO=sys.stdout):
:param token, a GitHub API token.
:param page, the page number.
"""
url = base_url + "pulls"
queryPath = "https://api.github.com/repos/devicons/devicon/pulls"
headers = {
"Authorization": f"token {token}"
}
@ -53,8 +49,8 @@ def get_merged_pull_reqs(token, page, log_output: FileIO=sys.stdout):
"page": page
}
print(f"Querying the GitHub API for requests page #{page}", file=log_output)
response = requests.get(url, headers=headers, params=params)
print(f"Querying the GitHub API for requests page #{page}")
response = requests.get(queryPath, headers=headers, params=params)
if not response:
print(f"Can't query the GitHub API. Status code is {response.status_code}. Message is {response.text}")
sys.exit(1)
@ -103,80 +99,3 @@ def find_all_authors(pull_req_data, token):
authors.add(commit["commit"]["author"]["name"])
print(f"This URL didn't have an `author` attribute: {pull_req_data['commits_url']}")
return ", ".join(["@" + author for author in list(authors)])
def label_issues(token: str, issues: List[str], labels: List[str]):
"""
Label the issues specified with the label specified.
:param token: the GitHub API token.
:param issues: the issue numbers (as str) that we are labelling.
:param labels: the labels that we are labelling.
"""
headers = {
"Authorization": f"token {token}",
"accept": "application/vnd.github.v3+json"
}
url = base_url + "issues/{}/labels"
for issue in issues:
body = {
"labels": labels
}
response = requests.post(url.format(issue), headers=headers, json=body)
if not response:
raise Exception(f"Can't label the Issue provided. Issue: {issue}, labels: {labels}, API response: " + response.text)
else:
print(f"Successfully labelled issue {issue}")
def close_issues(token: str, issues: List[str]):
"""
Close issues.
:param token: the GitHub API token.
:param issues: the issue numbers (as str) that we are labelling.
"""
headers = {
"Authorization": f"token {token}",
"accept": "application/vnd.github.v3+json"
}
url = base_url + "issues/{}"
body = {
"state": "closed"
}
for issue in issues:
response = requests.patch(url.format(issue), headers=headers, json=body)
if not response:
raise Exception(f"Can't close Issue provided. Issue: {issue}, API response: " + response.text)
else:
print(f"Successfully closed issue {issue}")
def get_issues_by_labels(token: str, labels: List[str]):
"""
Get a list of issues based on their labels.
:param token: the GitHub API token.
:param labels: the labels that we are labelling.
"""
url = base_url + "issues?per_page=100&labels={}&page={}"
headers = {
"Authorization": f"token {token}",
"accept": "application/vnd.github.v3+json"
}
issues = []
done = False
page_num = 1
while not done:
response = requests.get(url.format(",".join(labels), page_num), headers=headers)
if not response:
raise Exception(f"Can't access API. Can't get issues for labels: {labels}, API response: " + response.text)
else:
results = response.json()
if len(results) < 100:
done = True # we are done
else:
page_num += 1 # page is full => might need to check another page
# GitHub API also returns PRs for issues queries => have to check
issues_only = [issue for issue in results if issue.get("pull_request") is None]
issues.extend(issues_only)
return issues

View File

@ -34,32 +34,28 @@ def get_selenium_runner_args(peek_mode=False):
action=PathResolverAction)
if peek_mode:
parser.add_argument("pr_title",
parser.add_argument("--pr_title",
help="The title of the PR that we are peeking at")
else:
parser.add_argument("token",
help="The GitHub token to access the GitHub REST API.")
help="The GitHub token to access the GitHub REST API.",
type=str)
return parser.parse_args()
def get_check_icon_pr_args():
def get_check_svgs_on_pr_args():
"""
Get the commandline arguments for the check_icon_pr.py.
Get the commandline arguments for the check_svgs_on_pr.py.
"""
parser = ArgumentParser(description="Check the SVGs to ensure their attributes are correct. Run whenever a PR is opened")
parser.add_argument("pr_title",
help="The title of the PR that we are peeking at")
parser.add_argument("icons_folder_path",
help="The path to the icons folder",
parser.add_argument("files_added_json_path",
help="The path to the files_added.json created by the gh-action-get-changed-files@2.1.4",
action=PathResolverAction)
parser.add_argument("devicon_json_path",
help="The path to the devicon.json",
parser.add_argument("files_modified_json_path",
help="The path to the files_modified.json created by the gh-action-get-changed-files@2.1.4",
action=PathResolverAction)
return parser.parse_args()
@ -68,21 +64,7 @@ def get_release_message_args():
Get the commandline arguments for get_release_message.py.
"""
parser = ArgumentParser(description="Create a text containing the icons and features added since last release.")
parser.add_argument("token",
help="The GitHub token to access the GitHub REST API.")
return parser.parse_args()
def get_in_develop_labeler_args():
"""
Get the commandline arguments for in_develop_labeler.py.
"""
parser = ArgumentParser(description="Parse the PR body to find the issue(s) we are labelling.")
parser.add_argument("token",
help="The GitHub token to access the GitHub REST API.",
type=str)
parser.add_argument("body",
help="The PR's initial comment by the author AKA the `body` attribute of the `pull_request` API object.",
type=str)
return parser.parse_args()

View File

@ -1,10 +1,9 @@
import json
from zipfile import ZipFile, is_zipfile
from zipfile import ZipFile
from pathlib import Path
from typing import List, Union
from typing import List
import os
import re
from io import FileIO
def find_new_icons_in_devicon_json(devicon_json_path: str, icomoon_json_path: str):
@ -69,7 +68,7 @@ def get_svgs_paths(new_icons: List[dict], icons_folder_path: str,
folder_path = Path(icons_folder_path, icon_info['name'])
if not folder_path.is_dir():
raise ValueError(f"Invalid path. This is not a directory: '{folder_path}'.")
raise ValueError(f"Invalid path. This is not a directory: {folder_path}.")
if icon_versions_only:
get_icon_svgs_paths(folder_path, icon_info, file_paths, as_str)
@ -79,7 +78,7 @@ def get_svgs_paths(new_icons: List[dict], icons_folder_path: str,
def get_icon_svgs_paths(folder_path: Path, icon_info: dict,
file_paths: List[Union[str, Path]], as_str: bool):
file_paths: List[str], as_str: bool):
"""
Get only the svg file paths that can be made into an icon from the icon_info.
:param: folder_path, the folder where we can find the icons.
@ -101,11 +100,11 @@ def get_icon_svgs_paths(folder_path: Path, icon_info: dict,
if path.exists():
file_paths.append(str(path) if as_str else path)
else:
raise ValueError(f"This path doesn't exist: '{path}'")
raise ValueError(f"This path doesn't exist: {path}")
def get_all_svgs_paths(folder_path: Path, icon_info: dict,
file_paths: List[Union[str, Path]], as_str: bool):
file_paths: List[str], as_str: bool):
"""
Get all the svg file paths of an icon.
:param: folder_path, the folder where we can find the icons.
@ -120,7 +119,7 @@ def get_all_svgs_paths(folder_path: Path, icon_info: dict,
if path.exists():
file_paths.append(str(path) if as_str else path)
else:
raise ValueError(f"This path doesn't exist: '{path}'")
raise ValueError(f"This path doesn't exist: {path}")
def is_alias(font_version: str, aliases: List[dict]):
@ -134,7 +133,7 @@ def is_alias(font_version: str, aliases: List[dict]):
return False
def extract_files(zip_path: str, extract_path: str, logfile: FileIO, delete=True):
def extract_files(zip_path: str, extract_path: str, delete=True):
"""
Extract the style.css and font files from the devicon.zip
folder. Must call the gulp task "get-icomoon-files"
@ -145,11 +144,9 @@ def extract_files(zip_path: str, extract_path: str, logfile: FileIO, delete=True
will put the extracted files.
:param delete, whether the function should delete the zip file
when it's done.
:param logfile
"""
print("Extracting zipped files...", file=logfile)
fixBadZipfile(zip_path, logfile)
print(f"it's zipped {is_zipfile(zip_path)}", file=logfile)
print("Extracting zipped files...")
icomoon_zip = ZipFile(zip_path)
target_files = ('selection.json', 'fonts/', 'fonts/devicon.ttf',
'fonts/devicon.woff', 'fonts/devicon.eot',
@ -157,40 +154,22 @@ def extract_files(zip_path: str, extract_path: str, logfile: FileIO, delete=True
for file in target_files:
icomoon_zip.extract(file, extract_path)
print("Files extracted", file=logfile)
print("Files extracted")
if delete:
print("Deleting devicon zip file...", file=logfile)
print("Deleting devicon zip file...")
icomoon_zip.close()
os.remove(zip_path)
def fixBadZipfile(zippath: str, logfile: FileIO):
"""
Fix a bad zipfile (one that causes zipfile.ZipFile to throw a BadZipfile Error).
Taken from https://stackoverflow.com/a/11385480/11683637.
"""
f = open(zippath, 'r+b')
data = f.read()
pos = data.find(b'\x50\x4b\x05\x06') # End of central directory signature
if (pos > 0):
# self._log("Trancating file at location " + str(pos + 22)+ ".")
f.seek(pos + 22) # size of 'ZIP end of central directory record'
f.truncate()
else:
print("Zipfile don't need to be fixed", file=logfile)
f.close()
def rename_extracted_files(extract_path: str, logfile: FileIO):
def rename_extracted_files(extract_path: str):
"""
Rename the extracted files selection.json and style.css.
:param extract_path, the location where the function
can find the extracted files.
:return: None.
"""
print("Renaming files", file=logfile)
print("Renaming files")
old_to_new_list = [
{
"old": Path(extract_path, "selection.json"),
@ -205,7 +184,7 @@ def rename_extracted_files(extract_path: str, logfile: FileIO):
for dict_ in old_to_new_list:
os.replace(dict_["old"], dict_["new"])
print("Files renamed", file=logfile)
print("Files renamed")
def create_screenshot_folder(dir, screenshot_name: str="screenshots/"):
@ -228,14 +207,6 @@ def create_screenshot_folder(dir, screenshot_name: str="screenshots/"):
finally:
return str(screenshot_folder)
def write_to_file(path: str, value):
"""
Write the value to a file.
"""
with open(path, "w") as file:
file.write(value)
# --- NOT USED CURRENTLY ---
def get_added_modified_svgs(files_added_json_path: str,
files_modified_json_path: str):
"""
@ -259,3 +230,11 @@ def get_added_modified_svgs(files_added_json_path: str,
svgs.append(path)
return svgs
def write_to_file(path: str, value: any):
"""
Write the value to a file.
"""
with open(path, "w") as file:
file.write(value)

View File

@ -3,4 +3,4 @@ Proxy for using W3C WebDriver compatible clients to interact with Gecko-based br
This program provides the HTTP API described by the WebDriver protocol to communicate with Gecko browsers, such as Firefox.
It translates calls into the Marionette remote protocol by acting as a proxy between the local- and remote ends.
This application was taken from: https://github.com/mozilla/geckodriver/releases/tag/v0.30.0
This application was taken from: https://github.com/mozilla/geckodriver/releases/tag/v0.29.1

View File

@ -1,175 +1,171 @@
from typing import List
import time
from pathlib import Path
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException as SeleniumTimeoutException
from build_assets.selenium_runner.SeleniumRunner import SeleniumRunner
from build_assets.selenium_runner.enums import IcomoonPage, IcomoonAlerts, IcomoonOptionState
class BuildSeleniumRunner(SeleniumRunner):
def build_icons(self, icomoon_json_path: str,
zip_path: Path, svgs: List[str], screenshot_folder: str):
self.upload_icomoon(icomoon_json_path)
# necessary so we can take screenshot of only the
# recently uploaded icons later
self.deselect_all_icons_in_top_set()
self.upload_svgs(svgs, screenshot_folder)
self.take_icon_screenshot(screenshot_folder)
self.download_icomoon_fonts(zip_path)
def upload_icomoon(self, icomoon_json_path: str):
"""
Upload the icomoon.json to icomoon.io.
:param icomoon_json_path: a path to the iconmoon.json.
:raises TimeoutException: happens when elements are not found.
"""
print("Uploading icomoon.json file...", file=self.log_output)
# find the file input and enter the file path
import_btn = self.driver.find_element_by_css_selector(
SeleniumRunner.GENERAL_IMPORT_BUTTON_CSS
)
import_btn.send_keys(icomoon_json_path)
try:
confirm_btn = WebDriverWait(self.driver, SeleniumRunner.MED_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "//div[@class='overlay']//button[text()='Yes']"))
)
confirm_btn.click()
except SeleniumTimeoutException as e:
raise Exception("Cannot find the confirm button when uploading the icomoon.json" \
"Ensure that the icomoon.json is in the correct format for Icomoon.io")
print("JSON file uploaded.", file=self.log_output)
def upload_svgs(self, svgs: List[str], screenshot_folder: str):
"""
Upload the SVGs provided in svgs. This will upload the
:param svgs: a list of svg Paths that we'll upload to icomoon.
:param screenshot_folder: the name of the screenshot_folder.
"""
print("Uploading SVGs...", file=self.log_output)
import_btn = self.driver.find_element_by_css_selector(
SeleniumRunner.SET_IMPORT_BUTTON_CSS
)
# there could be at most 2 alerts when we upload an SVG.
possible_alerts_amount = 2
err_messages = []
for i in range(len(svgs)):
import_btn.send_keys(svgs[i])
print(f"Uploading {svgs[i]}", file=self.log_output)
# see if there are stroke messages or replacing icon message
# there should be none of the second kind
for j in range(possible_alerts_amount):
alert = self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC)
if alert == None:
pass # all good
elif alert == IcomoonAlerts.STROKES_GET_IGNORED_WARNING:
message = f"SVG contained strokes: {svgs[i]}."
err_messages.append(message)
self.click_alert_button(self.ALERTS[alert]["buttons"]["DISMISS"])
elif alert == IcomoonAlerts.REPLACE_OR_REIMPORT_ICON:
message = f"Duplicated SVG: {svgs[i]}."
err_messages.append(message)
self.click_alert_button(self.ALERTS[alert]["buttons"]["REIMPORT"])
else:
raise Exception(f"Unexpected alert found: {alert}")
self.edit_svg()
print(f"Finished editing icon.", file=self.log_output)
print("Finished uploading all files.", file=self.log_output)
if err_messages != []:
message = "BuildSeleniumRunner - Issues found when uploading SVGs:\n"
raise Exception(message + '\n'.join(err_messages))
# take a screenshot of the svgs that were just added
# select the latest icons
self.switch_toolbar_option(IcomoonOptionState.SELECT)
self.select_all_icons_in_top_set()
new_svgs_path = str(Path(screenshot_folder, "new_svgs.png").resolve())
self.driver.save_screenshot(new_svgs_path)
print("Finished uploading the svgs...", file=self.log_output)
def take_icon_screenshot(self, screenshot_folder: str):
"""
Take the overview icon screenshot of the uploaded icons.
:param svgs: a list of svg Paths that we'll upload to icomoon.
:param screenshot_folder: the name of the screenshot_folder.
"""
# take pictures
print("Taking screenshot of the new icons...", file=self.log_output)
self.go_to_generate_font_page()
# take an overall screenshot of the icons that were just added
# also include the glyph count
new_icons_path = str(Path(screenshot_folder, "new_icons.png").resolve())
main_content_xpath = "/html/body/div[4]/div[2]/div/div[1]"
main_content = self.driver.find_element_by_xpath(main_content_xpath)
# wait a bit for all the icons to load before we take a pic
time.sleep(SeleniumRunner.MED_WAIT_IN_SEC)
main_content.screenshot(new_icons_path)
print("Saved screenshot of the new icons...", file=self.log_output)
def go_to_generate_font_page(self):
"""
Go to the generate font page. Also handles the "Deselect Icons
with Strokes" alert.
"""
self.go_to_page(IcomoonPage.GENERATE_FONT)
alert = self.test_for_possible_alert(self.MED_WAIT_IN_SEC)
if alert == None:
pass # all good
elif alert == IcomoonAlerts.DESELECT_ICONS_CONTAINING_STROKES:
message = f"One of SVGs contained strokes. This should not happen."
raise Exception(message)
else:
raise Exception(f"Unexpected alert found: {alert}")
def download_icomoon_fonts(self, zip_path: Path):
"""
Download the icomoon.zip from icomoon.io. Also take a picture of
what the icons look like.
:param zip_path: the path to the zip file after it's downloaded.
"""
print("Downloading Font files...", file=self.log_output)
if self.current_page != IcomoonPage.SELECTION:
self.go_to_page(IcomoonPage.SELECTION)
self.select_all_icons_in_top_set()
self.go_to_generate_font_page()
download_btn = WebDriverWait(self.driver, SeleniumRunner.LONG_WAIT_IN_SEC).until(
ec.presence_of_element_located((By.CSS_SELECTOR, "button.btn4 span"))
)
download_btn.click()
if self.wait_for_zip(zip_path):
print("Font files downloaded.", file=self.log_output)
else:
raise TimeoutError(f"Couldn't find {zip_path} after download button was clicked.")
def wait_for_zip(self, zip_path: Path) -> bool:
"""
Wait for the zip file to be downloaded by checking for its existence
in the download path. Wait time is self.LONG_WAIT_IN_SEC and check time
is 1 sec.
:param zip_path: the path to the zip file after it's
downloaded.
:return: True if the file is found within the allotted time, else
False.
"""
end_time = time.time() + self.LONG_WAIT_IN_SEC
while time.time() <= end_time:
if zip_path.exists():
return True
time.sleep(1) # wait so we don't waste sys resources
return False
from typing import List
import time
from pathlib import Path
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException as SeleniumTimeoutException
from build_assets.selenium_runner.SeleniumRunner import SeleniumRunner
from build_assets.selenium_runner.enums import IcomoonPage, IcomoonAlerts, IcomoonOptionState
class BuildSeleniumRunner(SeleniumRunner):
def build_icons(self, icomoon_json_path: str,
zip_path: Path, svgs: List[str], screenshot_folder: str):
self.upload_icomoon(icomoon_json_path)
# necessary so we can take screenshot of only the
# recently uploaded icons later
self.deselect_all_icons_in_top_set()
self.upload_svgs(svgs, screenshot_folder)
self.take_icon_screenshot(screenshot_folder)
self.download_icomoon_fonts(zip_path)
def upload_icomoon(self, icomoon_json_path: str):
"""
Upload the icomoon.json to icomoon.io.
:param icomoon_json_path: a path to the iconmoon.json.
:raises TimeoutException: happens when elements are not found.
"""
print("Uploading icomoon.json file...")
# find the file input and enter the file path
import_btn = self.driver.find_element_by_css_selector(
SeleniumRunner.GENERAL_IMPORT_BUTTON_CSS
)
import_btn.send_keys(icomoon_json_path)
try:
confirm_btn = WebDriverWait(self.driver, SeleniumRunner.MED_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "//div[@class='overlay']//button[text()='Yes']"))
)
confirm_btn.click()
except SeleniumTimeoutException as e:
raise Exception("Cannot find the confirm button when uploading the icomoon.json" \
"Ensure that the icomoon.json is in the correct format for Icomoon.io")
print("JSON file uploaded.")
def upload_svgs(self, svgs: List[str], screenshot_folder: str):
"""
Upload the SVGs provided in svgs. This will upload the
:param svgs: a list of svg Paths that we'll upload to icomoon.
:param screenshot_folder: the name of the screenshot_folder.
"""
print("Uploading SVGs...")
import_btn = self.driver.find_element_by_css_selector(
SeleniumRunner.SET_IMPORT_BUTTON_CSS
)
# there could be at most 2 alerts when we upload an SVG.
possible_alerts_amount = 2
err_messages = []
for i in range(len(svgs)):
import_btn.send_keys(svgs[i])
print(f"Uploading {svgs[i]}")
# see if there are stroke messages or replacing icon message
# there should be none of the second kind
for j in range(possible_alerts_amount):
alert = self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC)
if alert == None:
pass # all good
elif alert == IcomoonAlerts.STROKES_GET_IGNORED_WARNING:
message = f"SVG contained strokes: {svgs[i]}."
err_messages.append(message)
self.click_alert_button(self.ALERTS[alert]["buttons"]["DISMISS"])
elif alert == IcomoonAlerts.REPLACE_OR_REIMPORT_ICON:
message = f"Duplicated SVG: {svgs[i]}."
err_messages.append(message)
self.click_alert_button(self.ALERTS[alert]["buttons"]["REIMPORT"])
else:
raise Exception(f"Unexpected alert found: {alert}")
self.edit_svg()
print(f"Finished editing icon.")
if err_messages != []:
message = "BuildSeleniumRunner - Issues found when uploading SVGs:\n"
raise Exception(message + '\n'.join(err_messages))
# take a screenshot of the svgs that were just added
# select the latest icons
self.switch_toolbar_option(IcomoonOptionState.SELECT)
self.click_latest_icons_in_top_set(len(svgs))
new_svgs_path = str(Path(screenshot_folder, "new_svgs.png").resolve())
self.driver.save_screenshot(new_svgs_path);
print("Finished uploading the svgs...")
def take_icon_screenshot(self, screenshot_folder: str):
"""
Take the overview icon screenshot of the uploaded icons.
:param svgs: a list of svg Paths that we'll upload to icomoon.
:param screenshot_folder: the name of the screenshot_folder.
"""
# take pictures
print("Taking screenshot of the new icons...")
self.go_to_generate_font_page()
# take an overall screenshot of the icons that were just added
# also include the glyph count
new_icons_path = str(Path(screenshot_folder, "new_icons.png").resolve())
main_content_xpath = "/html/body/div[4]/div[2]/div/div[1]"
main_content = self.driver.find_element_by_xpath(main_content_xpath)
main_content.screenshot(new_icons_path)
print("Saved screenshot of the new icons...")
def go_to_generate_font_page(self):
"""
Go to the generate font page. Also handles the "Deselect Icons
with Strokes" alert.
"""
self.go_to_page(IcomoonPage.GENERATE_FONT)
alert = self.test_for_possible_alert(self.MED_WAIT_IN_SEC)
if alert == None:
pass # all good
elif alert == IcomoonAlerts.DESELECT_ICONS_CONTAINING_STROKES:
message = f"One of SVGs contained strokes. This should not happen."
raise Exception(message)
else:
raise Exception(f"Unexpected alert found: {alert}")
def download_icomoon_fonts(self, zip_path: Path):
"""
Download the icomoon.zip from icomoon.io. Also take a picture of
what the icons look like.
:param zip_path: the path to the zip file after it's downloaded.
"""
print("Downloading Font files...")
if self.current_page != IcomoonPage.SELECTION:
self.go_to_page(IcomoonPage.SELECTION)
self.select_all_icons_in_top_set()
self.go_to_generate_font_page()
download_btn = WebDriverWait(self.driver, SeleniumRunner.LONG_WAIT_IN_SEC).until(
ec.presence_of_element_located((By.CSS_SELECTOR, "button.btn4 span"))
)
download_btn.click()
if self.wait_for_zip(zip_path):
print("Font files downloaded.")
else:
raise TimeoutError(f"Couldn't find {zip_path} after download button was clicked.")
def wait_for_zip(self, zip_path: Path) -> bool:
"""
Wait for the zip file to be downloaded by checking for its existence
in the download path. Wait time is self.LONG_WAIT_IN_SEC and check time
is 1 sec.
:param zip_path: the path to the zip file after it's
downloaded.
:return: True if the file is found within the allotted time, else
False.
"""
end_time = time.time() + self.LONG_WAIT_IN_SEC
while time.time() <= end_time:
if zip_path.exists():
return True
time.sleep(1) # wait so we don't waste sys resources
return False

View File

@ -5,18 +5,17 @@ from build_assets.selenium_runner.SeleniumRunner import SeleniumRunner
from build_assets.selenium_runner.enums import IcomoonPage, IcomoonAlerts
class PeekSeleniumRunner(SeleniumRunner):
def peek(self, svgs: List[str], screenshot_folder: str, icon_info: dict):
def peek(self, svgs: List[str], screenshot_folder: str):
"""
Upload the SVGs and peek at how Icomoon interpret its SVGs and
font versions.
:param svgs: a list of svg Paths that we'll upload to icomoon.
:param screenshot_folder: the name of the screenshot_folder.
:param icon_info: a dictionary containing info on an icon. Taken from the devicon.json.
:return an array of svgs with strokes as strings. These show which icon
contains stroke.
"""
messages = self.peek_svgs(svgs, screenshot_folder)
self.peek_icons(screenshot_folder, icon_info)
self.peek_icons(svgs, screenshot_folder)
return messages
def peek_svgs(self, svgs: List[str], screenshot_folder: str):
@ -28,7 +27,7 @@ class PeekSeleniumRunner(SeleniumRunner):
:return an array of svgs with strokes as strings. These show which icon
contains stroke.
"""
print("Peeking SVGs...", file=self.log_output)
print("Peeking SVGs...")
import_btn = self.driver.find_element_by_css_selector(
SeleniumRunner.GENERAL_IMPORT_BUTTON_CSS
@ -37,13 +36,13 @@ class PeekSeleniumRunner(SeleniumRunner):
svgs_with_strokes = []
for i in range(len(svgs)):
import_btn.send_keys(svgs[i])
print(f"Uploaded {svgs[i]}", file=self.log_output)
print(f"Uploaded {svgs[i]}")
alert = self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC)
if alert == None:
pass # all good
elif alert == IcomoonAlerts.STROKES_GET_IGNORED_WARNING:
print(f"- This icon contains strokes: {svgs[i]}", file=self.log_output)
print(f"- This icon contains strokes: {svgs[i]}")
svg = Path(svgs[i])
svgs_with_strokes.append(f"- {svg.name}")
self.click_alert_button(self.ALERTS[alert]["buttons"]["DISMISS"])
@ -57,18 +56,17 @@ class PeekSeleniumRunner(SeleniumRunner):
new_svgs_path = str(Path(screenshot_folder, "new_svgs.png").resolve())
icon_set_xpath = "/html/body/div[4]/div[1]/div[2]/div[1]"
icon_set = self.driver.find_element_by_xpath(icon_set_xpath)
icon_set.screenshot(new_svgs_path)
icon_set.screenshot(new_svgs_path);
print("Finished peeking the svgs...", file=self.log_output)
print("Finished peeking the svgs...")
return svgs_with_strokes
def peek_icons(self, screenshot_folder: str, icon_info: dict):
def peek_icons(self, svgs: List[str], screenshot_folder: str):
"""
Peek at the icon versions of the SVGs that were uploaded.
:param screenshot_folder: the name of the screenshot_folder.
:param icon_info: a dictionary containing info on an icon. Taken from the devicon.json.
"""
print("Begin peeking at the icons...", file=self.log_output)
print("Begin peeking at the icons...")
# ensure all icons in the set is selected.
self.select_all_icons_in_top_set()
self.go_to_page(IcomoonPage.GENERATE_FONT)
@ -87,7 +85,7 @@ class PeekSeleniumRunner(SeleniumRunner):
main_content = self.driver.find_element_by_xpath(main_content_xpath)
main_content.screenshot(new_icons_path);
# go in reverse order so we get the oldest icon first
# go downward so we get the oldest icon first
icon_divs_xpath = f'//div[@id="glyphSet0"]/div'
icon_divs = self.driver.find_elements_by_xpath(icon_divs_xpath)
icon_divs.reverse()
@ -100,23 +98,6 @@ class PeekSeleniumRunner(SeleniumRunner):
Path(screenshot_folder, f"new_icon_{i}.png").resolve()
)
icon_div.screenshot(icon_screenshot)
i += 1
# test the colors
style = "#glyphSet0 span:first-of-type {color: " + icon_info["color"] + "}"
script = f"document.styleSheets[0].insertRule('{style}', 0)"
self.driver.execute_script(script)
i = 0
for icon_div in icon_divs:
if not icon_div.is_displayed():
continue
icon_screenshot = str(
Path(screenshot_folder, f"new_colored_icon_{i}.png").resolve()
)
icon_div.screenshot(icon_screenshot)
i += 1
print("Finished peeking the icons...", file=self.log_output)
print("Finished peeking the icons...")

View File

@ -1,15 +1,11 @@
from pathlib import Path
from io import FileIO
import sys
from selenium.webdriver.firefox.webdriver import WebDriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException as SeleniumTimeoutException
from selenium.common.exceptions import ElementNotInteractableException
from build_assets.selenium_runner.enums import IcomoonOptionState, IcomoonPage, IcomoonAlerts
@ -73,11 +69,6 @@ class SeleniumRunner:
IcomoonPage.GENERATE_FONT: ICOMOON_URL + "/font"
}
"""
Number of retries for creating a web driver instance.
"""
MAX_RETRY = 5
"""
The different types of alerts that this workflow will encounter.
It contains part of the text in the actual alert and buttons
@ -108,7 +99,7 @@ class SeleniumRunner:
}
def __init__(self, download_path: str,
geckodriver_path: str, headless: bool, log_output: FileIO=sys.stdout):
geckodriver_path: str, headless: bool):
"""
Create a SeleniumRunner object.
:param download_path: the location where you want to download
@ -119,16 +110,7 @@ class SeleniumRunner:
self.driver = None
# default values when we open Icomoon
self.current_option_state = IcomoonOptionState.SELECT
"""
Track the current option in the tool bar.
"""
self.current_page = IcomoonPage.SELECTION
"""Track the current page the driver is on."""
file=self.log_output = log_output
"""The log output stream. Default is stdout."""
self.set_browser_options(download_path, geckodriver_path, headless)
def set_browser_options(self, download_path: str, geckodriver_path: str,
@ -144,7 +126,6 @@ class SeleniumRunner:
:raises AssertionError: if the page title does not contain
"IcoMoon App".
"""
# customize the download options
options = Options()
allowed_mime_types = "application/zip, application/gzip, application/octet-stream"
# disable prompt to download from Firefox
@ -156,55 +137,15 @@ class SeleniumRunner:
options.set_preference("browser.download.dir", download_path)
options.headless = headless
print("Activating browser client...", file=self.log_output)
self.driver = self.create_driver_instance(options, geckodriver_path)
print("Activating browser client...")
self.driver = WebDriver(options=options, executable_path=geckodriver_path)
self.driver.get(self.ICOMOON_URL)
assert "IcoMoon App" in self.driver.title
# wait until the whole web page is loaded by testing the hamburger input
WebDriverWait(self.driver, self.LONG_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "(//i[@class='icon-menu'])[2]"))
)
print("Accessed icomoon.io", file=self.log_output)
def create_driver_instance(self, options: Options, geckodriver_path: str):
"""
Create a WebDriver instance. Isolate retrying code here to address
"no connection can be made" error.
:param options: the FirefoxOptions for the browser.
:param geckodriver_path: the path to the firefox executable.
the icomoon.zip to.
"""
driver = None
err_msgs = [] # keep for logging purposes
for i in range(SeleniumRunner.MAX_RETRY):
try:
# customize the local server
service = None
# first try: use 8080
# else: random
if i == 0:
service = Service(executable_path=geckodriver_path, port=8080)
else:
service = Service(executable_path=geckodriver_path)
driver = WebDriver(options=options, service=service)
except Exception as e:
# retry. This is intended to catch "no connection could be made" error
# anything else: unsure if retry works. Still retry
msg = f"Retry {i + 1}/{SeleniumRunner.MAX_RETRY} Exception: {e}"
err_msgs.append(msg)
print(msg, file=self.log_output)
else:
# works fine
break
else:
# out of retries
# handle situation when we can't make a driver
err_msg_formatted = '\n'.join(reversed(err_msgs))
msg = f"Unable to create WebDriver Instance:\n{err_msg_formatted}"
raise Exception(msg)
return driver
print("Accessed icomoon.io")
def switch_toolbar_option(self, option: IcomoonOptionState):
"""
@ -307,7 +248,7 @@ class SeleniumRunner:
except SeleniumTimeoutException:
pass # do nothing cause sometimes, the color tab doesn't appear in the site
if screenshot_folder is not None and index is not None:
if screenshot_folder != None and index != None:
edit_screen_selector = "div.overlay div.overlayWindow"
screenshot_path = str(
Path(screenshot_folder, f"new_svg_{index}.png").resolve()
@ -315,7 +256,7 @@ class SeleniumRunner:
edit_screen = self.driver.find_element_by_css_selector(
edit_screen_selector)
edit_screen.screenshot(screenshot_path)
print("Took screenshot of svg and saved it at " + screenshot_path, file=self.log_output)
print("Took screenshot of svg and saved it at " + screenshot_path)
close_btn = self.driver \
.find_element_by_css_selector("div.overlayWindow i.icon-close")
@ -338,22 +279,11 @@ class SeleniumRunner:
"""
Select all the svgs in the top most (latest) set.
"""
tries = 3
for i in range(tries):
try:
self.click_hamburger_input()
select_all_button = WebDriverWait(self.driver, self.SHORT_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "//button[text()='Select All']"))
)
select_all_button.click()
except ElementNotInteractableException:
# retry until it works
pass
else:
break
else:
# after all tries and still can't click? Raise an error
raise ElementNotInteractableException("Can't click the 'Select All' button in the hamburger input.")
self.click_hamburger_input()
select_all_button = WebDriverWait(self.driver, self.LONG_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "//button[text()='Select All']"))
)
select_all_button.click()
def deselect_all_icons_in_top_set(self):
"""
@ -381,5 +311,5 @@ class SeleniumRunner:
"""
Close the SeleniumRunner instance.
"""
print("Closing down SeleniumRunner...", file=self.log_output)
print("Closing down SeleniumRunner...")
self.driver.quit()

View File

@ -4,17 +4,14 @@ from typing import List
import platform
import sys
import traceback
from io import FileIO
def exit_with_err(err: Exception, logfile: FileIO=None):
def exit_with_err(err: Exception):
"""
Exit the current step and display the err.
:param: err, the error/exception encountered.
"""
if logfile:
traceback.print_exc(file=logfile)
else:
traceback.print_exc()
traceback.print_exc()
sys.exit(1)
@ -69,9 +66,3 @@ def find_object_added_in_pr(icons: List[dict], pr_title: str):
message = "util.find_object_added_in_pr: Couldn't find an icon matching the name in the PR title.\n" \
f"PR title is: '{pr_title}'"
raise Exception(message)
valid_svg_filename_pattern = re.compile(r"-(original|plain|line)(-wordmark)?\.svg$")
def is_svg_name_valid(filename: str):
return valid_svg_filename_pattern.search(filename) is not None

View File

@ -1,166 +0,0 @@
from typing import List
import xml.etree.ElementTree as et
from pathlib import Path
# pycharm complains that build_assets is an unresolved ref
# don't worry about it, the script still runs
from build_assets import filehandler, arg_getters, util
def main():
"""
Check the quality of the svgs IF this is an icon PR. Else, does nothing.
If any svg error is found, create a json file called 'svg_err_messages.json'
in the root folder that will contains the error messages.
"""
args = arg_getters.get_check_icon_pr_args()
try:
all_icons = filehandler.get_json_file_content(args.devicon_json_path)
# get only the icon object that has the name matching the pr title
filtered_icon = util.find_object_added_in_pr(all_icons, args.pr_title)
print("Checking devicon.json object: " + str(filtered_icon))
devicon_err_msg = check_devicon_object(filtered_icon)
# check the file names
filename_err_msg = ""
svgs = None
try:
svgs = filehandler.get_svgs_paths([filtered_icon], args.icons_folder_path, as_str=False)
print("SVGs to check: ", *svgs, sep='\n')
except ValueError as e:
filename_err_msg = "Error found regarding filenames:\n- " + e.args[0]
# check the svgs
if svgs is None or len(svgs) == 0:
print("No SVGs to check, ending script.")
svg_err_msg = "Error checking SVGs: no SVGs to check. Might be caused by above issues."
else:
svg_err_msg = check_svgs(svgs)
err_msg = []
if devicon_err_msg != "":
err_msg.append(devicon_err_msg)
if filename_err_msg != "":
err_msg.append(filename_err_msg)
if svg_err_msg != "":
err_msg.append(svg_err_msg)
filehandler.write_to_file("./err_messages.txt", "\n\n".join(err_msg))
print("Task completed.")
except Exception as e:
filehandler.write_to_file("./err_messages.txt", str(e))
util.exit_with_err(e)
def check_devicon_object(icon: dict):
"""
Check that the devicon object added is up to standard.
:return a string containing the error messages if any.
"""
err_msgs = []
try:
for tag in icon["tags"]:
if type(tag) != str:
raise TypeError()
except TypeError:
err_msgs.append("- 'tags' must be an array of strings, not: " + str(icon["tags"]))
except KeyError:
err_msgs.append("- missing key: 'tags'.")
try:
if type(icon["versions"]) != dict:
err_msgs.append("- 'versions' must be an object.")
except KeyError:
err_msgs.append("- missing key: 'versions'.")
try:
if type(icon["versions"]["svg"]) != list or len(icon["versions"]["svg"]) == 0:
err_msgs.append("- must contain at least 1 svg version in a list.")
for version in icon["versions"]["svg"]:
if not util.is_svg_name_valid(version):
err_msgs.append(f"- Invalid version name in versions['svg']: '{version}'. Must match regexp: (original|plain|line)(-wordmark)?")
except KeyError:
err_msgs.append("- missing key: 'svg' in 'versions'.")
try:
if type(icon["versions"]["font"]) != list or len(icon["versions"]["svg"]) == 0:
err_msgs.append("- must contain at least 1 font version in a list.")
for version in icon["versions"]["font"]:
if not util.is_svg_name_valid(version):
err_msgs.append(f"- Invalid version name in versions['font']: '{version}'. Must match regexp: (original|plain|line)(-wordmark)?")
except KeyError:
err_msgs.append("- missing key: 'font' in 'versions'.")
try:
if type(icon["color"]) != str or "#" not in icon["color"]:
err_msgs.append("- 'color' must be a string in the format '#abcdef'")
except KeyError:
err_msgs.append("- missing key: 'color'.")
try:
if type(icon["aliases"]) != list:
err_msgs.append("- 'aliases' must be an array.")
except KeyError:
err_msgs.append("- missing key: 'aliases'.")
if len(err_msgs) > 0:
message = "Error found in 'devicon.json' for '{}' entry: \n{}".format(icon["name"], "\n".join(err_msgs))
return message
return ""
def check_svgs(svg_file_paths: List[Path]):
"""
Check the width, height, viewBox and style of each svgs passed in.
The viewBox must be '0 0 128 128'.
The style must not contain any 'stroke' declarations.
If any error is found, they will be thrown.
:param: svg_file_paths, the file paths to the svg to check for.
:return: None if there no errors. If there is, return a JSON.stringified
list with the error messages in it.
"""
# batch err messages together so user can fix everything at once
err_msgs = []
for svg_path in svg_file_paths:
try:
err_msg = [f"SVG Error in '{svg_path.name}':"]
# name check
if not util.is_svg_name_valid(svg_path.name):
err_msg.append("- SVG file name didn't match our pattern of `name-(original|plain|line)(-wordmark)?.svg`")
# svg check
tree = et.parse(svg_path)
root = tree.getroot()
namespace = "{http://www.w3.org/2000/svg}"
if root.tag != f"{namespace}svg":
err_msg.append(f"- root is '{root.tag}'. Root must be an 'svg' element")
if root.get("viewBox") != "0 0 128 128":
err_msg.append("- 'viewBox' is not '0 0 128 128' -> Set it or scale the file using https://www.iloveimg.com/resize-image/resize-svg.")
# goes through all elems and check for strokes
for child in tree.iter():
if child.get("stroke") != None:
err_msg.append("- SVG contains `stroke` property. This will get ignored by Icomoon. Please convert them to fills.")
break
if len(err_msg) > 1:
err_msgs.append("\n".join(err_msg))
except et.ParseError as e:
raise Exception(f"SVG Error in file: {svg_path}. Full Error: \n" + str(e))
if len(err_msgs) > 0:
return "\n\n".join(err_msgs)
return ""
if __name__ == "__main__":
main()

89
.github/scripts/check_svgs_on_pr.py vendored Normal file
View File

@ -0,0 +1,89 @@
from enum import Enum
from typing import List
import xml.etree.ElementTree as et
from pathlib import Path
# pycharm complains that build_assets is an unresolved ref
# don't worry about it, the script still runs
from build_assets import filehandler, arg_getters
from build_assets import util
class SVG_STATUS_CODE(Enum):
"""
The status codes to check for in post_check_svgs_comment.yml
"""
NO_SVG = 0 # action: do nothing
SVG_OK = 1 # action: let user know their svgs are fine
def main():
"""
Check the quality of the svgs.
If any svg error is found, create a json file called 'svg_err_messages.json'
in the root folder that will contains the error messages.
"""
args = arg_getters.get_check_svgs_on_pr_args()
try:
# check the svgs
svgs = filehandler.get_added_modified_svgs(args.files_added_json_path,
args.files_modified_json_path)
print("SVGs to check: ", *svgs, sep='\n')
if len(svgs) == 0:
print("No SVGs to check, ending script.")
err_messages = SVG_STATUS_CODE.NO_SVG.value
else:
err_messages = check_svgs(svgs)
filehandler.write_to_file("./svg_err_messages.txt", str(err_messages))
print("Task completed.")
except Exception as e:
util.exit_with_err(e)
def check_svgs(svg_file_paths: List[Path]):
"""
Check the width, height, viewBox and style of each svgs passed in.
The viewBox must be '0 0 128 128'.
If the svg has a width and height attr, ensure it's '128px'.
The style must not contain any 'fill' declarations.
If any error is found, they will be thrown.
:param: svg_file_paths, the file paths to the svg to check for.
:return: None if there no errors. If there is, return a JSON.stringified
list with the error messages in it.
"""
# batch err messages together so user can fix everything at once
err_msgs = []
for svg_path in svg_file_paths:
try:
tree = et.parse(svg_path)
root = tree.getroot()
namespace = "{http://www.w3.org/2000/svg}"
err_msg = [f"{svg_path}:"]
if root.tag != f"{namespace}svg":
err_msg.append(f"-root is '{root.tag}'. Root must be an 'svg' element")
if root.get("viewBox") != "0 0 128 128":
err_msg.append("-'viewBox' is not '0 0 128 128' -> Set it or scale the file using https://www.iloveimg.com/resize-image/resize-svg.")
if root.get("x") is not None:
err_msg.append("-unneccessary 'x' attribute in svg root element -> Remove it")
if root.get("y") is not None:
err_msg.append("-unneccessary 'y' attribute in svg root element -> Remove it")
if len(err_msg) > 1:
err_msgs.append("\n".join(err_msg))
except et.ParseError as e:
raise Exception(f"SVG Error in file: {svg_path}. Full Error: \n" + str(e))
if len(err_msgs) > 0:
return "\n\n".join(err_msgs)
return SVG_STATUS_CODE.SVG_OK.value
if __name__ == "__main__":
main()

View File

@ -5,7 +5,6 @@ import re
import subprocess
import json
from typing import List, Dict
from io import FileIO
# pycharm complains that build_assets is an unresolved ref
@ -19,68 +18,58 @@ def main():
Build the icons using Icomoon. Also optimize the svgs.
"""
runner = None
logfile = open("log.txt", "w")
try:
args = arg_getters.get_selenium_runner_args()
new_icons = get_icons_for_building(args.icomoon_json_path, args.devicon_json_path, args.token, logfile)
new_icons = get_icons_for_building(args.icomoon_json_path, args.devicon_json_path, args.token)
if len(new_icons) == 0:
sys.exit("No files need to be uploaded. Ending script...")
print(f"There are {len(new_icons)} icons to be build. Here are they:", *new_icons, sep = "\n", file=logfile)
print(f"There are {len(new_icons)} icons to be build. Here are they:", *new_icons, sep = "\n")
print("Begin optimizing files...", file=logfile)
optimize_svgs(new_icons, args.icons_folder_path, logfile=logfile)
print("Begin optimizing files...")
optimize_svgs(new_icons, args.icons_folder_path)
print("Updating the icomoon json...", file=logfile)
update_icomoon_json(new_icons, args.icomoon_json_path, logfile)
print("Updating the icomoon json...")
update_icomoon_json(new_icons, args.icomoon_json_path)
print("Start the building icons process...", file=logfile)
print("Start the building icons process...")
icon_svgs = filehandler.get_svgs_paths(
new_icons, args.icons_folder_path, icon_versions_only=True)
zip_name = "devicon-v1.0.zip"
zip_path = Path(args.download_path, zip_name)
screenshot_folder = filehandler.create_screenshot_folder("./")
runner = BuildSeleniumRunner(args.download_path,
args.geckodriver_path, args.headless, log_output=logfile)
args.geckodriver_path, args.headless)
runner.build_icons(args.icomoon_json_path, zip_path,
icon_svgs, screenshot_folder)
filehandler.extract_files(str(zip_path), args.download_path, logfile)
filehandler.rename_extracted_files(args.download_path, logfile)
filehandler.extract_files(str(zip_path), args.download_path)
filehandler.rename_extracted_files(args.download_path)
print("Creating the release message by querying the GitHub API...", file=logfile)
get_release_message(args.token, logfile)
print("Creating the release message by querying the GitHub API...")
get_release_message(args.token)
print("Closing issues with the `in-develop` label.", file=logfile)
issues = api_handler.get_issues_by_labels(args.token, ["in-develop"])
issue_nums = [issue_num["number"] for issue_num in issues]
api_handler.close_issues(args.token, issue_nums)
print("Task completed.", file=logfile)
print("Task completed.")
except TimeoutException as e:
util.exit_with_err(Exception("Selenium Time Out Error: \n" + str(e)), logfile)
util.exit_with_err("Selenium Time Out Error: \n" + str(e))
except Exception as e:
util.exit_with_err(e, logfile)
util.exit_with_err(e)
finally:
print("Exiting", file=logfile)
if runner is not None:
runner.close()
logfile.close()
def get_icons_for_building(icomoon_json_path: str, devicon_json_path: str, token: str, logfile: FileIO):
def get_icons_for_building(icomoon_json_path: str, devicon_json_path: str, token: str):
"""
Get the icons for building.
:param icomoon_json_path - the path to the `icomoon.json`.
:param devicon_json_path - the path to the `devicon.json`.
:param token - the token to access the GitHub API.
:param logfile.
:return a list of dict containing info on the icons. These are
from the `devicon.json`.
"""
devicon_json = filehandler.get_json_file_content(devicon_json_path)
pull_reqs = api_handler.get_merged_pull_reqs_since_last_release(token, logfile)
pull_reqs = api_handler.get_merged_pull_reqs_since_last_release(token)
new_icons = []
for pull_req in pull_reqs:
@ -101,24 +90,22 @@ def get_icons_for_building(icomoon_json_path: str, devicon_json_path: str, token
return new_icons
def optimize_svgs(new_icons: List[str], icons_folder_path: str, logfile: FileIO):
def optimize_svgs(new_icons: List[str], icons_folder_path: str):
"""
Optimize the newly added svgs. This is done in batches
since the command line has a limit on characters allowed.
:param new_icons - the new icons that need to be optimized.
:param icons_folder_path - the path to the /icons folder.
:param logfile - the file obj to store logging info in.
"""
svgs = filehandler.get_svgs_paths(new_icons, icons_folder_path, icon_versions_only=False)
start = 0
step = 10
for i in range(start, len(svgs), step):
batch = svgs[i:i + step]
print(f"Optimizing these files\n{batch}", file=logfile)
subprocess.run(["npm", "run", "optimize-svg", "--", f"--svgFiles={json.dumps(batch)}"], shell=True)
def update_icomoon_json(new_icons: List[str], icomoon_json_path: str, logfile: FileIO):
def update_icomoon_json(new_icons: List[str], icomoon_json_path: str):
"""
Update the `icomoon.json` if it contains any icons
that needed to be updated. This will remove the icons
@ -135,7 +122,7 @@ def update_icomoon_json(new_icons: List[str], icomoon_json_path: str, logfile: F
icomoon_json["icons"] = list(icons_to_keep)
new_len = len(icomoon_json["icons"])
print(f"Update completed. Removed {cur_len - new_len} icons:", *messages, sep='\n', file=logfile)
print(f"Update completed. Removed {cur_len - new_len} icons:", *messages, sep='\n')
filehandler.write_to_file(icomoon_json_path, json.dumps(icomoon_json))
@ -157,18 +144,18 @@ def find_icomoon_icon_not_in_new_icons(icomoon_icon: Dict, new_icons: List, mess
return True
def get_release_message(token, logfile: FileIO):
def get_release_message(token):
"""
Get the release message for the latest build and write
the result in a file.
:param token: the GitHub API token to access the API.
"""
# fetch first page by default
data = api_handler.get_merged_pull_reqs_since_last_release(token, logfile)
data = api_handler.get_merged_pull_reqs_since_last_release(token)
newIcons = []
features = []
print("Parsing through the pull requests...", file=logfile)
print("Parsing through the pull requests...")
for pullData in data:
authors = api_handler.find_all_authors(pullData, token)
markdown = f"- [{pullData['title']}]({pullData['html_url']}) by {authors}."
@ -178,7 +165,7 @@ def get_release_message(token, logfile: FileIO):
else:
features.append(markdown)
print("Constructing message...", file=logfile)
print("Constructing message...")
thankYou = "A huge thanks to all our maintainers and contributors for making this release possible!"
iconTitle = f"**{len(newIcons)} New Icons**"
featureTitle = f"**{len(features)} New Features**"
@ -186,10 +173,10 @@ def get_release_message(token, logfile: FileIO):
iconTitle, "\n".join(newIcons),
featureTitle, "\n".join(features))
print("--------------Here is the build message--------------\n", finalString, file=logfile)
print("--------------Here is the build message--------------\n", finalString)
release_message_path = "./release_message.txt"
filehandler.write_to_file(release_message_path, finalString)
print("Script finished", file=logfile)
print("Script finished")
if __name__ == "__main__":

View File

@ -1,20 +1,23 @@
from build_assets.selenium_runner.PeekSeleniumRunner import PeekSeleniumRunner
from build_assets import filehandler, arg_getters, util
from build_assets import filehandler, arg_getters
from build_assets import util
def main():
runner = None
try:
args = arg_getters.get_selenium_runner_args(peek_mode=True)
all_icons = filehandler.get_json_file_content(args.devicon_json_path)
new_icons = filehandler.get_json_file_content(args.devicon_json_path)
# get only the icon object that has the name matching the pr title
filtered_icon = util.find_object_added_in_pr(all_icons, args.pr_title)
svgs = filehandler.get_svgs_paths([filtered_icon], args.icons_folder_path, True)
screenshot_folder = filehandler.create_screenshot_folder("./")
filtered_icon = util.find_object_added_in_pr(new_icons, args.pr_title)
check_devicon_object(filtered_icon)
print("Icon being checked:", filtered_icon, sep = "\n", end='\n\n')
runner = PeekSeleniumRunner(args.download_path, args.geckodriver_path, args.headless)
svgs_with_strokes = runner.peek(svgs, screenshot_folder, filtered_icon)
svgs = filehandler.get_svgs_paths([filtered_icon], args.icons_folder_path, True)
screenshot_folder = filehandler.create_screenshot_folder("./")
svgs_with_strokes = runner.peek(svgs, screenshot_folder)
print("Task completed.")
message = ""
@ -30,5 +33,56 @@ def main():
runner.close()
def check_devicon_object(icon: dict):
"""
Check that the devicon object added is up to standard.
:return a string containing the error messages if any.
"""
err_msgs = []
try:
for tag in icon["tags"]:
if type(tag) != str:
raise TypeError()
except TypeError:
err_msgs.append("- 'tags' must be an array of strings, not: " + str(icon["tags"]))
except KeyError:
err_msgs.append("- missing key: 'tags'.")
try:
if type(icon["versions"]) != dict:
err_msgs.append("- 'versions' must be an object.")
except KeyError:
err_msgs.append("- missing key: 'versions'.")
try:
if type(icon["versions"]["svg"]) != list or len(icon["versions"]["svg"]) == 0:
err_msgs.append("- must contain at least 1 svg version in a list.")
except KeyError:
err_msgs.append("- missing key: 'svg' in 'versions'.")
try:
if type(icon["versions"]["font"]) != list or len(icon["versions"]["svg"]) == 0:
err_msgs.append("- must contain at least 1 font version in a list.")
except KeyError:
err_msgs.append("- missing key: 'font' in 'versions'.")
try:
if type(icon["color"]) != str or "#" not in icon["color"]:
err_msgs.append("- 'color' must be a string in the format '#abcdef'")
except KeyError:
err_msgs.append("- missing key: 'color'.")
try:
if type(icon["aliases"]) != list:
err_msgs.append("- 'aliases' must be an array.")
except KeyError:
err_msgs.append("- missing key: 'aliases'.")
if len(err_msgs) > 0:
message = "Error found in 'devicon.json' for '{}' entry: \n{}".format(icon["name"], "\n".join(err_msgs))
raise ValueError(message)
return ""
if __name__ == "__main__":
main()

View File

@ -1,20 +0,0 @@
import re
from build_assets import arg_getters, api_handler
def main():
args = arg_getters.get_in_develop_labeler_args()
try:
# find the issue closing line
issue_line = [line for line in args.body.split("\n") if line.startswith("**This PR closes")][0]
print("Issue Line is " + issue_line)
issue_pattern = re.compile(r"\d+")
issues_numbers = issue_pattern.findall(issue_line)
print("Labelling issues: " + str(issues_numbers))
api_handler.label_issues(args.token, issues_numbers, ["in-develop"])
except IndexError: # if can't find the issue line
print("The PR body doesn't contain `**This PR closes` keywords. Ending workflow.")
return
if __name__ == "__main__":
main()

View File

@ -1,2 +1,2 @@
selenium==4.1.0
selenium==3.141.0
requests==2.25.1

View File

@ -23,7 +23,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: >
python ./.github/scripts/icomoon_build.py
./.github/scripts/build_assets/geckodriver-v0.30.0-win64/geckodriver.exe ./icomoon.json
./.github/scripts/build_assets/geckodriver-v0.29.1-win64/geckodriver.exe ./icomoon.json
./devicon.json ./icons ./ %GITHUB_TOKEN% --headless
- name: Upload geckodriver.log for debugging purposes
@ -33,13 +33,6 @@ jobs:
name: geckodriver-log
path: ./geckodriver.log
- name: Upload log file for debugging purposes
uses: actions/upload-artifact@v2
if: always()
with:
name: logfile
path: ./log.txt
- name: Build devicon.min.css
if: success()
run: npm run build-css

View File

@ -1,10 +1,9 @@
name: Check Icon PR
name: Check SVGs On PR
on: pull_request
jobs:
check:
name: Check the `devicon.json` and the SVGs' quality
name: Check the SVGs' quality
runs-on: ubuntu-18.04
if: startsWith(github.event.pull_request.title, 'new icon') || startsWith(github.event.pull_request.title, 'update icon') # only checks icon PR
steps:
- uses: actions/checkout@v2
@ -12,17 +11,24 @@ jobs:
with:
python-version: 3.8
- name: Install dependencies
run: python -m pip install --upgrade pip
- name: Get Changed Files and generate files_added.json & files_modified.json
uses: lots0logs/gh-action-get-changed-files@2.1.4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Run the check_svg script
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: python ./.github/scripts/check_icon_pr.py "$PR_TITLE" ./icons ./devicon.json
run: >
python ./.github/scripts/check_svgs_on_pr.py $HOME/files_added.json $HOME/files_modified.json
- name: Upload the err messages
uses: actions/upload-artifact@v2
if: success()
with:
name: err_messages
path: ./err_messages.txt
name: svg_err_messages
path: ./svg_err_messages.txt
- name: Save the pr num in an artifact
shell: bash

View File

@ -1,27 +0,0 @@
name: Label Issue In Develop
on:
pull_request:
types: [closed]
jobs:
label:
name: Label Issue In Develop
runs-on: ubuntu-18.04
if: github.event.pull_request.merged == true
steps:
- uses: actions/checkout@v2
- name: Setup Python v3.8
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r ./.github/scripts/requirements.txt
- name: Run in_develop_labeler.py
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
BODY: ${{ github.event.pull_request.body }}
run: python ./.github/scripts/in_develop_labeler.py $TOKEN "$BODY"

View File

@ -30,7 +30,7 @@ jobs:
run: echo $PR_NUM > pr_num.txt
- name: Upload the PR number
uses: actions/upload-artifact@v2.2.4
uses: actions/upload-artifact@v2
with:
name: pr_num
path: ./pr_num.txt
@ -41,25 +41,25 @@ jobs:
shell: cmd
run: >
python ./.github/scripts/icomoon_peek.py
./.github/scripts/build_assets/geckodriver-v0.30.0-win64/geckodriver.exe ./icomoon.json
./devicon.json ./icons ./ --headless "%PR_TITLE%"
./.github/scripts/build_assets/geckodriver-v0.29.1-win64/geckodriver.exe ./icomoon.json
./devicon.json ./icons ./ --headless --pr_title "%PR_TITLE%"
- name: Upload the err messages (created by icomoon_peek.py)
uses: actions/upload-artifact@v2.2.4
uses: actions/upload-artifact@v2
if: always()
with:
name: err_messages
path: ./err_messages.txt
- name: Upload screenshots for comments
uses: actions/upload-artifact@v2.2.4
uses: actions/upload-artifact@v2
if: success()
with:
name: screenshots
path: ./screenshots/*.png
- name: Upload geckodriver.log for debugging purposes
uses: actions/upload-artifact@v2.2.4
uses: actions/upload-artifact@v2
if: failure()
with:
name: geckodriver-log

View File

@ -1,7 +1,7 @@
name: Post the result of the check_icon_pr workflow into its PR.
name: Post the result of a SVG Check into its PR.
on:
workflow_run:
workflows: ['Check Icon PR']
workflows: ['Check SVGs On PR']
types:
- completed
jobs:
@ -18,7 +18,7 @@ jobs:
if: success()
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: check_icon_pr.yml
workflow: peek_icons.yml
run_id: ${{ github.event.workflow_run.id }}
- name: Read the pr_num file
@ -33,27 +33,30 @@ jobs:
id: err_message_reader
uses: juliangruber/read-file-action@v1.0.0
with:
path: ./err_messages/err_messages.txt
path: ./svg_err_messages/svg_err_messages.txt
- name: Comment on the PR about the result - SVG Error
uses: jungwinter/comment@v1 # let us comment on a specific PR
if: success() && (steps.err_message_reader.outputs.content != '')
if: success() && (steps.err_message_reader.outputs.content != '0' && steps.err_message_reader.outputs.content != '1')
env:
MESSAGE: |
Hi!
I'm the `check-bot` and we have some issues with your PR:
I'm Devicons' SVG-Checker Bot and it seems we have some issues with your SVGs.
Here is what went wrong:
```
{0}
```
Check our [CONTRIBUTING guide](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#svgStandards) for more details regarding these errors.
For more reference on why these are errors, check out our [CONTRIBUTING guide](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#svgStandards)
Please address these issues. When you update this PR, I will check your SVGs again.
Thanks for your help,
SVG-Checker Bot :smile:
PS. One day, I will be smart enough to fix these errors for you :persevere:. Until then, I can only point them out.
with:
type: create
issue_number: ${{ steps.pr_num_reader.outputs.content }}

View File

@ -72,14 +72,6 @@ jobs:
path: ./screenshots/new_icon_*.png
client_id: ${{secrets.IMGUR_CLIENT_ID}}
- name: Upload zoomed in screenshot of the colored icons gotten from the artifacts
id: colored_icons_detailed_img_step
uses: devicons/public-upload-to-imgur@v2.2.2
if: env.PEEK_STATUS == 'success' && success()
with:
path: ./screenshots/new_colored_icon_*.png
client_id: ${{secrets.IMGUR_CLIENT_ID}}
- name: Comment on the PR about the result - Success
uses: jungwinter/comment@v1 # let us comment on a specific PR
if: env.PEEK_STATUS == 'success' && success()
@ -88,22 +80,20 @@ jobs:
Hi there,
I'm Devicons' Peek Bot and I just peeked at the icons that you wanted to add using [icomoon.io](https://icomoon.io/app/#/select).
Here are the SVGs as intepreted by Icomoon when we upload the files:
{0}
Here are the zoomed-in screenshots of the added icons as **SVGs**:
Here are the SVGs as intepreted by Icomoon when we upload the files:
{1}
Here are the icons that will be generated by Icomoon:
Here are the zoomed-in screenshots of the added icons as **SVGs**. This is how Icomoon intepret the uploaded SVGs:
{2}
Here are the zoomed-in screenshots of the added icons as **icons**:
Here are the icons that will be generated by Icomoon:
{3}
Here are the colored versions:
Here are the zoomed-in screenshots of the added icons as **icons**. This is what the font will look like:
{4}
{5}
You can click on the pictures and zoom on them if needed.
The maintainers will now check for:
1. The number of Glyphs matches the number of SVGs that were selected.
@ -114,7 +104,7 @@ jobs:
Thank you for contributing to Devicon! I hope that your icons are accepted into the repository.
Note: If the images don't show up, it has been autodeleted by Imgur after 6 months due to our API choice.
Note: If the images don't show up, it's probably because it has been autodeleted by Imgur after 6 months due to our API choice.
Cheers,
Peek Bot :blush:
@ -126,12 +116,11 @@ jobs:
${{
format(
env.MESSAGE,
steps.err_message_reader.outputs.content,
fromJSON(steps.svgs_overview_img_step.outputs.markdown_urls)[0],
join(fromJSON(steps.svgs_detailed_img_step.outputs.markdown_urls), ' '),
fromJSON(steps.icons_overview_img_step.outputs.markdown_urls)[0],
join(fromJSON(steps.icons_detailed_img_step.outputs.markdown_urls), ' '),
join(fromJSON(steps.colored_icons_detailed_img_step.outputs.markdown_urls), ' '),
steps.err_message_reader.outputs.content
join(fromJSON(steps.icons_detailed_img_step.outputs.markdown_urls), ' ')
)
}}

19
.gitignore vendored
View File

@ -1,10 +1,9 @@
node_modules
.DS_Store
.idea
geckodriver.log
__pycache__
*.pyc
new_icons.png
screenshots/
release_message.txt
log.txt
node_modules
.DS_Store
.idea
geckodriver.log
__pycache__
*.pyc
new_icons.png
screenshots/
release_message.txt

View File

@ -2,131 +2,75 @@
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
Examples of behavior that contributes to creating a positive environment
include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior include:
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
professional setting
## Enforcement Responsibilities
## Our Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
info@devicon.dev.
All complaints will be reviewed and investigated promptly and fairly.
reported by contacting a maintainer of the [project team members](https://github.com/orgs/devicons/people)
or write a email to info@devicon.dev. All complaints will be reviewed and investigated and will result
in a response that is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@ -1,7 +1,4 @@
<h1>Contributing to Devicon</h1>
<h2>This guide has been converted to a <a href="https://github.com/devicons/devicon/wiki">Wiki</a>! This document will eventually be removed, please use the Wiki instead.</h2>
<br>
<p>
First of all, thanks for taking the time to contribute! This project can only grow and live by your countless contributions. To keep this project maintainable, we have developed some guidelines for our contributors.
</p>
@ -23,7 +20,6 @@ First of all, thanks for taking the time to contribute! This project can only gr
<li><a href="#bugs">Common Bugs and Solutions</a></li>
<li><a href="#discordServer">Discord server</a></li>
<li><a href="#release">Release strategy, conventions, preparation and execution</a></li>
<li><a href="#resources">Recommended resources and tools</a></li>
</ul>
<hr>
@ -110,8 +106,8 @@ First of all, thanks for taking the time to contribute! This project can only gr
</td>
<td style='width: 33%'>
<p><b>line</b>: a one-color, line version of the original logo. Note that the icon version will be stripped of all colors so you don't have to strip beforehand. </p>
<img src='https://raw.githubusercontent.com/devicons/devicon/master/icons/devicon/devicon-line.svg' height='100px' width='100px' />
<h4>devicon-line.svg</h4>
<img src='https://raw.githubusercontent.com/devicons/devicon/master/icons/apache/apache-line.svg' height='100px' width='100px' />
<h4>apache-line.svg</h4>
</td>
</tr>
<tr>
@ -127,8 +123,8 @@ First of all, thanks for taking the time to contribute! This project can only gr
</td>
<td style='width: 33%'>
<p><b>line-wordmark</b>: similar to the above but must contain the name of the technology. Note that the icon version will be stripped of all colors so you don't have to strip beforehand.</p>
<img src='https://raw.githubusercontent.com/devicons/devicon/master/icons/devicon/devicon-line-wordmark.svg' height='100px' width='100px' />
<h4>devicon-line-wordmark.svg</h4>
<img src='https://raw.githubusercontent.com/devicons/devicon/master/icons/apache/apache-line-wordmark.svg' height='100px' width='100px' />
<h4>apache-line-wordmark.svg</h4>
</td>
</tr>
</table>
@ -494,13 +490,3 @@ We are running a Discord server. You can go here to talk, discuss, and more with
<li>Create a <a href="https://github.com/devicons/devicon/releases/new">new release</a> using the format "<b>Release v<i>MAJOR</i>.<i>MINOR</i>.<i>PATCH</i></b>" as tag and release title. Use the earlier created description as description of the release.</li>
<li>Publishing the release will trigger the <a href="/.github/workflows/npm_publish.yml">npm_publish.yml</a> workflow which will execute a <code>npm publish</code> leading to a updated <a href="https://www.npmjs.com/package/devicon">npm package</a> (v<i>MAJOR</i>.<i>MINOR</i>.<i>PATCH</i>).</li>
</ol>
<h2 id='resources'>Recommended resources and tools</h2>
| Tool Name | Link | Description & Usage |
| :----------------- | :------------------------------------------------- | :------------------------------------------------- |
| Inkscape | https://inkscape.org/ | Desktop application for editing and Making SVG's |
| Visual Studio Code | https://code.visualstudio.com/ | A code editor for editing code |
| vscode.dev | https://vscode.dev/ | Visual Studio Code in the browser |
| Iloveimg | https://www.iloveimg.com/resize-image/resize-svg | Resizing SVG's |
| svgviewer.dev | https://www.svgviewer.dev/ | View, save, and optimize SVGs |

View File

@ -156,12 +156,12 @@ Add css rules in your stylesheet
<h2 id="request-icon">Requesting icon</h2>
<p>
When you want to request an icon please feel free to create an issue. See our <a href="https://github.com/devicons/devicon/wiki/Requesting-an-Icon">Wiki</a> for more information.
When you want to request a icon please feel feel to create a issue. See our <a href="/CONTRIBUTING.md#requestingIcon">contribution guidelines</a> for more information.
</p>
<h2 id="contribute">Contributing</h2>
<p>
We are happy with every contribution, whether it's new icons, features, or maintainers. Please have a look at our <a href="https://github.com/devicons/devicon/wiki">Wiki</a> to see how you can contribute to this project.
We are happy for every contribution, whether it's new icons, features, or maintainers. Please have a look at our <a href="CONTRIBUTING.md">contribution guidelines</a> to see how you can contribute to this project.
</p>
<h2 id="discord-server">Discord server</h2>

View File

@ -1,10 +1,10 @@
@font-face {
font-family: 'devicon';
src: url('fonts/devicon.eot?biu5f3');
src: url('fonts/devicon.eot?biu5f3#iefix') format('embedded-opentype'),
url('fonts/devicon.ttf?biu5f3') format('truetype'),
url('fonts/devicon.woff?biu5f3') format('woff'),
url('fonts/devicon.svg?biu5f3#devicon') format('svg');
src: url('fonts/devicon.eot?rgb6be');
src: url('fonts/devicon.eot?rgb6be#iefix') format('embedded-opentype'),
url('fonts/devicon.ttf?rgb6be') format('truetype'),
url('fonts/devicon.woff?rgb6be') format('woff'),
url('fonts/devicon.svg?rgb6be#devicon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
@ -25,276 +25,6 @@
-moz-osx-font-smoothing: grayscale;
}
.devicon-openal-plain:before {
content: "\e90b";
}
.devicon-kaggle-original-wordmark:before {
content: "\e90c";
}
.devicon-kaggle-original:before {
content: "\e90d";
}
.devicon-pytest-plain-wordmark:before {
content: "\e90e";
}
.devicon-pytest-plain:before {
content: "\e916";
}
.devicon-fastapi-plain-wordmark:before {
content: "\e917";
}
.devicon-fastapi-plain:before {
content: "\e936";
}
.devicon-opencv-plain-wordmark:before {
content: "\e937";
}
.devicon-opencv-plain:before {
content: "\ea14";
}
.devicon-k3s-plain-wordmark:before {
content: "\ea15";
}
.devicon-k3s-original:before {
content: "\ea16";
}
.devicon-packer-original-wordmark:before {
content: "\ea17";
}
.devicon-packer-original:before {
content: "\ea1d";
}
.devicon-anaconda-original-wordmark:before {
content: "\ea1e";
}
.devicon-anaconda-original:before {
content: "\ea1f";
}
.devicon-prometheus-original-wordmark:before {
content: "\ea20";
}
.devicon-prometheus-original:before {
content: "\ea21";
}
.devicon-rspec-original-wordmark:before {
content: "\ea22";
}
.devicon-rspec-original:before {
content: "\ea23";
}
.devicon-argocd-plain-wordmark:before {
content: "\ea24";
}
.devicon-argocd-plain:before {
content: "\ea25";
}
.devicon-blender-original-wordmark:before {
content: "\ea26";
}
.devicon-blender-original:before {
content: "\ea27";
}
.devicon-jetbrains-plain:before {
content: "\ea28";
}
.devicon-cmake-plain-wordmark:before {
content: "\ea29";
}
.devicon-cmake-plain:before {
content: "\ea2a";
}
.devicon-dropwizard-plain:before {
content: "\ea2b";
}
.devicon-nuget-original-wordmark:before {
content: "\ea2c";
}
.devicon-nuget-original:before {
content: "\ea2d";
}
.devicon-podman-plain-wordmark:before {
content: "\ea2e";
}
.devicon-podman-plain:before {
content: "\ea2f";
}
.devicon-networkx-original:before {
content: "\ea30";
}
.devicon-sqlite-plain-wordmark:before {
content: "\ea31";
}
.devicon-sqlite-plain:before {
content: "\ea32";
}
.devicon-discordjs-plain-wordmark:before {
content: "\ea33";
}
.devicon-discordjs-plain:before {
content: "\ea34";
}
.devicon-unrealengine-original-wordmark:before {
content: "\ea35";
}
.devicon-unrealengine-original:before {
content: "\ea36";
}
.devicon-django-plain-wordmark:before {
content: "\ea37";
}
.devicon-django-plain:before {
content: "\ea38";
}
.devicon-devicon-line-wordmark:before {
content: "\ea39";
}
.devicon-devicon-line:before {
content: "\ea3a";
}
.devicon-devicon-plain-wordmark:before {
content: "\ea3b";
}
.devicon-devicon-plain:before {
content: "\ea3c";
}
.devicon-bootstrap-plain-wordmark:before {
content: "\ea3d";
}
.devicon-bootstrap-plain:before {
content: "\ea3e";
}
.devicon-solidity-plain:before {
content: "\ea3f";
}
.devicon-polygon-plain:before {
content: "\ea40";
}
.devicon-maya-plain-wordmark:before {
content: "\ea41";
}
.devicon-maya-plain:before {
content: "\ea42";
}
.devicon-xcode-plain:before {
content: "\ea43";
}
.devicon-selenium-original:before {
content: "\ea44";
}
.devicon-ifttt-original:before {
content: "\ea45";
}
.devicon-pytorch-plain-wordmark:before {
content: "\ea46";
}
.devicon-pytorch-original:before {
content: "\ea47";
}
.devicon-xamarin-original-wordmark:before {
content: "\ea48";
}
.devicon-xamarin-original:before {
content: "\ea49";
}
.devicon-hugo-plain-wordmark:before {
content: "\ea4a";
}
.devicon-hugo-plain:before {
content: "\ea4b";
}
.devicon-grafana-original-wordmark:before {
content: "\ea4c";
}
.devicon-grafana-original:before {
content: "\ea4d";
}
.devicon-ansible-plain-wordmark:before {
content: "\ea4e";
}
.devicon-ansible-plain:before {
content: "\ea4f";
}
.devicon-shotgrid-original-wordmark:before {
content: "\ea50";
}
.devicon-shotgrid-plain:before {
content: "\ea51";
}
.devicon-androidstudio-plain-wordmark:before {
content: "\ea52";
}
.devicon-androidstudio-plain:before {
content: "\ea53";
}
.devicon-eslint-original-wordmark:before {
content: "\ea54";
}
.devicon-eslint-original:before {
content: "\ea55";
}
.devicon-latex-original:before {
content: "\ea56";
}
.devicon-vuetify-plain:before {
content: "\ea57";
}
.devicon-vuetify-line:before {
content: "\ea58";
}
.devicon-sdl-plain:before {
content: "\ea59";
}
.devicon-bitbucket-original-wordmark:before {
content: "\ea5a";
}
.devicon-bitbucket-original:before {
content: "\ea5b";
}
.devicon-confluence-original-wordmark:before {
content: "\ea5c";
}
.devicon-confluence-original:before {
content: "\ea5d";
}
.devicon-fedora-plain:before {
content: "\ea5e";
}
.devicon-rect-plain:before {
content: "\ea5f";
}
.devicon-bamboo-original-wordmark:before {
content: "\ea60";
}
.devicon-bamboo-original:before {
content: "\ea61";
}
.devicon-jira-plain-wordmark:before {
content: "\ea62";
}
.devicon-jira-plain:before {
content: "\ea63";
}
.devicon-terraform-plain-wordmark:before {
content: "\ea64";
}
.devicon-terraform-plain:before {
content: "\ea65";
}
.devicon-webflow-original:before {
content: "\ea66";
}
.devicon-gentoo-plain:before {
content: "\ea67";
}
.devicon-gentoo-plain-wordmark:before {
content: "\ea68";
}
.devicon-opensuse-plain-wordmark:before {
content: "\ea69";
}
.devicon-opensuse-plain:before {
content: "\ea6a";
}
.devicon-storybook-plain-wordmark:before {
content: "\e900";
}
@ -328,6 +58,18 @@
.devicon-go-original-wordmark:before {
content: "\e90a";
}
.devicon-devicon-line-wordmark:before {
content: "\e90b";
}
.devicon-devicon-line:before {
content: "\e90c";
}
.devicon-devicon-plain-wordmark:before {
content: "\e90d";
}
.devicon-devicon-plain:before {
content: "\e90e";
}
.devicon-msdos-line:before {
content: "\e90f";
}
@ -349,6 +91,12 @@
.devicon-svelte-plain:before {
content: "\e915";
}
.devicon-jira-plain-wordmark:before {
content: "\e916";
}
.devicon-jira-plain:before {
content: "\e917";
}
.devicon-slack-plain-wordmark:before {
content: "\e918";
}
@ -439,6 +187,12 @@
.devicon-processing-plain:before {
content: "\e935";
}
.devicon-bootstrap-plain-wordmark:before {
content: "\e936";
}
.devicon-bootstrap-plain:before {
content: "\e937";
}
.devicon-feathersjs-original:before {
content: "\e938";
}
@ -1099,6 +853,18 @@
.devicon-d3js-original:before {
content: "\ea13";
}
.devicon-confluence-original:before {
content: "\ea14";
}
.devicon-confluence-original-wordmark:before {
content: "\ea15";
}
.devicon-bitbucket-original:before {
content: "\ea16";
}
.devicon-bitbucket-original-wordmark:before {
content: "\ea17";
}
.devicon-gradle-plain:before {
content: "\ea18";
}
@ -1129,6 +895,15 @@
.devicon-safari-plain:before {
content: "\e63c";
}
.devicon-jetbrains-plain:before {
content: "\e63d";
}
.devicon-django-line:before {
content: "\e63e";
}
.devicon-django-plain:before {
content: "\e63f";
}
.devicon-gimp-plain:before {
content: "\e633";
}

File diff suppressed because it is too large Load Diff

2
devicon.min.css vendored

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
<svg fill="none" viewBox="0 0 200 100" width="150" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M108.357 8.20656C100.199 4.4081 91.4506 1.60956 82.3035 0.0067237C82.1369 -0.0242106 81.9705 0.0530959 81.8847 0.207712C80.7595 2.23831 79.5132 4.88739 78.6405 6.96955C68.8022 5.47498 59.0143 5.47498 49.3777 6.96955C48.5048 4.84111 47.2133 2.23831 46.0831 0.207712C45.9973 0.0582546 45.8308 -0.0190518 45.6643 0.0067237C36.5222 1.60444 27.7737 4.40298 19.6103 8.20656C19.5396 8.23748 19.4791 8.28906 19.4389 8.35602C2.84476 33.5121 -1.70107 58.0499 0.528961 82.2835C0.539051 82.402 0.604639 82.5154 0.695456 82.5875C11.6438 90.746 22.2491 95.699 32.6575 98.982C32.8241 99.0335 33.0006 98.9717 33.1066 98.8325C35.5687 95.4208 37.7634 91.8233 39.6452 88.0403C39.7563 87.8187 39.6503 87.5558 39.4233 87.4682C35.942 86.1282 32.6272 84.4944 29.4386 82.6391C29.1863 82.4896 29.1662 82.1236 29.3982 81.9483C30.0692 81.4381 30.7404 80.9073 31.3811 80.3713C31.497 80.2734 31.6585 80.2527 31.7948 80.3146C52.7429 90.0194 75.4216 90.0194 96.1224 80.3146C96.2587 80.2476 96.4202 80.2683 96.5412 80.3661C97.1821 80.9021 97.8531 81.4381 98.5292 81.9483C98.7612 82.1236 98.7461 82.4896 98.4938 82.6391C95.3052 84.5305 91.9904 86.1282 88.5041 87.4631C88.2771 87.5507 88.1761 87.8187 88.2872 88.0403C90.2094 91.818 92.4041 95.4155 94.8208 98.8274C94.9217 98.9717 95.1033 99.0335 95.2699 98.982C105.729 95.699 116.334 90.746 127.282 82.5875C127.378 82.5154 127.439 82.4071 127.449 82.2886C130.118 54.2719 122.979 29.9354 108.524 8.36114C108.488 8.28906 108.428 8.23748 108.357 8.20656ZM42.7735 67.5278C36.4667 67.5278 31.27 61.6524 31.27 54.4369C31.27 47.2214 36.3659 41.3461 42.7735 41.3461C49.2313 41.3461 54.3776 47.273 54.2767 54.4369C54.2767 61.6524 49.1808 67.5278 42.7735 67.5278ZM85.3053 67.5278C78.9987 67.5278 73.8021 61.6524 73.8021 54.4369C73.8021 47.2214 78.8978 41.3461 85.3053 41.3461C91.7634 41.3461 96.9095 47.273 96.8087 54.4369C96.8087 61.6524 91.7634 67.5278 85.3053 67.5278Z" fill="#60BE86"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 245 240"><path d="M104.4 103.9c-5.7 0-10.2 5-10.2 11.1s4.6 11.1 10.2 11.1c5.7 0 10.2-5 10.2-11.1.1-6.1-4.5-11.1-10.2-11.1zM140.9 103.9c-5.7 0-10.2 5-10.2 11.1s4.6 11.1 10.2 11.1c5.7 0 10.2-5 10.2-11.1s-4.5-11.1-10.2-11.1z"/><path d="M189.5 20h-134C44.2 20 35 29.2 35 40.6v135.2c0 11.4 9.2 20.6 20.5 20.6h113.4l-5.3-18.5 12.8 11.9 12.1 11.2 21.5 19V40.6c0-11.4-9.2-20.6-20.5-20.6zm-38.6 130.6s-3.6-4.3-6.6-8.1c13.1-3.7 18.1-11.9 18.1-11.9-4.1 2.7-8 4.6-11.5 5.9-5 2.1-9.8 3.5-14.5 4.3-9.6 1.8-18.4 1.3-25.9-.1-5.7-1.1-10.6-2.7-14.7-4.3-2.3-.9-4.8-2-7.3-3.4-.3-.2-.6-.3-.9-.5-.2-.1-.3-.2-.4-.3-1.8-1-2.8-1.7-2.8-1.7s4.8 8 17.5 11.8c-3 3.8-6.7 8.3-6.7 8.3-22.1-.7-30.5-15.2-30.5-15.2 0-32.2 14.4-58.3 14.4-58.3 14.4-10.8 28.1-10.5 28.1-10.5l1 1.2c-18 5.2-26.3 13.1-26.3 13.1s2.2-1.2 5.9-2.9c10.7-4.7 19.2-6 22.7-6.3.6-.1 1.1-.2 1.7-.2 6.1-.8 13-1 20.2-.2 9.5 1.1 19.7 3.9 30.1 9.6 0 0-7.9-7.5-24.9-12.7l1.4-1.6s13.7-.3 28.1 10.5c0 0 14.4 26.1 14.4 58.3 0 0-8.5 14.5-30.6 15.2z"/></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -2,17 +2,6 @@
@import '//cdnjs.cloudflare.com/ajax/libs/normalize/3.0.1/normalize.min.css';
@import url(https://fonts.googleapis.com/css?family=Lato:300,400,700);
@import url(https://fonts.googleapis.com/css?family=Damion);
:root {
/* color */
--primaryColor: #60be86;
--primaryColorDark: #2D804E;
--primaryColorLight: #65d693;
--grey: #4c6857;
/* sizing */
--listItemPadding: 0.4rem;
}
html {
box-sizing: border-box; }
@ -28,6 +17,71 @@ html {
background-size: cover;
}
.icon-brush:before {
content: "\e600"; }
.icon-type:before {
content: "\e601"; }
.icon-github:before {
content: "\e602"; }
.icon-github2:before {
content: "\e603"; }
.icon-bucket:before {
content: "\e605"; }
.icon-github3:before {
content: "\e604"; }
.icon-bucket2:before {
content: "\e606"; }
/* Cachons la case à cocher */
[type="checkbox"]:not(:checked),
[type="checkbox"]:checked {
position: absolute;
left: -9999px; }
/* on prépare le label */
[type="checkbox"]:not(:checked) + label,
[type="checkbox"]:checked + label {
cursor: pointer;
position: relative;
z-index: 10;
display: inline-block;
padding: 0.71429rem 1.07143rem;
margin-left: 0.35714rem;
font-family: "Lato", Calibri, Arial, sans-serif;
font-weight: 700;
color: #60be86;
background: #4f755e;
box-shadow: 0px 6px 0px #4a5c51;
border-radius: 5px; }
/* Aspect si "cochée" */
[type="checkbox"]:checked + label {
top: 6px;
box-shadow: 0px 0px 0px #4a5c51; }
.button {
position: relative;
z-index: 10;
display: inline-block;
padding: 0.71429rem 1.07143rem;
margin: 0 0.71429rem;
font-family: "Lato", Calibri, Arial, sans-serif;
font-weight: 700;
color: #60be86;
background: #4c6857;
text-decoration: none;
border-radius: 5px;
box-shadow: 0px 6px 0px #4a5c51; }
.button:active {
top: 6px;
box-shadow: 0px 0px 0px #4a5c51; }
/* General Blueprint Style */
*,
*:after,
@ -51,11 +105,12 @@ html {
clear: both; }
body {
color: #47a3da;
font-family: 'Lato', Calibri, Arial, sans-serif; }
a {
color: #f0f0f0;
}
text-decoration: none; }
a:hover {
color: #000; }
@ -82,7 +137,7 @@ a:hover {
.cbp-ig-grid li > span {
display: block;
height: 100%;
color: var(--primaryColor);
color: #60be86;
-webkit-transition: background 0.2s;
-moz-transition: background 0.2s;
transition: background 0.2s;
@ -118,7 +173,7 @@ a:hover {
.cbp-ig-grid .cbp-ig-title:before {
content: '';
position: absolute;
background: var(--primaryColor);
background: #60be86;
width: 60px;
height: 2px;
top: 0;
@ -129,7 +184,7 @@ a:hover {
transition: margin-top 0.2s; }
.cbp-ig-grid li > span:hover {
background: var(--primaryColor); }
background: #60be86; }
.cbp-ig-grid li > span:hover .cbp-ig-icon {
-webkit-transform: translateY(10px);
@ -197,7 +252,7 @@ header {
padding: 0 2rem;
width: 480px;
color: whitesmoke;
background: var(--primaryColor); }
background: #60be86; }
header > h1,
header > h3 {
font-weight: 400;
@ -211,24 +266,24 @@ header {
header > h2 {
font-weight: 400;
font-size: 1.3rem; }
header .buttonLink {
header .download {
margin: 2rem 0 0;
font-weight: 900;
font-size: 1.3rem;
text-align: center; }
header .buttonLink i {
header .download i {
position: relative;
top: 12px;
left: -10px;
font-size: 3rem; }
header .buttonLink > a {
header .download a {
padding: 1.3rem 1.8rem;
border: 6px solid var(--primaryColor);
color: var(--primaryColor);
background: whitesmoke;
text-decoration: none;}
header .buttonLink a:hover {
border-color: whitesmoke; }
border: 6px solid #60be86;
color: #60be86;
background: whitesmoke; }
header .download a:hover {
border-color: whitesmoke;
color: #60be86; }
header > h3 {
margin: 4rem 0 0;
font-size: 3rem;
@ -251,24 +306,20 @@ header {
header .icons-list {
margin: 1rem 0;
padding: 0;
list-style: none;
position: relative; }
list-style: none; }
header .icons-list > div {
display: inline; }
header .icons-list li {
position: relative;
display: inline-block;
width: 6.5rem;
margin: .5rem .3rem;
padding: var(--listItemPadding);
padding: .4rem;
cursor: pointer;
border: 5px solid var(--primaryColor); }
border: 5px solid #60be86; }
header .icons-list li:hover {
border: 5px solid var(--primaryColorLight);
border: 5px solid #65d693;
border-radius: 5px; }
header .icons-list li:hover::before {
content: ' ';
position: absolute;
@ -279,12 +330,10 @@ header {
height: 0px;
border-left: 15px solid transparent;
border-right: 15px solid transparent;
border-top: 15px solid var(--primaryColorLight); }
border-top: 15px solid #65d693; }
header .icons-list li.selected-version {
border: 5px solid var(--primaryColorLight);
border: 5px solid #65d693;
border-radius: 5px; }
header .icons-list li.selected-version::before {
position: absolute;
bottom: -19px;
@ -292,117 +341,15 @@ header {
display: block;
width: 0;
height: 0;
border-top: 15px solid var(--primaryColorLight);
border-top: 15px solid #65d693;
border-right: 15px solid transparent;
border-left: 15px solid transparent;
content: ' '; }
header .icons-list i,
.svgLogo {
font-size: 5rem;
position: absolute;
left: 0;
top: 0;
margin: var(--listItemPadding);
}
header .icons-list i {
font-size: 5rem; }
header .icons-list img {
max-width: 100%; }
/** color picker */
.colorPicker {
height: 0.8em;
width: 0.8em;
border-radius: 50%;
}
.colorPicker:hover {
cursor: pointer;
border: 1px solid whitesmoke;
}
.colorPickerMenu {
position: absolute;
font-size: 1rem;
background-color: var(--primaryColor);
border-radius: 0.2em;
border: 1px solid var(--grey);
transform: translate(0, -30%);
padding: 1em;
margin-left: 1em;
font-weight: normal;
z-index: 1;
display: none;
-webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.3);
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.3);
}
.colorPickerMenuCloseBtn > span:hover {
cursor: pointer;
}
.colorPickerBtn {
margin: auto;
margin-top: 0.5em;
width: min-content;
background-color: var(--primaryColor);
border-radius: 1em;
border: 1px solid var(--grey);
display: inline-block;
}
.colorPickerBtn:hover {
background-color: var(--grey);
}
.checkerboardInput {
width: 1.25em;
height: 1.25em;
position: relative;
top: 0.2em;
}
.checkerboardInput:hover {
cursor: pointer;
}
input[type='color'] {
width: 1.25em;
height: 1.25em;
padding: 0;
}
input[type='color']:hover {
cursor: pointer;
}
/** Copy Btn */
.copyBtn {
height: 1.25em;
width: 1.25em;
margin-left: 0.25em;
position: relative;
top: 0.5em;
border-radius: 20%;
padding: 0.25em;
box-sizing: content-box;
transition: background-color 0.25s;
}
.copyBtn:hover {
cursor: pointer;
background-color: var(--primaryColorDark);
}
.tooltip {
visibility: hidden;
background-color: var(--primaryColorDark);
border-radius: 0.25em;
padding: 0.25em;
}
.borders {
position: fixed;
top: 0;
@ -410,7 +357,7 @@ input[type='color']:hover {
bottom: 0;
left: 0;
z-index: -1;
border: 8px solid var(--primaryColor); }
border: 8px solid #60be86; }
.main {
margin: 0 0 0 480px; }
@ -422,34 +369,32 @@ input[type='color']:hover {
margin: 4rem;
padding: .5rem 1rem;
border: 0;
border-bottom: 2px solid var(--primaryColor);
color: var(--primaryColor);
border-bottom: 2px solid #60be86;
color: #60be86;
background: none;
font-size: 1.2rem;
text-align: center; }
::-webkit-input-placeholder {
color: var(--primaryColor); }
color: #60be86; }
:-moz-placeholder {
/* Firefox 18- */
color: var(--primaryColor); }
color: #60be86; }
::-moz-placeholder {
/* Firefox 19+ */
color: var(--primaryColor); }
color: #60be86; }
:-ms-input-placeholder {
color: var(--primaryColor); }
/* Code related CSS */
color: #60be86; }
.cde {
white-space: nowrap;
padding: 1rem;
border-radius: 4px;
color: var(--grey);
background: var(--primaryColorLight);
color: #4c6857;
background: #65d693;
font-size: .9rem;
font-family: courier;
overflow: auto; }
@ -458,9 +403,15 @@ input[type='color']:hover {
padding: 0 0 0 .5rem; }
.cde-com {
color: var(--grey);
color: #4c6857;
opacity: .5; }
footer {
.footer {
margin-top: 6rem;
text-align: center; }
input[type='color'] {
width: 1.25em;
height: 1.25em;
margin-left: 0.5em;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

View File

@ -1,5 +0,0 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>copy</title>
<path fill="#f5f5f5" d="M20 8v-8h-14l-6 6v18h12v8h20v-24h-12zM6 2.828v3.172h-3.172l3.172-3.172zM2 22v-14h6v-6h10v6l-6 6v8h-10zM18 10.828v3.172h-3.172l3.172-3.172zM30 30h-16v-14h6v-6h10v20z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 356 B

View File

@ -1,4 +1,5 @@
var devicon = angular.module('devicon', ['ngSanitize', 'ngAnimate']);
const DEFAULT_BACKGROUND = "#60be86";
/*
||==============================================================
@ -40,14 +41,8 @@ devicon.controller('IconListCtrl', function($scope, $http, $compile) {
// background color related stuff
// default is the default site background color
$scope.DEFAULT_BACKGROUND = "#60be86";
$scope.fontBackground = $scope.DEFAULT_BACKGROUND;
$scope.svgBackground = $scope.DEFAULT_BACKGROUND;
// whether to display the checkerboard img in the background
// for the font and svg respectively
$scope.fontDisplayChecker = false;
$scope.svgDisplayChecker = false;
$scope.fontBackground = DEFAULT_BACKGROUND;
$scope.svgBackground = DEFAULT_BACKGROUND;
// Loop through devicon.json
angular.forEach(data, function(devicon, key) {
@ -100,7 +95,6 @@ devicon.controller('IconListCtrl', function($scope, $http, $compile) {
/*
| Change selected icon
| param icon: the new icon.
|--------------------------------
*/
$scope.selectIcon = function(icon) {
@ -111,8 +105,8 @@ devicon.controller('IconListCtrl', function($scope, $http, $compile) {
$scope.selectedSvgIndex = 0;
// reset color
$scope.fontBackground = $scope.DEFAULT_BACKGROUND;
$scope.svgBackground = $scope.DEFAULT_BACKGROUND;
$scope.fontBackground = DEFAULT_BACKGROUND;
$scope.svgBackground = DEFAULT_BACKGROUND;
}
/*---- End of "Change selected icon" ----*/
@ -164,58 +158,6 @@ devicon.controller('IconListCtrl', function($scope, $http, $compile) {
}
/*---- End of "Change selected svg icon" ----*/
/**
* Copy the text located using `id` into the user's clipboard.
* @param {Event} event - a JS Event object.
* @param {String} id - id of the element we are copying its text
* content from.
*/
$scope.copyToClipboard = function(event, id) {
let text = document.getElementById(id).textContent
navigator.clipboard.writeText(text)
.then(() => {
$scope.displayTooltip("Copied", event.target)
})
.catch(() => {
$scope.displayTooltip("Failed to copy", event.target)
})
}
/**
* Display a tooltip.
* @param {String} text - text the tooltip should have.
* @param {Element} copyBtn - the copyBtn element, which is an <img>
*/
$scope.displayTooltip = function(text, copyBtn) {
let tooltip = copyBtn.parentElement.getElementsByClassName("tooltip")[0]
tooltip.textContent = text
// reset opacity (for some reason, default opacity is null)
tooltip.style.opacity = 1
tooltip.style.visibility = "visible"
// create fade out effect after 2 sec
setTimeout(() => {
let count = 10
let intervalObj
intervalObj = setInterval(() => {
tooltip.style.opacity -= 0.1
if (--count == 0) {
clearInterval(intervalObj)
tooltip.style.visibility = "hidden"
}
}, 50)
}, 2000)
}
/**
* Display the color picker.
* @param {String} id - id of the menu we are showing.
*/
$scope.toggleColorPickerMenu = function(id) {
let menu = document.getElementById(id)
menu.style.display = menu.style.display == "none" || menu.style.display == "" ? "inherit" : "none"
}
});
/*================ End of "Devicons controller" ================*/

View File

@ -10,7 +10,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>DEVICON | All programming languages and development tools related icons font</title>
<meta name="description" content="Devicon aims to gather all logos representing development languages and tools in one font. 🚀">
<meta name="description" content="devicon aims to gather all logos representing development languages and tools in one font.">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/x-icon" href="./logos/favicon.ico" sizes="196x196">
<link rel="apple-touch-icon" sizes="57x57" href="./logos/apple-touch-icon-57x57.png">
@ -33,12 +33,6 @@
<meta name="theme-color" content="#ffffff">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon/devicon.min.css">
<link rel="stylesheet" href="./assets/css/style.css">
<meta property="og:title" content="Devicon" />
<meta property="og:image" content="https://raw.githubusercontent.com/devicons/devicon/master/icons/devicon/devicon-original-wordmark.svg" />
<meta property="og:url" content="https://devicon.dev" />
<meta property="og:type" content="website" />
<meta property="og:locale" content="en_US" />
<meta property="og:description" content="Devicon aims to gather all logos representing development languages and tools in one font. 🚀" />
</head>
<body ng-app="devicon" ng-controller="IconListCtrl">
@ -56,147 +50,82 @@
<div class="container">
<header class="clearfix">
<h1>Devicon <span><a href="https://github.com/devicons/devicon/releases">{{ latestReleaseTagging }}</a></span></h1>
<h2>Devicon is a set of icons representing programming languages, designing, and development tools. You can use it as a font or directly copy/paste the SVG code into your project.</h2>
<i>*Please read the legal conditions of using the logos here at the bottom of this header</i>
<h2>Devicon is a set of icons representing programming languages, designing & development tools. You can use it as a font or directly copy/paste the svg code into your project.</h2>
<h3>(Super) Quick Setup</h3>
<h5>First select an icon on the right, then select the version below and copy/paste the code into your project.</h5>
<ul>
<li>
<h4>
Font versions
<span>
<img src="./assets/img/color_wheel.png" class='colorPicker' ng-click="toggleColorPickerMenu('fontColorPickerMenu')">
<span class='colorPickerMenu' id='fontColorPickerMenu'>
<div>
<input type='color' value='#60be86' ng-model="fontBackground">
Background Color
</div>
<div>
<input type='checkbox' id='checkboardInputFont' class='checkerboardInput' ng-model="fontDisplayCheckerboard">
<label for='checkboardInputFont' >Checkerboard</label>
</div>
<button class='colorPickerBtn' ng-click="toggleColorPickerMenu('fontColorPickerMenu')">Close</button>
<button class='colorPickerBtn' ng-click="fontBackground = DEFAULT_BACKGROUND; fontDisplayCheckerboard=0; toggleColorPickerMenu('fontColorPickerMenu')">Reset</button>
</span>
</span>
</h4>
<p>
Place this in your header (once per HTML file)
<span>
<img src="./assets/img/copy.svg" class='copyBtn' ng-click="copyToClipboard($event, 'headerLinkCode')">
<span class='tooltip'></span>
</span>
</p>
<div class="cde" id='headerLinkCode'>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon@{{ latestReleaseTagging }}/devicon.min.css"&gt;
</div>
<h4>Font versions <input type='color' value='#60be86' ng-model="fontBackground"></h4>
<ul class="icons-list">
<div ng-repeat="fontVersion in selectedIcon.font">
<li ng-click="selectFont(fontVersion, false, $index)" ng-class="{'selected-version' : ($index == selectedFontIndex && !colored)}" ng-style="{'background-color': fontBackground}">
<img src="assets/img/checkerboard.png" ng-style="{'visibility': fontDisplayCheckerboard ? 'visible' : 'hidden'}">
<i class="devicon-{{selectedIcon.name}}-{{fontVersion}}"></i>
</li>
<li ng-click="selectFont(fontVersion, true, $index)" ng-class="{'selected-version' : ($index == selectedFontIndex && colored)}" ng-style="{'background-color': fontBackground}">
<img src="assets/img/checkerboard.png" ng-style="{'visibility': fontDisplayCheckerboard ? 'visible' : 'hidden'}">
<i class="devicon-{{selectedIcon.name}}-{{fontVersion}} colored"></i>
</li>
</div>
</ul>
<p>
Place this in your body
<span>
<img src="./assets/img/copy.svg" class='copyBtn' ng-click="copyToClipboard($event, 'iconClassCode')">
<span class='tooltip'></span>
</span>
</p>
<div class="cde" id="iconClassCode">
<p>Place this in your header</p>
<div class="cde">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon@{{ latestReleaseTagging }}/devicon.min.css"&gt;
</div>
<p>Use this in your body</p>
<div class="cde">
&lt;i class="devicon-{{selectedIcon.name}}-{{selectedFontIcon}}<span ng-if="colored"> colored</span>"&gt;&lt;/i&gt;<br />
</div>
<p><i>*To change the size, change the &lt;i&gt;'s <code>`font-size`</code>.</i></p>
<p><i>*To change the size, change the <code>i</code>'s <code>font-size</code></i></p>
</li>
<li>
<h4>
SVG versions
<span>
<img src="./assets/img/color_wheel.png" class='colorPicker' ng-click="toggleColorPickerMenu('svgColorPickerMenu')">
<span class='colorPickerMenu' id='svgColorPickerMenu'>
<div>
<input type='color' value='#60be86' ng-model="svgBackground">
Background Color
</div>
<div>
<input type='checkbox' id='checkboardInputSvg' class='checkerboardInput' ng-model="svgDisplayCheckerboard">
<label for='checkboardInputSvg' >Checkerboard</label>
</div>
<button class='colorPickerBtn' ng-click="toggleColorPickerMenu('svgColorPickerMenu')">Close</button>
<button class='colorPickerBtn' ng-click="svgBackground = DEFAULT_BACKGROUND; svgDisplayCheckerboard=0; toggleColorPickerMenu('svgColorPickerMenu')">Reset</button>
</span>
</span>
</h4>
<h4>SVG versions <input type='color' value='#60be86' ng-model="svgBackground"></h4>
<ul class="icons-list">
<li ng-repeat="svgVersion in selectedIcon.svg" ng-click="selectSvg(svgVersion, $index)" ng-class="{'selected-version' : $index == selectedSvgIndex}" ng-style="{'background-color': svgBackground}">
<img src="assets/img/checkerboard.png" ng-style="{'visibility': svgDisplayCheckerboard ? 'visible' : 'hidden'}">
<img class='svgLogo' ng-src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/{{selectedIcon.name}}/{{selectedIcon.name}}-{{svgVersion}}.svg">
<img ng-src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/{{selectedIcon.name}}/{{selectedIcon.name}}-{{svgVersion}}.svg">
</li>
</ul>
<p>
Using &lt;img&gt; element
<span>
<img src="./assets/img/copy.svg" class='copyBtn' ng-click="copyToClipboard($event, 'imgCode')">
<span class='tooltip'></span>
</span>
</p>
<div class="cde" id='imgCode'>
<p>Using &lt;img&gt; element</p>
<div class="cde">
&lt;img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/{{selectedIcon.name}}/{{selectedIcon.name}}-{{selectedIcon.svg[selectedSvgIndex]}}.svg" /&gt;<br />
</div>
<p><i>*To change the size, change the &lt;img&gt;'s <code>`height`</code> and <code>`width`</code>.</i></p>
<p><i>*To change the size, change the <code>img</code>'s <code>height</code> and <code>width</code></i></p>
<br />
<p>
Using Pure SVG
<span>
<img src="./assets/img/copy.svg" class='copyBtn' ng-click="copyToClipboard($event, 'svgCode')">
<span class='tooltip'></span>
</span>
</p>
<div class="cde" id='svgCode'>
<p>Using Pure SVG</p>
<div class="cde">
&lt;svg viewBox="0 0 128 128"&gt;<br />
<div class="cde-ind">{{selectedSvgIcon}}</div>
&lt;/svg&gt;
</div>
<p><i>*To change the size, change the &lt;svg&gt;'s <code>`height`</code> and <code>`width`</code>.</i></p>
<p><i>*To change the size, change the <code>svg</code>'s <code>height</code> and <code>width</code></i></p>
</li>
</ul>
<h3>GitHub repository</h3>
<h5>If you prefer a local install, you can download all the files on the GitHub repository.</h5>
<p class="buttonLink">
<p class="download">
<a href="https://github.com/devicons/devicon/archive/master.zip"><i class="devicon-github-original"></i>DOWNLOAD</a>
</p>
<p class="buttonLink">
<p class="download">
<a href="https://github.com/devicons/devicon/" target="blank"><i class="devicon-github-original"></i>GO TO THE REPOSITORY</a>
</p>
<p class="buttonLink">
<p class="download">
<a href="https://github.com/devicons/devicon/blob/master/CONTRIBUTING.md" target="blank"><i class="devicon-github-original"></i>CONTRIBUTE</a>
</p>
<p class="buttonLink">
<p class="download">
<a href="https://discord.gg/hScy8KWACQ" target="blank"><i class="discord-logo"></i>DISCORD SERVER</a>
</p>
<h3>Contact</h3>
<h5>If you have any legal concerns regarding copyrights or want to report an abuse, please reach out to us at <b><a href="mailto:info@devicon.dev">info@devicon.dev</a></b>. Any code/logo contributions should be made through our GitHub repository listed above.</h5>
<footer>
<p class="footer">
Originally created by <a href="https://github.com/konpa">Konpa</a> (under <a href="https://github.com/devicons/devicon/blob/master/LICENSE">MIT License</a>) and <br />
supported by various <a href="https://github.com/devicons/devicon/graphs/contributors">contributors</a>.<br />
Copyright &copy; 2015 <a href="https://github.com/konpa">Konpa</a><br />
<br />
Final font build with <a href="https://icomoon.io/">Icomoon</a><br />
<br>
<i>*All product names, logos, and brandsare property of their respective owners. All company, product and service names used in this website are for identification purposes only. Usage of these names, logos, and brands does not imply endorsement of Devicon or its members. All icons/SVGs in this project are not monetized in anyway. It is up to the user to use the logo properly according to the company/group's brand policy. Usage of this site or any icons/SVGs from Devicon means acknowledgement of these conditions.</i>
</footer>
Final font build with <a href="https://icomoon.io/">Icomoon app</a><br />
<br />
<i>All product names, logos, and brandsare property of their respective owners. All company, product and service names used in this website are for identification purposes only. Use of these names, logos, and brands does not imply endorsement.</i>
</p>
</header>
<div class="main">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Binary file not shown.

View File

@ -155,6 +155,7 @@ function cleanUp() {
*/
function optimizeSvg() {
let svgGlob = JSON.parse(yargs.argv.svgFiles);
console.log("Optimizing these files: ", svgGlob);
return gulp
.src(svgGlob)
.pipe(svgmin(configOptionCallback))
@ -186,12 +187,6 @@ function configOptionCallback(file) {
},
{
removeDimensions: true // remove height and width
},
{
name: "removeAttrs",
params: {
attrs: "svg:(x|y)"
}
}
]
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M59.3 127.602c-11.206-1.075-21.253-4.403-29.288-9.7l-1.688-1.113-.406-3.133c-.45-3.488-.922-9.035-.918-10.86v-1.19l5.242-.043c2.883-.024 6.117-.133 7.188-.25 1.699-.18 2.035-.149 2.652.238 5.715 3.586 14.445 5.965 21.871 5.957 11.899-.008 22.414-4.395 30.902-12.89 3.754-3.759 5.817-6.583 8.07-11.06 6.188-12.273 6.321-26.316.372-38.601-5.89-12.16-17.375-21.094-30.5-23.719-3.383-.68-8.043-1.039-10.828-.84l-2.27.165.574-.813c.32-.445 2.426-2.7 4.684-5.008l4.106-4.195-1.688-1.57C64.988 6.75 61.691 4 59.219 2.168L57.102.602l.796-.188C59.473.043 68.664.156 71.953.586c27.024 3.531 48.594 23.16 54.45 49.555 1.917 8.629 1.956 18.187.117 27.117-2.325 11.27-8.235 22.383-16.442 30.91A64.013 64.013 0 0169.906 127.5c-2.547.238-8.594.293-10.605.102zm-39.987-18.344c-3.622-3.617-8.516-9.492-8.184-9.824.062-.063 1.43.156 3.035.48 2.438.496 7.922 1.328 8.75 1.328.125 0 .23 1.035.234 2.352.004 2.156.23 5.246.618 8.437.109.899.07 1.266-.13 1.266-.156 0-2.105-1.817-4.323-4.04zM27 96.336c0-1.941.504-7.723.691-7.926.09-.094.852.738 1.696 1.852.84 1.117 2.746 3.23 4.234 4.695l2.703 2.672H27zm-4.945.887c-4.032-.496-12.22-2.07-12.871-2.473-.2-.125.039-1.094.84-3.41 1.058-3.047 3.554-9.035 3.945-9.453.097-.102 1.414.457 2.926 1.246 1.515.789 3.71 1.844 4.886 2.351l2.133.914-.148 1.102c-.34 2.57-.614 6.047-.618 7.898-.003 1.094-.09 1.973-.187 1.954-.102-.02-.508-.079-.906-.13zM4.527 86.852a68.035 68.035 0 01-3.082-10.657C.7 72.5.723 72.473 3.02 74.285c1.062.84 3.097 2.32 4.52 3.285 1.42.97 2.585 1.801 2.585 1.844 0 .047-.445 1.047-.988 2.219a109.642 109.642 0 00-2.075 4.906c-.597 1.523-1.164 2.86-1.265 2.965-.098.105-.668-1.09-1.27-2.652zm17.34-6.235c-1.851-.851-5.21-2.566-5.668-2.89-.094-.067 2.383-4.149 3.645-6.004l.988-1.457.172.726c1.105 4.625 1.77 6.977 2.457 8.688.45 1.12.805 2.035.793 2.035-.016-.004-1.09-.496-2.387-1.098zM9.25 73.38c-2.602-1.817-6.95-5.238-7.223-5.68-.257-.418 8.602-9.004 9.293-9.004.114 0 1.075 1.14 2.133 2.532 1.063 1.394 2.48 3.164 3.156 3.933.676.77 1.23 1.45 1.23 1.512 0 .062-.85 1.387-1.894 2.941-1.039 1.551-2.246 3.45-2.675 4.211-.43.762-.918 1.387-1.09 1.387-.168 0-1.489-.824-2.93-1.832zM.242 61.824c.035-3.027 1.055-9.922 2.055-13.883.992-3.921.797-3.894 2.598-.332.867 1.723 2.058 3.934 2.64 4.918l1.059 1.782-1.828 1.566c-1.004.86-2.883 2.605-4.176 3.875C1.297 61.023.242 61.957.242 61.824zm19.38-.793c-1.903-2.27-4.177-5.422-4.056-5.617.164-.266 2.973-2.172 5.258-3.57 1.531-.938 1.649-.973 1.496-.457-.562 1.925-1.36 5.972-1.582 8.02-.144 1.316-.285 2.421-.316 2.452-.031.032-.39-.343-.8-.828zm-8.364-12.07c-2.5-4.356-5.387-10.586-5.051-10.895.54-.504 9.703-3.07 12.41-3.476l1.055-.16.531 3.215c.29 1.77.777 4.253 1.086 5.523l.559 2.312-1.98 1.125c-1.09.622-3.177 1.926-4.634 2.899l-2.648 1.77zm14.805-9.977a161.737 161.737 0 01-.708-4.062l-.203-1.36 1.23-.144c.68-.078 2.532-.215 4.118-.3l2.887-.153-.989 1.055c-1.632 1.742-3.488 4.082-4.695 5.93l-1.137 1.737zm-16.16-8.816c1.648-2.793 6.855-9.422 8.62-10.98l.52-.461v10.132l-2.11.41c-1.835.356-5.757 1.313-7.152 1.743-.426.133-.418.062.121-.844zm14.73-8.176c.043-3.324.14-6.105.219-6.183.27-.274 11.554 1.972 11.98 2.382.04.04-.3 1.301-.754 2.809-.457 1.512-1.02 3.57-1.254 4.574l-.426 1.836-3.398.15c-1.871.082-4.086.222-4.922.312l-1.523.164zm16.105 4.942c0-.11.957-3.567 1.465-5.286l.477-1.609 2.945 1.211c3.902 1.605 3.813 1.547 2.941 1.91-2.035.856-5.39 2.48-6.421 3.117-1.094.672-1.407.817-1.407.657zm10.848-9.688c-.863-.433-2.723-1.254-4.133-1.824l-2.566-1.035.25-.715c.316-.906 3.847-7.985 4.508-9.04l.496-.792 1.507 1.015c1.973 1.336 5.598 4.047 6.793 5.086l.95.825-2.52 2.875c-1.383 1.578-2.785 3.214-3.117 3.632l-.602.766zm-15.79-5.578a145.584 145.584 0 00-4.698-1.117l-1.57-.324 2.124-1.262a82.044 82.044 0 013.86-2.133c1.855-.937 7.449-3.242 7.57-3.121.04.039-.39.984-.96 2.098-.567 1.113-1.458 3-1.977 4.195-.52 1.191-1.004 2.234-1.079 2.312-.074.079-1.546-.214-3.27-.648zm0 0" fill="#3eb049"/></svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M7.6 50c1.4 0 2.8.6 3.7 1.8v-1.5h2.5v11.5h-1.7c-.4 0-.8-.3-.8-.8v-.8c-.9 1.1-2.3 1.8-3.7 1.7C4.5 61.8 2 59.2 2 56v-.1c-.1-3.1 2.3-5.8 5.6-5.9m.4 2.3c-1.9 0-3.5 1.6-3.4 3.5v.2c-.2 1.9 1.3 3.6 3.2 3.7 1.9.2 3.6-1.3 3.7-3.2V56c.1-1.9-1.3-3.5-3.2-3.7H8m8.6-2.1h2.5v1.5c.8-1.2 2.1-1.9 3.5-1.8 2.7 0 4.4 1.9 4.4 4.8v6.9h-1.7c-.4 0-.8-.3-.8-.8v-5.7c0-1.8-.9-2.9-2.4-2.9-1.7 0-3 1.3-3 3.8v5.7h-1.7c-.4 0-.8-.4-.8-.8V50.2zm18-.3c1.4 0 2.8.6 3.7 1.7v-7.3h2.5v17.3h-1.6c-.4 0-.8-.3-.8-.8V60c-.9 1.1-2.3 1.8-3.7 1.8-3.2-.1-5.6-2.8-5.5-5.9v-.1c-.2-3 2.2-5.7 5.4-5.9m.5 2.3c-1.9 0-3.5 1.6-3.4 3.5v.2c-.2 1.9 1.3 3.6 3.2 3.7 1.9.2 3.6-1.3 3.7-3.2v-.5c.1-1.9-1.3-3.5-3.2-3.7h-.3m8.7-2.1h2.5v2.1c.4-1.3 1.7-2.2 3-2.2.3 0 .7 0 1 .1v2.6c-.4-.1-.8-.2-1.3-.2-1.4 0-2.8 1.2-2.8 3.5v5.6h-1.8c-.4 0-.8-.3-.8-.8l.2-10.7zM57.2 62c-3.3 0-5.9-2.7-5.9-6s2.7-5.9 6-5.9 5.9 2.7 5.9 6c0 3.2-2.7 5.9-5.9 5.9h-.1m0-2.4c1.9 0 3.5-1.5 3.5-3.5V56c0-1.9-1.6-3.5-3.5-3.5s-3.5 1.6-3.5 3.5c-.1 1.9 1.4 3.5 3.3 3.6h.2m9.3-11.9c-.9 0-1.7-.8-1.7-1.7 0-.9.8-1.7 1.7-1.7.9 0 1.7.8 1.7 1.7 0 .9-.7 1.7-1.7 1.7m-1.2 2.5h2.5v11.5h-1.7c-.2 0-.4-.1-.6-.2-.1-.2-.2-.4-.2-.6V50.2zm10.2-.2c1.5 0 2.9.6 3.8 1.8v-7.4h2.5v17.3H80c-.4 0-.8-.3-.8-.8v-.8c-.9 1.1-2.2 1.8-3.7 1.8-3.2-.1-5.7-2.7-5.6-5.9v-.1c-.2-3.1 2.3-5.8 5.6-5.9-.1-.1-.1-.1 0 0m.4 2.2c-1.9 0-3.4 1.6-3.4 3.5v.2c-.2 1.9 1.3 3.6 3.2 3.7s3.6-1.3 3.7-3.2v-.5c.1-1.9-1.3-3.5-3.2-3.7h-.3M29.8 79.7v-5.6h-2.4v-2.3h2.4v-3.2h2.5v3.2h3.3v2.3h-3.3v5.2c0 1.5.6 2 2 2 .5 0 .9-.1 1.4-.2v2.3c-.6.2-1.3.3-1.9.3-2 .2-3.8-1.2-4-3.2-.1-.4-.1-.6 0-.8zm39.7-2.1c0-3.4 2.7-6.1 6.1-6.1 3.4 0 6.1 2.7 6.1 6.1 0 3.4-2.7 6.1-6.1 6.1-3.3 0-6.1-2.6-6.1-5.9v-.2zm9.6 0c-.1-2-1.7-3.6-3.7-3.5-2 .1-3.6 1.7-3.5 3.7s1.7 3.6 3.7 3.5c1.9-.1 3.4-1.6 3.5-3.5v-.2zm-59.3 2.3c.2 1.1 1.3 1.9 2.4 1.7 1.1 0 1.9-.5 1.9-1.2s-.5-1.2-1.7-1.5l-1.9-.5c-1.7-.3-3-1.8-3-3.5 0-2 1.7-3.3 4.3-3.3s4.2 1.4 4.5 3.5h-2.5c-.2-.9-1-1.5-1.9-1.4-1 0-1.7.4-1.7 1.2s.5 1.1 1.6 1.4l2 .5c2.1.5 3.1 1.7 3.1 3.5 0 2.2-1.9 3.4-4.6 3.4-1.3 0-2.5-.3-3.5-1.1-.9-.6-1.5-1.6-1.5-2.7h2.5zm25.4 1.9c-.7 1.2-2 1.9-3.4 1.8-2.7 0-4.3-1.9-4.3-4.9v-7h2.6v6.5c0 1.9.8 3 2.3 3 1.7 0 2.8-1.4 2.8-3.8v-5.7h2.6v11.6h-2.6v-1.5zm14 0c-.9 1.1-2.2 1.8-3.6 1.8-3.2-.1-5.7-2.7-5.6-5.8v-.2c-.2-3.1 2.3-5.8 5.4-6h.2c1.4 0 2.8.6 3.7 1.8v-7.3h2.5v17.3h-2.6v-1.6zm-5.7-1.6c.6.7 1.5 1.1 2.5 1.1.9 0 1.8-.4 2.5-1.1 1.3-1.5 1.3-3.8 0-5.3-.6-.7-1.5-1.1-2.5-1.1-.9 0-1.9.3-2.5 1.1-1.3 1.6-1.3 3.8 0 5.3zm12.4-14.3c.9.1 1.6.9 1.6 1.8-.1.8-.7 1.5-1.6 1.6-.6 0-1.2-.3-1.5-.8-.3-.5-.3-1.2 0-1.7s.9-.9 1.5-.9zm1.3 5.9v11.6h-2.5V71.8h2.5z"/><path fill="#073042" d="M105.7 49.3h-8.9c-1.8 0-3.3 1.5-3.3 3.3-.1 1.8 1.3 3.2 3.1 3.3h9.2l-.1-6.6z"/><path fill="#4285F4" d="M125.9 78.4H96.7c-1.8 0-3.3-1.5-3.3-3.3V52.5c0 1.8 1.4 3.3 3.3 3.3h24.4s4.8-.4 4.8 3.2v19.4z"/><path fill="#3870B2" d="M112.3 66.8c1.3-1 1.6-2.8.6-4.1-.5-.7-1.4-1.1-2.3-1.2h.6v-1.8c0-.2-.1-.4-.3-.5-.3-.2-.6-.1-.8.2-.1.1-.1.2-.1.3v1.9c-1.6.2-2.7 1.8-2.5 3.4.1.8.5 1.5 1.2 1.9l-5.4 11.5h3.5l2.5-5.3c.3-.6 1.1-.9 1.7-.6.3.1.5.3.6.6l2.6 5.3h3.6l-5.5-11.6zm-1.8-.5c-1 0-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8c.5 0 .9.2 1.2.5.7.7.7 1.9 0 2.6-.2.3-.7.5-1.2.5z"/><path fill="#FFF" d="M103.7 50.9h12.5v2.3h-12.5v-2.3z"/><path fill="#073042" d="M109.5 62.7c1 0 1.8.8 1.8 1.8s-.8 1.8-1.8 1.8-1.8-.8-1.8-1.8c0-.5.2-.9.5-1.3.4-.3.8-.5 1.3-.5zm.7-1.1v-1.9c0-.2-.1-.4-.3-.5-.3-.2-.6-.1-.8.2-.1.1-.1.2-.1.3v1.9c-1.6.2-2.7 1.8-2.5 3.4.1.8.5 1.5 1.2 1.9l-6.8 14.5c-.3.5-.2 1.1.1 1.6.5.7 1.5.9 2.2.4.2-.2.4-.4.6-.7l4.5-9.7c.3-.6 1.1-.9 1.7-.6.3.1.5.3.6.6l4.6 9.6c.4.8 1.3 1.1 2.1.7s1.1-1.3.7-2.1l-7-14.5c1.3-1 1.5-2.9.5-4.2-.1-.3-.6-.7-1.3-.9"/><path fill="#3DDC84" d="M114.4 52.9c-.5 0-.9-.4-.9-.8 0-.2.1-.5.3-.6.3-.3.9-.3 1.2 0 .2.2.2.4.3.6-.1.4-.4.8-.9.8m-9.4 0c-.5 0-.9-.4-.9-.8 0-.2.1-.5.3-.6.3-.4.8-.4 1.2-.1.4.3.4.9.1 1.2l-.1.1c-.2.1-.4.2-.6.2m9.7-5.1l1.7-2.9c.1-.2 0-.4-.1-.5-.1-.1-.3 0-.4.1l-1.8 3c-2.8-1.2-6-1.2-8.7 0l-1.7-3c-.1-.1-.2-.2-.3-.2-.1 0-.2.1-.3.2-.1.1-.1.2 0 .4l1.7 2.9c-3 1.6-4.9 4.7-5.2 8H120c-.4-3.4-2.3-6.4-5.3-8"/><path fill="#073042" d="M123 62.1h-1.3c-.1 0-.1.1-.1.2v21.2c0 .1.1.2.2.2h1.4c1.6 0 2.9-1.3 2.9-2.9V59.1c-.1 1.7-1.4 3-3.1 3z"/></svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#073042" d="M51.3 17.7H23.2C17.6 17.7 13 22.3 13 28c-.2 5.5 4.2 10.1 9.7 10.3h28.9l-.3-20.6z"/><path fill="#4285F4" d="M115 109.3H23.2c-5.7 0-10.2-4.6-10.2-10.3V27.9c0 5.7 4.6 10.3 10.2 10.4h76.9s15-1.3 15 10v61z"/><path fill="#3870B2" d="M72.2 72.9C76.3 69.8 77.1 64 74 60c-1.7-2.2-4.3-3.6-7.1-3.7h.3c.5-.1 1.1-.1 1.6 0v-5.7c0-.7-.3-1.3-.9-1.6-.9-.5-2-.2-2.5.7-.2.3-.3.6-.2 1v5.8c-5 .8-8.5 5.5-7.7 10.6v.1c.4 2.4 1.7 4.6 3.7 6l-16.9 36.2h11l7.8-16.6c.9-2 3.3-2.9 5.4-1.9.8.4 1.5 1.1 1.9 1.9l8.1 16.6h11.2L72.2 72.9zm-5.7-1.6c-3.2 0-5.7-2.6-5.7-5.8 0-3.2 2.6-5.7 5.8-5.6 1.5 0 2.8.6 3.9 1.6 2.3 2.2 2.3 5.8.1 8.1-1 1-2.5 1.7-4.1 1.7z"/><path fill="#FFF" d="M45.2 22.7h39.4v7.2H45.2v-7.2z"/><path fill="#073042" d="M63.5 59.8c3.1 0 5.7 2.6 5.6 5.8 0 3.1-2.6 5.7-5.8 5.6-3.1 0-5.6-2.6-5.6-5.7 0-1.5.6-2.9 1.7-4s2.6-1.7 4.1-1.7zm2.2-3.3v-6c0-.7-.3-1.3-.9-1.6-.9-.5-2-.2-2.5.7-.2.3-.3.6-.2 1v5.8c-5 .8-8.5 5.5-7.7 10.6v.1c.4 2.4 1.7 4.6 3.7 6l-21.3 45.7c-.8 1.6-.7 3.6.4 5.1 1.6 2.3 4.7 2.9 7 1.3.8-.5 1.4-1.3 1.8-2.1l14.2-30.4c.9-2 3.3-2.9 5.4-1.9.8.4 1.5 1.1 1.9 1.9L82 122.8c1.2 2.5 4.2 3.5 6.7 2.3 2.5-1.2 3.5-4.2 2.3-6.7L69.1 72.9c4-3.2 4.7-9.1 1.5-13.1-1.2-1.6-2.9-2.7-4.9-3.3"/><path fill="#3DDC84" d="M78.8 29.1c-1.5 0-2.7-1.1-2.7-2.6 0-.7.3-1.5.8-2 1.1-1 2.7-1 3.8 0 .5.5.8 1.2.8 1.9-.1 1.5-1.2 2.6-2.7 2.7M49.2 29c-1.5 0-2.7-1.2-2.7-2.6 0-.7.3-1.4.8-1.9.9-1.1 2.6-1.3 3.7-.4h.1c1.1 1 1.2 2.7.2 3.8l-.3.4c-.5.5-1.2.8-1.9.8m30.5-16.2l5.3-9.2c.3-.5.1-1.1-.3-1.5-.5-.2-1-.1-1.3.3L77.8 12C69 8.1 59 8.1 50.3 12l-5.4-9.4c-.2-.3-.6-.6-1-.6s-.8.2-1 .6c-.2.3-.2.8 0 1.1l5.4 9.2C38.9 18 32.8 27.6 31.9 38.2h64.2c-.8-10.7-7-20.2-16.4-25.3"/><path fill="#073042" d="M105.6 58.1h-4.2c-.2.1-.4.3-.4.6v66.5c0 .3.2.5.5.5h4.4c5.1 0 9.2-4.2 9.2-9.2V48.8c0 5.1-4.1 9.2-9.2 9.2h-.3z"/></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#4285F4" d="M7.6 50c1.4 0 2.8.6 3.7 1.8v-1.5h2.5v11.6h-1.7c-.4 0-.8-.3-.8-.8v-.8c-.9 1.1-2.2 1.8-3.7 1.8C4.4 62 2 59.4 2 56.2v-.1c-.1-3.3 2.3-6 5.6-6.1m.4 2.3c-1.9 0-3.5 1.6-3.4 3.5v.2c-.2 1.9 1.3 3.6 3.2 3.7 1.9.2 3.6-1.3 3.7-3.2V56c.1-1.9-1.3-3.5-3.2-3.7H8m8.6-2.1h2.5v1.5c.8-1.2 2.1-1.9 3.5-1.8 2.7 0 4.4 1.9 4.4 4.8v7h-1.7c-.4 0-.8-.3-.8-.8v-5.7c0-1.8-.9-2.9-2.4-2.9-1.7 0-3 1.3-3 3.8v5.7h-1.7c-.4 0-.8-.4-.8-.8V50.2zm18-.3c1.4 0 2.8.6 3.7 1.7v-7.3h2.5v17.3h-1.6c-.4 0-.8-.3-.8-.8V60c-.9 1.1-2.3 1.8-3.7 1.8-3.2-.1-5.7-2.8-5.5-5.9v-.1c-.2-3.1 2.2-5.7 5.4-5.9m.6 2.3c-1.9 0-3.5 1.6-3.4 3.5v.2c-.2 1.9 1.3 3.6 3.2 3.7 1.9.2 3.6-1.3 3.7-3.2v-.5c.1-1.9-1.3-3.5-3.2-3.7h-.3m8.6-2.1h2.5v2.1c.4-1.3 1.7-2.2 3-2.2.3 0 .7 0 1 .1v2.6c-.4-.1-.8-.2-1.3-.2-1.4 0-2.8 1.2-2.8 3.5v5.6h-1.8c-.4 0-.8-.3-.8-.8l.2-10.7zM57.2 62c-3.3 0-5.9-2.7-5.9-6s2.7-5.9 6-5.9 5.9 2.7 5.9 6c0 3.2-2.7 5.9-5.9 5.9h-.1m0-2.4c1.9 0 3.5-1.5 3.5-3.5V56c0-1.9-1.6-3.5-3.5-3.5s-3.5 1.6-3.5 3.5c-.1 1.9 1.4 3.5 3.3 3.6h.2m9.4-11.9c-.9 0-1.7-.8-1.7-1.7 0-.9.8-1.7 1.7-1.7.9 0 1.7.8 1.7 1.7 0 .9-.8 1.7-1.7 1.7m-1.3 2.5h2.5v11.5h-1.7c-.2 0-.4-.1-.6-.2-.1-.2-.2-.4-.2-.6V50.2zm10.2-.2c1.5 0 2.9.6 3.8 1.8v-7.4h2.5v17.3H80c-.4 0-.8-.3-.8-.8v-.8c-.9 1.1-2.2 1.8-3.7 1.8-3.2-.1-5.7-2.7-5.6-5.9v-.1c-.1-3.2 2.3-5.8 5.6-5.9-.1-.1-.1-.1 0 0m.4 2.2c-1.9 0-3.4 1.6-3.4 3.5v.2c-.2 1.9 1.3 3.6 3.2 3.7 1.9.2 3.6-1.3 3.7-3.2v-.5c.1-1.9-1.3-3.5-3.2-3.7h-.3M29.8 79.7v-5.6h-2.4v-2.3h2.4v-3.2h2.6v3.2h3.3v2.3h-3.3v5.2c0 1.5.6 2 2 2 .5 0 .9-.1 1.4-.2v2.3c-.6.2-1.3.3-1.9.3-2 .2-3.8-1.2-4-3.2-.1-.4-.1-.6-.1-.8zm39.7-2.1c0-3.4 2.7-6.1 6.1-6.1 3.4 0 6.1 2.7 6.1 6.1 0 3.4-2.7 6.1-6.1 6.1-3.3 0-6.1-2.6-6.1-5.9v-.2zm9.6 0c-.1-2-1.7-3.6-3.7-3.5-2 .1-3.6 1.7-3.5 3.7.1 2 1.7 3.6 3.7 3.5 1.9-.1 3.5-1.6 3.5-3.5v-.2zm-59.3 2.3c.2 1.1 1.3 1.9 2.4 1.7 1.1 0 1.9-.5 1.9-1.2s-.5-1.2-1.7-1.5l-1.9-.5c-1.7-.3-3-1.8-3-3.5 0-2 1.7-3.3 4.3-3.3s4.2 1.4 4.5 3.5h-2.5c-.2-.9-1-1.5-1.9-1.4-1 0-1.7.4-1.7 1.2 0 .7.5 1.1 1.6 1.4l2 .5c2.1.5 3.1 1.7 3.1 3.5 0 2.2-1.9 3.4-4.6 3.4-1.3 0-2.5-.3-3.5-1.1-.9-.6-1.5-1.6-1.5-2.7h2.5zm25.4 1.9c-.7 1.2-2 1.9-3.4 1.8-2.7 0-4.3-1.9-4.3-4.9v-7h2.6v6.5c0 1.9.8 3 2.3 3 1.7 0 2.8-1.4 2.8-3.8v-5.7h2.6v11.6h-2.6v-1.5zm14 0c-.9 1.1-2.2 1.8-3.6 1.8-3.2-.1-5.7-2.7-5.6-5.8v-.2c-.2-3.1 2.3-5.8 5.4-6h.2c1.4 0 2.8.6 3.7 1.8v-7.3h2.5v17.3h-2.6v-1.6zm-5.7-1.5c.6.7 1.5 1.1 2.5 1.1.9 0 1.8-.4 2.5-1.1 1.3-1.5 1.3-3.8 0-5.3-.6-.7-1.5-1.1-2.5-1.1-.9 0-1.9.3-2.5 1.1-1.3 1.5-1.3 3.7 0 5.3zm12.4-14.4c.9.1 1.6.9 1.6 1.8-.1.8-.7 1.5-1.6 1.6-.6 0-1.2-.3-1.5-.8-.3-.5-.3-1.2 0-1.7.4-.5.9-.9 1.5-.9zm1.3 5.9v11.6h-2.5V71.8h2.5zm30.1-22.5h4.3c-1.6 1.6-2.5 3.5-2.8 5.8h-1.7c-1.8 0-3.1-1.4-3.1-3 .1-1.6 1.5-2.8 3.3-2.8zm12.8 24.5c.3.7 2.2 4.6 2.2 4.6h-5.4s1.8-3.6 2.1-4.6c.3-.7.8-.7 1.1 0z"/><path fill="#4285F4" d="M125.9 58.9c-.3 1.4-1.8 2.4-3.5 2.4h-1.6c-.1 0-.2.1-.1.2v16.9h-2.9l-5.6-11.5c.6-.6.9-1.5.9-2.4 0-1.5-.9-2.9-2.2-3.4v-1.6c0-.7-.6-1.2-1.2-1.2h-.1c-.7 0-1.2.6-1.2 1.2V61c-1.5.5-2.5 1.9-2.5 3.5 0 1 .4 1.8 1 2.5l-5.4 11.4h-4.7c-1.8 0-3.3-1.5-3.3-3.3v-22s0-.2 0 0c.3 1.5 1.6 2.7 3.2 2.7h24.5s4.6-.4 4.7 3.1z"/><path fill="#4285F4" d="M109.5 62.7c1 0 1.8.8 1.8 1.8s-.8 1.8-1.8 1.8-1.8-.8-1.8-1.8c0-.5.2-.9.5-1.3.4-.3.8-.5 1.3-.5zm.7-1.1v-1.9c0-.2-.1-.4-.3-.5-.3-.2-.6-.1-.8.2-.1.1-.1.2-.1.3v1.9c-1.6.2-2.7 1.8-2.5 3.4.1.8.5 1.5 1.2 1.9L101 81.4c-.3.5-.2 1.1.1 1.6.5.7 1.5.9 2.2.4.2-.2.4-.4.6-.7l4.5-9.7c.3-.6 1.1-.9 1.7-.6.3.1.5.3.6.6l4.6 9.6c.4.8 1.3 1.1 2.1.7s1.1-1.3.7-2.1l-7-14.5c1.3-1 1.5-2.9.5-4.2-.2-.3-.7-.7-1.4-.9m4.5-13.8l1.7-2.9c.1-.2 0-.4-.1-.5-.1-.1-.3 0-.4.1l-1.8 3c-2.8-1.3-6-1.3-8.7 0l-1.7-3c-.1-.1-.2-.2-.3-.2-.1 0-.2.1-.3.2-.1.1-.1.3 0 .4l1.7 2.9c-2.8 1.5-4.7 4.2-5.1 7.3H120c-.6-3.1-2.5-5.8-5.3-7.3zm-9.1 4.7l-.1.1c-.2.2-.4.2-.6.2-.5 0-.8-.4-.9-.8 0-.2.1-.4.3-.6.3-.4.8-.4 1.2-.1.4.3.5.9.1 1.2zm8.8.4c-.5 0-.9-.3-.9-.8 0-.2.1-.4.3-.6.3-.3.9-.3 1.2 0 .2.2.2.4.3.6-.1.4-.5.8-.9.8zm8.6 9.2h-1.3c-.1 0-.1.1-.1.2v21.2c0 .1.1.2.2.2h1.4c1.6 0 2.9-1.3 2.9-2.9V60.6c0-.8-.1-.2-.2-.1-.6.9-1.7 1.6-2.9 1.6z"/><circle fill="#4285F4" cx="109.5" cy="64.5" r="1"/></svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#4285F4" d="M25.1 17.7l13.4.1c-4.9 4.9-7.8 11.2-8.8 18.3l-5.1-.1c-5.5-.2-9.8-4.3-9.7-9.3 0-5.1 4.5-9 10.2-9zm40.2 77.2c.9 2.2 6.9 14.4 6.9 14.4H55.1s5.5-11.5 6.7-14.4c1-2.2 2.5-2.3 3.5 0z"/><path fill="#4285F4" d="M114.9 47.9c-1.1 4.3-5.5 7.5-10.9 7.5h-5c-.3.1-.5.3-.4.6v53.3h-9.1L72 73.1c1.8-2 2.9-4.7 2.9-7.6 0-4.8-2.8-9.1-7-10.8v-4.9c0-2.1-1.8-3.6-3.9-3.6h-.2c-2.1 0-3.9 1.8-3.9 3.9v4.6c-4.6 1.5-8 5.8-8 11 0 3 1.2 5.8 3.1 7.8l-17 35.9H23.1c-5.7 0-10.2-4.6-10.2-10.3V29.7s0-.6.1 0c.8 4.8 5 8.5 10.1 8.6H100c-.1 0 14.6-1.3 14.9 9.6z"/><path fill="#4285F4" d="M63.3 59.8c3.1 0 5.7 2.6 5.6 5.8 0 3.1-2.6 5.7-5.8 5.6-3.1 0-5.6-2.6-5.6-5.7 0-1.5.6-2.9 1.7-4 1.2-1.1 2.6-1.7 4.1-1.7zm2.3-3.3v-6c0-.7-.3-1.3-.9-1.6-.9-.5-2-.2-2.5.7-.2.3-.3.6-.2 1v5.8c-5 .8-8.5 5.5-7.7 10.6v.1c.4 2.4 1.7 4.6 3.7 6l-21.3 45.7c-.8 1.6-.7 3.6.4 5.1 1.6 2.3 4.7 2.9 7 1.3.8-.5 1.4-1.3 1.8-2.1L60 92.5c.9-2 3.3-2.9 5.4-1.9.8.4 1.5 1.1 1.9 1.9l14.5 30.3c1.2 2.5 4.2 3.5 6.7 2.3s3.5-4.2 2.3-6.7L69 72.9c4-3.2 4.7-9.1 1.5-13.1-1.2-1.6-2.9-2.7-4.9-3.3m14-43.6h-.1l5.3-9.2c.3-.5.1-1.1-.3-1.5-.5-.2-1-.1-1.3.3L77.6 12c-8.7-3.9-18.7-3.9-27.5 0l-5.4-9.4c-.2-.3-.6-.6-1-.6s-.8.2-1 .6c-.2.4-.2.8 0 1.1l5.4 9.2c-8.8 4.9-14.6 13.3-16 23.1h63.8c-1.5-9.8-7.5-18.2-16.3-23.1zM51.2 28l-.4.4c-.5.5-1.2.8-1.9.8h.1c-1.5 0-2.7-1.2-2.7-2.6v-.1c0-.7.3-1.4.8-1.9.9-1.1 2.6-1.3 3.7-.4 1.3.9 1.4 2.6.4 3.8zm27.4 1c-1.5.1-2.7-1.1-2.7-2.6v-.1c0-.7.3-1.4.8-1.9 1-1 2.7-1 3.8 0 .5.5.8 1.2.8 1.9 0 1.6-1.2 2.7-2.7 2.7zm27.1 29h-4.2c-.2.1-.4.3-.4.6v66.5c0 .3.2.5.5.5h4.4c5.1 0 9.2-4.2 9.2-9.2 0 0-.1-61.1 0-63.4.1-2.4-.5-.7-.7-.2-1.5 3.2-4.8 5.3-8.6 5.3h-.2z"/><circle fill="#4285F4" cx="63.3" cy="65.5" r="3.2"/></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#1A1918" d="M40.1 125.86c-.2 0-.4-.1-.6-.3l-6.9-9v9.2H31v-11.3c0-.5.4-.8.8-.8.2 0 .5.1.6.3l6.9 9v-9.2h1.6v11.3c0 .5-.4.8-.8.8m12.9.1c-1.6 0-3.2-.3-4.7-.9l.4-1.3c1.4.5 2.9.8 4.4.8 2 0 3-.7 3-1.7 0-.9-.8-1.4-3.6-2.7-2.8-1.3-3.8-2.1-3.8-3.8 0-2 1.6-2.9 4.5-2.9 1.2 0 3.1.3 4.2.6l-.2 1.3c-1.2-.3-2.7-.5-3.9-.5-2.1 0-2.9.4-2.9 1.4 0 1 .6 1.4 3.5 2.7 3.1 1.4 3.9 2.1 3.9 3.6-.1 2.4-2.2 3.4-4.8 3.4m12.1-12.2h1.6v12h-1.6v-12zm15.4 6.6h-4v4.1h4c1.4 0 2.2-.9 2.2-2.1 0-1.1-.9-2-2.2-2m-.8-5.2h-3.2v3.8h3.2c1.3 0 2.2-.8 2.2-2 0-1.1-.8-1.8-2.2-1.8m.8 10.6h-4.8c-.5 0-.8-.4-.8-.8v-10.4c0-.4.4-.8.8-.8h4c2.5 0 3.9 1.2 3.9 3.1 0 1-.6 2-1.5 2.5 1.4.4 2.3 1.6 2.3 2.9-.1 2-1.7 3.5-3.9 3.5m11.6 0c-.4 0-.8-.4-.8-.8v-11.2h1.6v10.6h6.4v1.5l-7.2-.1zm18.3.2c-3.3 0-5.3-1.2-5.3-3.7 0-1.2.7-2.3 1.9-2.8-1-.7-1.6-1.6-1.6-2.6 0-2.2 1.7-3.3 5-3.3 1.1 0 2.6.1 3.9.4l-.2 1.3c-1.4-.2-2.6-.3-3.8-.3-2.1 0-3.2.6-3.2 2 0 1.1 1 2 2.4 2h2.8c.4 0 .7.3.7.7 0 .4-.3.7-.7.7h-3c-1.6 0-2.6.8-2.6 2 0 1.8 1.6 2.3 3.6 2.3 1.1 0 2.6-.1 3.8-.4l.2 1.3c-1 .2-2.6.4-3.9.4m-91.4-9.9l2.8 7.1-4.3-3.4 1.5-3.7zm5 8.7l-4.4-10.7c-.1-.3-.4-.5-.7-.5s-.6.2-.7.5l-4.8 11.7H15l1.9-4.8 5.7 4.6c.2.2.4.3.6.3.4 0 .8-.3.8-.8.1 0 .1-.2 0-.3zM114.5 52.4c0 27.8-22.6 50.4-50.4 50.4-27.8 0-50.4-22.6-50.4-50.4C13.7 24.6 36.3 2 64.1 2c27.8 0 50.4 22.6 50.4 50.4"/><path fill="#FFF" d="M64.9 32.8L78 65 58.3 49.5l6.6-16.7zm23.2 39.6l-20-48.3c-.6-1.4-1.7-2.1-3.1-2.1-1.4 0-2.6.7-3.2 2.1l-22 53h7.5L56 55.2l26 21c1 .8 1.8 1.2 2.8 1.2 2 0 3.7-1.5 3.7-3.6 0-.3-.2-.8-.4-1.4z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#1A1918" d="M126 64c0 34.2-27.8 62-62 62S2 98.2 2 64 29.8 2 64 2s62 27.8 62 62"/><path fill="#FFF" d="M65 39.9l16 39.6-24.1-19.1L65 39.9zm28.5 48.7L68.9 29.2c-.7-1.7-2.1-2.6-3.8-2.6-1.7 0-3.2.9-3.9 2.6L34 94.3h9.3L54 67.5l32 25.9c1.3 1 2.2 1.5 3.4 1.5 2.4 0 4.5-1.8 4.5-4.4.1-.5-.1-1.2-.4-1.9z"/></svg>

Before

Width:  |  Height:  |  Size: 377 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#1A1918" d="M40.1 125.86c-.2 0-.4-.1-.6-.3l-6.9-9v9.2H31v-11.3c0-.5.4-.8.8-.8.2 0 .5.1.6.3l6.9 9v-9.2h1.6v11.3c0 .5-.4.8-.8.8zm12.9.1c-1.6 0-3.2-.3-4.7-.9l.4-1.3c1.4.5 2.9.8 4.4.8 2 0 3-.7 3-1.7 0-.9-.8-1.4-3.6-2.7-2.8-1.3-3.8-2.1-3.8-3.8 0-2 1.6-2.9 4.5-2.9 1.2 0 3.1.3 4.2.6l-.2 1.3c-1.2-.3-2.7-.5-3.9-.5-2.1 0-2.9.4-2.9 1.4 0 1 .6 1.4 3.5 2.7 3.1 1.4 3.9 2.1 3.9 3.6-.1 2.4-2.2 3.4-4.8 3.4zm12.1-12.2h1.6v12h-1.6v-12zm16.9 5.7c.9-.6 1.5-1.5 1.5-2.5 0-1.9-1.5-3.1-3.9-3.1h-4c-.5 0-.8.4-.8.8v10.4c0 .5.4.8.8.8h4.8c2.3 0 3.8-1.5 3.8-3.5.1-1.4-.8-2.5-2.2-2.9zm-5.5-4.3h3.2c1.4 0 2.2.7 2.2 1.9s-.9 2-2.2 2h-3.2v-3.9zm4 9.3h-4v-4.1h4c1.3 0 2.2.9 2.2 2 0 1.2-.9 2.1-2.2 2.1zm11.6 1.3c-.4 0-.8-.4-.8-.8v-11.2h1.6v10.6h6.4v1.5l-7.2-.1zm18.3.2c-3.3 0-5.3-1.2-5.3-3.7 0-1.2.7-2.3 1.9-2.8-1-.7-1.6-1.6-1.6-2.6 0-2.2 1.7-3.3 5-3.3 1.1 0 2.6.1 3.9.4l-.2 1.3c-1.4-.2-2.6-.3-3.8-.3-2.1 0-3.2.6-3.2 2 0 1.1 1 2 2.4 2h2.8c.4 0 .7.3.7.7 0 .4-.3.7-.7.7h-3c-1.6 0-2.6.8-2.6 2 0 1.8 1.6 2.3 3.6 2.3 1.1 0 2.6-.1 3.8-.4l.2 1.3c-1 .2-2.6.4-3.9.4zm-86.4-1.2l-4.4-10.7c-.1-.3-.4-.5-.7-.5-.3 0-.6.2-.7.5l-4.8 11.7H15l1.9-4.8 5.7 4.6c.2.2.4.3.6.3.4 0 .8-.3.8-.8.1 0 .1-.2 0-.3zm-6.5-5.1l1.4-3.7 2.8 7.1-4.2-3.4zM64.1 2C36.3 2 13.7 24.6 13.7 52.4c0 27.8 22.6 50.4 50.4 50.4 27.8 0 50.4-22.6 50.4-50.4C114.5 24.6 91.9 2 64.1 2zm20.7 75.5c-1 0-1.7-.4-2.8-1.2l-26-21-8.7 21.8h-7.5l22-53c.6-1.4 1.8-2.1 3.2-2.1s2.5.7 3.1 2.1l20.1 48.3c.2.6.4 1.1.4 1.5-.1 2.1-1.9 3.6-3.8 3.6z"/><path fill="#1A1918" d="M64.9 32.8L78 65 58.3 49.5z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#1A1918" d="M64 2C29.8 2 2 29.8 2 64s27.8 62 62 62 62-27.8 62-62S98.2 2 64 2zm25.4 92.8c-1.2 0-2.1-.5-3.4-1.5L54 67.5 43.3 94.3H34l27.1-65.1c.7-1.7 2.2-2.6 3.9-2.6 1.7 0 3.1.9 3.8 2.6l24.7 59.4c.3.7.4 1.4.4 1.8.1 2.6-2 4.4-4.5 4.4z"/><path fill="#1A1918" d="M65 39.9l16.1 39.6-24.3-19.1z"/></svg>

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><linearGradient id="bamboo-original-wordmark-a" gradientUnits="userSpaceOnUse" x1="11.217" y1="7.486" x2="11.217" y2="21.607" gradientTransform="matrix(4.06815 0 0 4.06815 -2.193 -13.325)"><stop offset="0" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient><linearGradient id="bamboo-original-wordmark-b" gradientUnits="userSpaceOnUse" x1="11.168" y1="7.486" x2="11.168" y2="21.607" gradientTransform="matrix(4.06815 0 0 4.06815 -2.193 -13.325)"><stop offset="0" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient></defs><path d="M103.71 58.512H83.376c-1.254 0-2.508.976-2.648 2.23-1.114 8.078-8.082 14.348-16.438 14.348l5.434 25.074c19.78-2.644 35.242-18.805 36.636-38.867.141-1.531-1.113-2.785-2.648-2.785zm0 0M68.742 57.816l29.254-25.078c1.254-1.113 1.254-2.925 0-4.039L68.742 3.625c-1.672-1.535-4.32-.281-4.32 1.95v50.152c-.137 2.367 2.508 3.62 4.32 2.09zm0 0" fill="#2684ff"/><path d="M22.496 63.945c2.645 20.617 20.34 36.637 41.793 36.637V75.09c-9.195 0-16.719-7.383-16.719-16.578zm0 0" fill="url(#bamboo-original-wordmark-a)"/><path d="M22.215 58.094v.418H47.71c0-9.196 7.523-16.578 16.715-16.578l-5.434-25.075c-20.617 2.645-36.637 20.059-36.777 41.235zm0 0" fill="url(#bamboo-original-wordmark-b)"/><path d="M11.371 104.098h8.07c3.934 0 5.836 1.933 5.836 5.035 0 2.336-1.066 3.77-3.234 4.27 2.832.464 4.27 2.03 4.27 4.765 0 3.07-2.07 5.203-6.403 5.203h-8.539zm2.668 2.504v5.734h5.07c2.5 0 3.536-1.137 3.536-3.004s-1.102-2.766-3.536-2.766h-5.07zm0 8.101v6h6.004c2.531 0 3.668-.898 3.668-2.832 0-2.07-1.102-3.168-3.734-3.168zm0 0M39.281 120.734c-.933 1.934-2.699 2.934-4.968 2.934-3.899 0-5.868-3.3-5.868-7.633 0-4.137 2.067-7.637 6.168-7.637 2.133 0 3.801.97 4.668 2.868v-2.567h2.535v14.672h-2.535zm-4.265.567c2.265 0 4.265-1.434 4.265-4.7v-1.167c0-3.266-1.832-4.7-4-4.7-2.836 0-4.3 1.868-4.3 5.266 0 3.535 1.398 5.3 4.035 5.3zm0 0M58.09 123.371h-2.535V114.5c0-2.633-1.067-3.8-3.47-3.8-2.331 0-3.968 1.566-3.968 4.534v8.168h-2.531v-14.668h2.531v2.399c.934-1.735 2.668-2.7 4.637-2.7 2.5 0 4.203 1.266 4.934 3.567.835-2.266 2.8-3.566 5.238-3.566 3.3 0 5.101 2.234 5.101 6.367v8.601h-2.535v-8.168c0-3.035-1.066-4.535-3.469-4.535-2.332 0-3.968 1.567-3.968 4.535v8.137zm0 0M74.094 120.77v2.566h-2.531V102.53h2.53v8.77c.934-1.934 2.704-2.934 4.97-2.934 3.902 0 5.87 3.301 5.87 7.637 0 4.133-2.07 7.633-6.167 7.633-2.137.035-3.805-.934-4.672-2.867zm4.27-10.036c-2.266 0-4.27 1.434-4.27 4.7v1.168c0 3.27 1.836 4.703 4.004 4.703 2.832 0 4.3-1.868 4.3-5.27 0-3.535-1.398-5.3-4.035-5.3zm0 0M86.965 116c0-4.398 2.57-7.602 6.972-7.602 4.368 0 6.934 3.204 6.934 7.602 0 4.402-2.566 7.668-6.933 7.668-4.372 0-6.973-3.266-6.973-7.668zm2.469 0c0 2.8 1.367 5.3 4.535 5.3 3.101 0 4.469-2.53 4.469-5.3 0-2.766-1.333-5.266-4.47-5.266-3.132 0-4.534 2.465-4.534 5.266zm0 0M102.941 116c0-4.398 2.567-7.602 6.97-7.602 4.366 0 6.933 3.204 6.933 7.602 0 4.402-2.567 7.668-6.934 7.668-4.402 0-6.969-3.266-6.969-7.668zm2.465 0c0 2.8 1.367 5.3 4.535 5.3 3.102 0 4.47-2.53 4.47-5.3 0-2.766-1.333-5.266-4.47-5.266-3.168 0-4.535 2.465-4.535 5.266zm0 0" fill="#253858"/></svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><linearGradient id="bamboo-original-a" gradientUnits="userSpaceOnUse" x1="11.217" y1="7.486" x2="11.217" y2="21.607" gradientTransform="scale(4)"><stop offset="0" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient><linearGradient id="bamboo-original-b" gradientUnits="userSpaceOnUse" x1="11.168" y1="7.486" x2="11.168" y2="21.607" gradientTransform="scale(4)"><stop offset="0" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient></defs><path d="M104.133 70.633h-20c-1.235 0-2.465.96-2.602 2.191-1.097 7.946-7.945 14.11-16.164 14.11l5.344 24.656c19.45-2.602 34.652-18.492 36.023-38.219.137-1.504-1.097-2.738-2.601-2.738zm0 0M69.746 69.95l28.766-24.657c1.234-1.098 1.234-2.879 0-3.973L69.746 16.664c-1.644-1.508-4.246-.273-4.246 1.918v49.313c-.137 2.328 2.465 3.562 4.246 2.054zm0 0" fill="#2684ff"/><path d="M24.273 75.977C26.88 96.247 44.273 112 65.367 112V86.934c-9.039 0-16.437-7.262-16.437-16.301zm0 0" fill="url(#bamboo-original-a)"/><path d="M24 70.223v.41h25.066c0-9.04 7.399-16.301 16.438-16.301L60.16 29.676C39.89 32.28 24.137 49.402 24 70.223zm0 0" fill="url(#bamboo-original-b)"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><linearGradient id="bitbucket-original-wordmark-a" gradientUnits="userSpaceOnUse" x1="28.593" y1="14.226" x2="16.672" y2="23.532" gradientTransform="matrix(4 0 0 4 .255 -8.676)"><stop offset=".176" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient></defs><path d="M19.336 11.324c-1.918 0-3.356 1.758-3.035 3.516l12.945 79.285c.32 2.078 2.078 3.52 4.156 3.52h62.664c1.438 0 2.715-1.122 3.036-2.56L112.21 15c.32-1.918-1.121-3.516-3.04-3.516zm54.988 57.227h-19.98L49.07 40.258h30.211zm0 0" fill="#2684ff"/><path d="M107.895 40.258H79.12L74.324 68.55h-19.98L30.848 96.523s1.117.961 2.715.961h62.664c1.437 0 2.714-1.12 3.035-2.558zm0 0" fill="url(#bitbucket-original-wordmark-a)"/><path d="M3.523 102.59h8.368c4.078 0 6.046 1.941 6.046 5.047 0 2.34-1.105 3.777-3.351 4.281 2.937.465 4.422 2.039 4.422 4.777 0 3.075-2.14 5.215-6.633 5.215H3.523zm2.766 8.258h5.254c2.594 0 3.664-1.137 3.664-3.008s-1.14-2.778-3.664-2.778H6.289zm0 2.37v6.016h6.223c2.625 0 3.8-.902 3.8-2.84 0-2.07-1.14-3.175-3.87-3.175zm0 0M23.504 101.555c1.07 0 1.832.636 1.832 1.773 0 1.102-.762 1.77-1.832 1.77-1.074 0-1.832-.637-1.832-1.77 0-1.137.758-1.773 1.832-1.773zm-1.352 5.648h2.63v14.707h-2.63zm0 0M34.734 119.535c.621 0 1.176-.133 1.66-.2v2.442c-.449.133-.968.235-1.761.235-3.25 0-4.84-1.84-4.84-4.582v-7.887H27.34v-2.34h2.453v-3.11h2.559v3.11h4.043v2.34h-4.043v7.789c0 1.3.793 2.203 2.382 2.203zm0 0M42.34 119.305v2.57h-2.63v-20.82h2.63v8.789c.965-1.938 2.797-2.942 5.148-2.942 4.043 0 6.082 3.309 6.082 7.657 0 4.144-2.14 7.652-6.394 7.652-2.211 0-3.903-.969-4.836-2.906zm4.457-10.028c-2.352 0-4.422 1.438-4.422 4.711v1.172c0 3.274 1.898 4.711 4.145 4.711 2.937 0 4.46-1.871 4.46-5.281-.035-3.574-1.488-5.313-4.183-5.313zm0 0M56.3 107.203h2.63v8.89c0 2.641 1.105 3.813 3.593 3.813 2.418 0 4.114-1.574 4.114-4.547v-8.156h2.625v14.707h-2.625v-2.406c-.969 1.738-2.766 2.707-4.805 2.707-3.492 0-5.496-2.34-5.496-6.383v-8.625zm0 0M83.918 121.508c-.898.469-2.316.668-3.7.668-5.425 0-7.948-3.172-7.948-7.688 0-4.445 2.523-7.617 7.949-7.617 1.383 0 2.418.164 3.629.7v2.34c-.97-.434-2.004-.704-3.422-.704-3.942 0-5.563 2.41-5.563 5.281 0 2.875 1.657 5.282 5.633 5.282 1.555 0 2.524-.2 3.457-.536v2.274zm0 0M86.89 121.91v-20.855h2.626v13.035l6.53-6.887h3.423l-7.153 7.219 7.465 7.488H96.22l-6.703-6.887v6.887zm0 0M108.422 122.21c-5.703 0-8.192-3.175-8.192-7.687 0-4.445 2.56-7.62 7.188-7.62 4.703 0 6.566 3.14 6.566 7.62v1.137h-11.093c.382 2.508 2.039 4.11 5.632 4.11 1.766 0 3.25-.332 4.633-.801v2.34c-1.242.668-3.18.902-4.734.902zm-5.567-8.722h8.504c-.136-2.742-1.418-4.281-4.043-4.281-2.765 0-4.183 1.738-4.46 4.281zm0 0M123.11 119.535c.624 0 1.175-.133 1.66-.2v2.442c-.45.133-.97.235-1.762.235-3.25 0-4.84-1.84-4.84-4.582v-7.887h-2.453v-2.34h2.453v-3.11h2.559v3.11h4.043v2.34h-4.043v7.789c0 1.3.793 2.203 2.382 2.203zm0 0" fill="#253858"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#205081" d="M47.962 108.392c-1.767 0-3.553.436-4.763.89v-6.622a.604.604 0 00-.605-.603h-3.57a.6.6 0 00-.6.603v22.802c0 .29.21.54.495.592 2.202.402 4.8.542 6.36.542 6.702 0 8.073-2.85 8.073-7.13v-4.99c0-4.04-1.814-6.084-5.39-6.084zm-2.477 14.06c-.904 0-1.652-.035-2.287-.11v-8.92c.983-.44 2.365-.884 3.474-.884 1.352 0 1.904.53 1.904 1.833v5.234c0 1.888-.477 2.848-3.09 2.848zM69.77 108.74h-3.564a.603.603 0 00-.603.6v11.294c-1.286.652-3.095 1.328-4.173 1.328-.803 0-1.1-.297-1.1-1.1V109.34c0-.328-.274-.6-.61-.6h-3.562a.6.6 0 00-.604.6v11.977c0 3.503 1.38 5.28 4.094 5.28 1.89 0 4.466-.65 6.64-1.672l.262.89c.078.257.31.434.58.434l2.64-.002c.333 0 .603-.27.603-.603V109.34c0-.33-.27-.6-.603-.6zm14.36 13.817a.612.612 0 00-.255-.41.615.615 0 00-.478-.09c-1.023.234-2.096.36-3.103.36-2.26 0-2.915-.576-2.915-2.566v-4.712c0-1.992.653-2.568 2.914-2.568.538 0 1.877.077 3.103.358a.602.602 0 00.733-.5l.424-2.822a.6.6 0 00-.424-.666c-1.375-.405-2.986-.548-3.937-.548-5.39 0-7.588 1.963-7.588 6.78v4.644c0 4.816 2.198 6.78 7.588 6.78 1.308 0 2.817-.21 3.937-.546a.603.603 0 00.424-.667l-.424-2.826zm24.572-14.165c-4.784 0-7.31 2.382-7.31 6.886v4.502c0 4.65 2.37 6.816 7.452 6.816 2.068 0 4.273-.362 6.048-.99a.613.613 0 00.392-.695l-.53-2.55a.607.607 0 00-.754-.458c-1.642.463-3.197.69-4.772.69-2.597 0-3.06-.843-3.06-2.604v-.616h8.854a.6.6 0 00.603-.605v-3.282c0-4.84-2.2-7.093-6.923-7.093zm-2.535 7.045v-.578c0-1.68.82-2.464 2.57-2.464 1.936 0 2.323.944 2.323 2.463v.577h-4.893zm-83.254-6.704h-3.565a.605.605 0 00-.604.603v16.302c0 .334.27.604.604.604h3.565c.34 0 .607-.27.607-.604v-16.302a.602.602 0 00-.607-.603zm0-6.678h-3.565a.607.607 0 00-.604.605v3.07c0 .34.27.606.604.606h3.565a.6.6 0 00.607-.605v-3.07a.604.604 0 00-.607-.605zm-8.979 11.755c1.478-.812 2.12-1.95 2.12-3.703v-2.398c0-3.512-2.108-5.216-6.433-5.216H.82c-.33 0-.6.27-.6.602v22.54c0 .334.27.604.6.604h9.43c4.198 0 6.608-2.04 6.608-5.597v-2.476c0-2.12-1.077-3.705-2.922-4.356zm-8.803-7.17h3.965c1.795 0 2.045.783 2.045 1.62v2.055c0 1.336-.624 1.906-2.08 1.906h-.857a.605.605 0 00-.608.606v2.832c0 .335.27.606.608.606h1.55c1.557 0 2.188.602 2.188 2.08v1.742c0 1.503-.646 2.01-2.57 2.01H5.13V106.64zm31.176 16.137a.6.6 0 00-.258-.415.606.606 0 00-.484-.083c-.63.156-1.234.242-1.7.242-.882 0-1.273-.384-1.273-1.24v-8.64h3.463c.333 0 .603-.27.603-.603v-2.697a.604.604 0 00-.604-.603h-3.463v-4.153a.606.606 0 00-.69-.597l-3.566.496a.606.606 0 00-.52.6v3.654h-1.944a.605.605 0 00-.604.603v2.696c0 .333.27.603.603.603h1.944v9.198c0 3.157 1.657 4.76 4.93 4.76.934 0 2.516-.217 3.55-.576a.6.6 0 00.4-.662l-.39-2.585zm91.077-.001a.6.6 0 00-.74-.497c-.636.155-1.235.242-1.705.242-.88 0-1.278-.385-1.278-1.242v-8.638h3.467a.6.6 0 00.6-.603v-2.697a.6.6 0 00-.6-.603h-3.468v-4.154a.59.59 0 00-.204-.454.606.606 0 00-.482-.143l-3.565.495a.605.605 0 00-.52.597v3.658h-1.942c-.33 0-.603.27-.603.603v2.696c0 .33.273.602.603.602h1.942v9.2c0 3.154 1.66 4.756 4.933 4.756.936 0 2.515-.216 3.55-.574a.606.606 0 00.402-.662l-.39-2.586zm-26.546 2.458l-4.767-7.87 4.6-7.75a.602.602 0 00-.52-.912h-3.937a.603.603 0 00-.523.302l-4.375 7.584v-13.925a.603.603 0 00-.604-.604h-3.564a.604.604 0 00-.604.603v22.975c0 .333.27.604.604.604h3.565c.334 0 .605-.27.605-.604v-7.52l4.655 7.79c.11.182.306.294.518.294h3.869a.605.605 0 00.48-.968z"/><g fill="#205081"><path d="M64 4.43c-22 0-39.624 5.87-39.624 13.156 0 1.92 4.776 29.44 6.665 40.356.848 4.895 13.468 12.072 32.97 12.072l-.01-.058v.058c20 0 32.187-7.177 33.034-12.072 1.89-10.914 6.636-38.436 6.636-40.356C103.67 10.3 86 4.43 64 4.43zm.063 56.742c-6.962 0-12.606-5.645-12.606-12.606 0-6.963 5.644-12.606 12.606-12.606S76.67 41.603 76.67 48.566c0 6.962-5.645 12.606-12.607 12.606zm-.007-39.52c-14.026-.022-25.393-2.458-25.388-5.443.005-2.986 11.38-5.386 25.406-5.364 14.026.022 25.392 2.46 25.388 5.444-.005 2.986-11.38 5.385-25.406 5.363z"/><path d="M92.565 68.88c-.603 0-1.086.428-1.086.428s-9.767 7.733-27.417 7.734c-17.65 0-27.416-7.734-27.416-7.734s-.483-.427-1.086-.427c-.72 0-1.402.485-1.402 1.552 0 .113.01.225.032.335 1.516 8.112 2.623 13.877 2.818 14.753C38.33 91.488 50.004 96 64.062 96h.002c14.058 0 25.732-4.512 27.055-10.48.193-.875 1.3-6.635 2.817-14.748.02-.11.032-.225.032-.338-.002-1.067-.685-1.553-1.405-1.553z"/><circle cx="64.051" cy="48.562" r="6.318"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><linearGradient id="bitbucket-original-a" gradientUnits="userSpaceOnUse" x1="28.593" y1="14.226" x2="16.672" y2="23.532" gradientTransform="scale(4)"><stop offset=".176" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient></defs><path d="M19.082 20c-1.918 0-3.355 1.758-3.039 3.516l12.95 79.289c.32 2.078 2.077 3.515 4.155 3.515h62.66c1.442 0 2.72-1.12 3.04-2.558l13.109-80.086c.316-1.918-1.121-3.516-3.039-3.516zM74.07 77.227H54.09l-5.278-28.293h30.215zm0 0" fill="#2684ff"/><path d="M107.64 48.934H78.868L74.07 77.227H54.09l-23.5 27.972s1.12.961 2.719.961h62.66c1.441 0 2.719-1.12 3.039-2.558zm0 0" fill="url(#bitbucket-original-a)"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g fill="#205081"><path d="M64 1.023v.002-.002c-30 0-54.557 8.074-54.557 18.1 0 2.64 6.55 40.504 9.147 55.52 1.165 6.733 18.56 16.607 45.39 16.607l.02-.08v.08c27 0 44.238-9.874 45.403-16.61 2.598-15.015 9.15-52.878 9.15-55.518C118.554 9.097 94 1.022 64 1.022zm0 78.062c-9.578 0-17.343-7.766-17.343-17.343C46.657 52.164 54.422 44.4 64 44.4s17.343 7.764 17.343 17.343c0 9.577-7.765 17.342-17.343 17.342zm-.01-54.368c-19.296-.03-34.934-3.384-34.928-7.49.007-4.107 15.656-7.41 34.952-7.378 19.296.03 34.934 3.382 34.927 7.49-.005 4.106-15.653 7.407-34.95 7.377z"/><path d="M103.212 89.69c-.83 0-1.494.588-1.494.588S88.283 100.918 64 100.918s-37.718-10.64-37.718-10.64-.665-.587-1.494-.587c-.99 0-1.93.666-1.93 2.135 0 .155.015.31.044.462 2.085 11.16 3.61 19.09 3.876 20.296 1.82 8.21 17.88 14.417 37.22 14.417H64c19.342 0 35.402-6.207 37.222-14.417.268-1.205 1.79-9.13 3.876-20.29.028-.153.044-.31.044-.465 0-1.47-.94-2.137-1.93-2.137z"/><circle cx="63.983" cy="61.737" r="8.691"/></g></svg>

Before

Width:  |  Height:  |  Size: 737 B

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1 +0,0 @@
<svg viewBox="0 0 128 128" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><symbol overflow="visible" id="blender-original-wordmark-a"><path d="M1.297-1.313h.125c.082 0 .144-.019.187-.062a.237.237 0 00.063-.172c0-.082-.024-.14-.063-.172-.043-.031-.109-.047-.203-.047h-.11zM2-1.546c0 .188-.09.32-.266.39l.422.673h-.375l-.328-.579h-.156v.579H.969v-1.532h.453c.195 0 .344.043.437.125.094.075.141.188.141.344zM.172-1.25a1.284 1.284 0 01.64-1.11 1.35 1.35 0 01.657-.171c.238 0 .457.058.656.172.195.117.352.273.469.468.125.2.187.414.187.641 0 .23-.058.445-.172.64a1.43 1.43 0 01-.484.47c-.2.117-.418.171-.656.171-.242 0-.461-.054-.657-.172C.613-.254.458-.41.344-.609a1.222 1.222 0 01-.172-.641zm.219 0c0 .2.046.383.14.547.094.156.223.289.39.39.177.094.36.141.548.141a1.107 1.107 0 00.953-.531c.094-.164.14-.348.14-.547 0-.188-.054-.363-.156-.531a1.042 1.042 0 00-.39-.39 1.045 1.045 0 00-1.079-.017 1.113 1.113 0 00-.406.391c-.094.168-.14.352-.14.547zm0 0"/></symbol></defs><path d="M20.74 65.962c.075-1.296.727-2.441 1.707-3.25.96-.796 2.256-1.285 3.667-1.285 1.41 0 2.706.489 3.667 1.285.98.809 1.631 1.954 1.707 3.25.07 1.332-.475 2.57-1.439 3.489-.98.933-2.374 1.52-3.935 1.52-1.56 0-2.96-.587-3.94-1.52-.96-.918-1.509-2.157-1.434-3.489zm0 0" fill="#235785"/><path d="M12.186 68.591c.012.508.178 1.492.423 2.266a11.935 11.935 0 002.643 4.469c1.264 1.367 2.821 2.465 4.619 3.246a15.173 15.173 0 006.065 1.23 15.178 15.178 0 006.065-1.254 13.744 13.744 0 004.62-3.257c1.228-1.336 2.113-2.848 2.639-4.477.26-.824.426-1.66.493-2.5a11.313 11.313 0 00-1.766-6.988 12.655 12.655 0 00-3.07-3.313h.004l-12.43-9.332c-.012-.008-.02-.02-.032-.023-.818-.614-2.189-.614-3.086 0-.905.62-1.007 1.648-.201 2.297h-.004l5.184 4.125-15.801.015h-.02c-1.308 0-2.564.84-2.81 1.899-.256 1.078.629 1.972 1.988 1.976v.008l8.01-.016L1.426 69.69a.28.28 0 00-.056.039c-1.347 1.008-1.786 2.687-.936 3.75.861 1.078 2.695 1.082 4.058.004l7.8-6.238s-.115.84-.107 1.347zm20.044 2.82c-1.608 1.602-3.856 2.508-6.294 2.516-2.438.004-4.686-.898-6.294-2.496a7.388 7.388 0 01-1.719-2.629 6.683 6.683 0 01-.391-2.937 6.77 6.77 0 01.861-2.766 7.625 7.625 0 011.909-2.223c1.564-1.246 3.552-1.921 5.634-1.921 2.082-.004 4.07.664 5.63 1.906a7.612 7.612 0 011.913 2.215c.478.847.774 1.78.861 2.765a6.62 6.62 0 01-.395 2.934 7.3 7.3 0 01-1.715 2.637zm0 0" fill="#e87500"/><path d="M105.897 65.943c.122-1.313 1.158-2.14 2.738-2.14s2.616.827 2.738 2.14zm5.314 3.23c-.407.973-1.359 1.547-2.659 1.547-1.62 0-2.714-.992-2.758-2.558h9.333V67.7c0-3.918-2.355-6.125-6.575-6.125-4.093 0-6.57 2.226-6.57 5.715 0 3.507 2.516 5.73 6.57 5.73 2.438 0 4.323-.816 5.488-2.25zm0 0M64.492 65.947c.123-1.309 1.158-2.137 2.742-2.137 1.58 0 2.612.828 2.734 2.137zm5.314 3.234c-.403.973-1.359 1.547-2.659 1.547-1.62 0-2.714-.992-2.758-2.559h9.33v-.457c0-3.925-2.352-6.129-6.572-6.129-4.097 0-6.567 2.227-6.567 5.715 0 3.508 2.513 5.727 6.567 5.727 2.434 0 4.323-.813 5.492-2.246zm0 0M56.38 59.208h3.363V72.67H56.38zm0 0M74.556 62.787h3.382v.8c1.201-1.25 2.64-1.882 4.26-1.882 1.868 0 3.283.632 4.014 1.707.612.89.652 1.96.652 3.37v5.887h-3.39v-5.171c0-2.149-.443-3.137-2.367-3.137-1.948 0-3.169 1.133-3.169 3.039v5.27h-3.382zm0 0M97.765 67.458c0 1.844-1.26 3.051-3.208 3.051-1.948 0-3.209-1.168-3.209-3.031 0-1.89 1.241-3.055 3.209-3.055 1.948 0 3.208 1.188 3.208 3.035zm0-4.226c-.857-.895-2.094-1.387-3.817-1.387-3.71 0-6.246 2.238-6.246 5.594 0 3.289 2.516 5.59 6.187 5.59 1.683 0 2.916-.418 3.876-1.352v.992h3.386V58.353l-3.386.855zm0 0M48.687 64.423c1.968 0 3.205 1.168 3.205 3.059 0 1.863-1.257 3.027-3.205 3.027-1.948 0-3.204-1.207-3.204-3.05 0-1.848 1.256-3.036 3.204-3.036zm-3.204-5.215l-3.386-.851v14.316h3.386v-.992c.952.934 2.189 1.348 3.876 1.348 3.67 0 6.184-2.301 6.184-5.59 0-3.356-2.537-5.594-6.247-5.594-1.723 0-2.96.492-3.813 1.39zm0 0M115.96 72.673v-9.886h3.387v.613c1.015-1.195 2.086-1.79 3.307-1.79.245 0 .55.04.952.079v2.816c-.324-.039-.687-.039-1.074-.039-1.968 0-3.185 1.27-3.185 3.426v4.781zm0 0" fill="#235785"/><use xlink:href="#blender-original-wordmark-a" x="124.496" y="15.002" width="100%" height="100%" fill="#216191" transform="matrix(1.01151 0 0 1 -.743 47.138)"/></svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -1 +0,0 @@
<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><path d="M66.332 70.032c.24-4.242 2.327-7.987 5.485-10.634 3.094-2.602 7.248-4.193 11.809-4.193 4.537 0 8.69 1.59 11.78 4.193 3.163 2.647 5.237 6.392 5.485 10.634.24 4.35-1.523 8.41-4.605 11.417-3.158 3.05-7.627 4.977-12.66 4.977-5.037 0-9.526-1.915-12.664-4.977-3.094-3.006-4.853-7.044-4.606-11.397zm0 0" fill="#235785"/><path d="M39.245 79.002c.028 1.66.564 4.89 1.36 7.404 1.682 5.336 4.537 10.273 8.49 14.599 4.062 4.465 9.074 8.055 14.85 10.61 6.073 2.67 12.665 4.037 19.505 4.037 6.84-.009 13.432-1.4 19.504-4.102 5.776-2.582 10.79-6.168 14.85-10.657 3.974-4.374 6.82-9.307 8.491-14.647a37 37 0 001.595-8.163c.208-2.69.12-5.405-.263-8.12a37.535 37.535 0 00-5.417-14.714c-2.574-4.15-5.916-7.76-9.89-10.813l.012-.004-39.955-30.506c-.036-.028-.068-.056-.104-.08-2.619-2.002-7.044-1.994-9.91.008-2.914 2.031-3.25 5.385-.656 7.496l-.012.008 16.682 13.484-50.789.051h-.068c-4.197.004-8.239 2.739-9.03 6.213-.82 3.521 2.035 6.46 6.412 6.46l-.008.016 25.736-.048L4.58 82.524c-.056.044-.12.088-.176.132C.069 85.95-1.33 91.446 1.4 94.9c2.778 3.522 8.666 3.546 13.047.02L39.505 74.51s-.368 2.758-.336 4.397zm64.56 9.219c-5.168 5.228-12.416 8.21-20.227 8.21-7.831.012-15.079-2.918-20.248-8.142-2.526-2.559-4.377-5.473-5.528-8.591a22.202 22.202 0 01-1.271-9.602 22.446 22.446 0 012.778-9.039c1.507-2.714 3.59-5.18 6.14-7.267 5.033-4.058 11.42-6.28 18.1-6.28 6.709-.008 13.097 2.174 18.13 6.236 2.55 2.075 4.625 4.529 6.14 7.243a22.302 22.302 0 012.774 9.043 22.313 22.313 0 01-1.271 9.598c-1.147 3.142-3.002 6.056-5.533 8.615zm0 0" fill="#e87500"/></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1 +0,0 @@
<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="bootstrap-original-wordmark-a" x1="76.079" x2="523.48" y1="10.798" y2="365.95" gradientTransform="translate(1.11 2.051) scale(.24566)" gradientUnits="userSpaceOnUse"><stop stop-color="#9013fe" offset="0"/><stop stop-color="#6610f2" offset="1"/></linearGradient><linearGradient id="bootstrap-original-wordmark-b" x1="193.51" x2="293.51" y1="109.74" y2="278.87" gradientTransform="translate(0 52)" gradientUnits="userSpaceOnUse"><stop stop-color="#fff" offset="0"/><stop stop-color="#f1e5fc" offset="1"/></linearGradient><filter id="bootstrap-original-wordmark-c" x="161.9" y="135.46" width="197" height="249" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="4"/><feGaussianBlur stdDeviation="8"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter></defs><path d="M14.985 15.15c-.237-6.815 5.072-13.099 12.249-13.099h73.54c7.177 0 12.486 6.284 12.249 13.099-.228 6.546.068 15.026 2.202 21.94 2.141 6.936 5.751 11.319 11.664 11.883v6.387c-5.913.563-9.523 4.947-11.664 11.883-2.134 6.914-2.43 15.394-2.202 21.94.237 6.815-5.072 13.098-12.249 13.098h-73.54c-7.177 0-12.486-6.284-12.249-13.098.228-6.546-.068-15.026-2.203-21.94-2.14-6.935-5.76-11.319-11.673-11.883v-6.387c5.913-.563 9.533-4.947 11.673-11.883 2.135-6.914 2.43-15.394 2.203-21.94z" fill="url(#bootstrap-original-wordmark-a)"/><path transform="translate(1.494 -10.359) scale(.24566)" d="M267.1 364.46c47.297 0 75.798-23.158 75.798-61.355 0-28.873-20.336-49.776-50.532-53.085v-1.203c22.185-3.609 39.594-24.211 39.594-47.219 0-32.783-25.882-54.138-65.322-54.138h-88.74v217zm-54.692-189.48h45.911c24.958 0 39.131 11.128 39.131 31.279 0 21.505-16.484 33.535-46.372 33.535h-38.67zm0 161.96v-71.431h45.602c32.661 0 49.608 12.03 49.608 35.49 0 23.459-16.484 35.941-47.605 35.941z" fill="url(#bootstrap-original-wordmark-b)" filter="url(#bootstrap-original-wordmark-c)" stroke="#fff"/><text x="9.073" y="121.431" fill="#7952b3" font-family="'Segoe UI'" font-size="25.333" style="font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;line-height:1.25"><tspan x="9.073" y="121.431" style="font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal">Bootstrap</tspan></text></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1 +1 @@
<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><path d="M27.235 2.051c-7.177 0-12.486 6.284-12.249 13.099.228 6.546-.068 15.026-2.203 21.94-2.14 6.936-5.76 11.319-11.673 11.883v6.387c5.913.563 9.533 4.947 11.673 11.883 2.135 6.914 2.43 15.394 2.203 21.94-.238 6.815 5.072 13.098 12.249 13.098h73.54c7.177 0 12.486-6.284 12.249-13.098-.228-6.546.068-15.026 2.202-21.94 2.14-6.935 5.751-11.319 11.664-11.883v-6.387c-5.913-.563-9.523-4.947-11.664-11.883-2.134-6.914-2.43-15.394-2.202-21.94.237-6.815-5.072-13.099-12.25-13.099zm58.114 61.686c0 9.384-7.002 15.073-18.621 15.073H45.306a.491.491 0 01-.491-.491V25.993a.491.491 0 01.491-.492h21.309c9.689 0 16.047 5.246 16.047 13.3 0 5.653-4.277 10.713-9.727 11.6v.296c7.418.813 12.414 5.948 12.414 13.04zM64.571 32.262H53.293v15.922h9.5c7.342 0 11.391-2.955 11.391-8.238 0-4.95-3.481-7.684-9.613-7.684zm-11.278 22.24V72.05h11.695c7.645 0 11.695-3.066 11.695-8.83 0-5.763-4.163-8.718-12.187-8.718z" fill="#7952b3"/><g fill="#7952b3" aria-label="Bootstrap"><path d="M11.398 121.43v-17.738h5.047q2.3 0 3.649 1.126 1.348 1.125 1.348 2.931 0 1.51-.816 2.623-.817 1.113-2.252 1.583v.05q1.794.21 2.87 1.36 1.076 1.138 1.076 2.969 0 2.276-1.632 3.686-1.633 1.41-4.12 1.41zm2.078-15.858v5.727h2.128q1.707 0 2.684-.816.977-.83.977-2.326 0-2.585-3.402-2.585zm0 7.595v6.383h2.82q1.831 0 2.833-.866 1.014-.866 1.014-2.375 0-3.142-4.28-3.142zM30.942 121.73q-2.808 0-4.49-1.769-1.67-1.781-1.67-4.713 0-3.191 1.744-4.985 1.744-1.793 4.713-1.793 2.832 0 4.416 1.744 1.595 1.744 1.595 4.836 0 3.031-1.719 4.862-1.707 1.818-4.589 1.818zm.148-11.553q-1.954 0-3.092 1.336-1.138 1.323-1.138 3.661 0 2.252 1.15 3.55 1.15 1.3 3.08 1.3 1.967 0 3.019-1.275 1.063-1.274 1.063-3.624 0-2.375-1.063-3.662-1.052-1.286-3.019-1.286zM45.786 121.73q-2.808 0-4.49-1.769-1.67-1.781-1.67-4.713 0-3.191 1.744-4.985 1.744-1.793 4.713-1.793 2.832 0 4.416 1.744 1.596 1.744 1.596 4.836 0 3.031-1.72 4.862-1.707 1.818-4.589 1.818zm.148-11.553q-1.954 0-3.092 1.336-1.138 1.323-1.138 3.661 0 2.252 1.15 3.55 1.15 1.3 3.08 1.3 1.967 0 3.019-1.275 1.063-1.274 1.063-3.624 0-2.375-1.063-3.662-1.052-1.286-3.019-1.286zM61.211 121.31q-.717.396-1.893.396-3.327 0-3.327-3.711v-7.496h-2.177v-1.732h2.177v-3.092l2.029-.656v3.748h3.191v1.732H58.02v7.137q0 1.274.433 1.819.432.544 1.434.544.767 0 1.324-.42zM63.153 120.97v-2.177q1.657 1.224 3.649 1.224 2.672 0 2.672-1.78 0-.508-.235-.854-.223-.359-.619-.631-.383-.272-.915-.482-.52-.223-1.126-.458-.84-.334-1.484-.668-.63-.346-1.064-.767-.42-.433-.643-.977-.21-.544-.21-1.274 0-.89.408-1.571.408-.693 1.088-1.15.68-.47 1.547-.706.878-.235 1.806-.235 1.645 0 2.944.57v2.053q-1.398-.916-3.217-.916-.569 0-1.026.136-.458.124-.792.36-.322.234-.507.568-.173.322-.173.718 0 .494.173.828.185.334.532.594.346.26.841.47.495.21 1.126.458.84.321 1.509.668.668.334 1.138.767.47.42.717.977.26.556.26 1.323 0 .94-.42 1.633-.409.693-1.102 1.15-.692.458-1.595.681-.903.223-1.893.223-1.954 0-3.39-.755zM80.544 121.31q-.717.396-1.893.396-3.327 0-3.327-3.711v-7.496h-2.177v-1.732h2.177v-3.092l2.029-.656v3.748h3.191v1.732h-3.191v7.137q0 1.274.433 1.819.432.544 1.434.544.767 0 1.324-.42zM89.859 110.82q-.532-.408-1.534-.408-1.299 0-2.177 1.224-.866 1.225-.866 3.34v6.457h-2.028v-12.666h2.028v2.61h.05q.433-1.336 1.323-2.078.89-.755 1.992-.755.791 0 1.212.174zM101.13 121.43h-2.029v-1.98h-.05q-1.323 2.277-3.895 2.277-1.893 0-2.97-1.002-1.063-1.002-1.063-2.66 0-3.55 4.18-4.13l3.798-.533q0-3.228-2.61-3.228-2.288 0-4.131 1.558v-2.078q1.868-1.187 4.305-1.187 4.465 0 4.465 4.725zm-2.029-6.407l-3.055.42q-1.41.198-2.128.705-.717.495-.717 1.769 0 .928.656 1.522.668.58 1.769.58 1.509 0 2.486-1.05.99-1.064.99-2.685zM107.03 119.6h-.05v7.657h-2.028v-18.493h2.029v2.226h.049q1.497-2.523 4.379-2.523 2.449 0 3.822 1.707 1.373 1.694 1.373 4.552 0 3.179-1.546 5.096-1.546 1.905-4.23 1.905-2.462 0-3.798-2.128zm-.05-5.109v1.77q0 1.57 1.015 2.671 1.027 1.089 2.597 1.089 1.844 0 2.883-1.41 1.05-1.41 1.05-3.922 0-2.115-.976-3.315-.977-1.2-2.647-1.2-1.77 0-2.845 1.237-1.077 1.225-1.077 3.08z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#5B4282" d="M9.531 112.586h4.161c1.896 0 3.273.27 4.129.81.857.54 1.285 1.398 1.285 2.575 0 .799-.188 1.454-.563 1.966s-.874.82-1.496.924v.091c.848.189 1.459.543 1.834 1.061s.563 1.207.563 2.067c0 1.22-.44 2.171-1.322 2.854-.881.683-2.078 1.024-3.59 1.024H9.531v-13.372zm2.835 5.296h1.646c.768 0 1.325-.119 1.669-.356.345-.238.517-.631.517-1.18 0-.512-.187-.879-.562-1.102s-.968-.334-1.779-.334h-1.491v2.972zm0 2.25v3.485h1.848c.78 0 1.356-.149 1.729-.448s.558-.756.558-1.372c0-1.109-.793-1.665-2.378-1.665h-1.757zm21.886-.878c0 2.213-.549 3.915-1.646 5.104s-2.67 1.784-4.719 1.784-3.622-.595-4.719-1.784c-1.098-1.189-1.646-2.896-1.646-5.122s.55-3.925 1.651-5.099 2.678-1.761 4.733-1.761 3.626.592 4.715 1.774c1.087 1.183 1.631 2.885 1.631 5.104zm-9.758 0c0 1.494.283 2.619.851 3.375.567.756 1.414 1.134 2.542 1.134 2.262 0 3.393-1.503 3.393-4.509 0-3.012-1.125-4.518-3.375-4.518-1.128 0-1.979.379-2.552 1.139s-.859 1.885-.859 3.379zm24.667 0c0 2.213-.549 3.915-1.646 5.104s-2.67 1.784-4.719 1.784-3.622-.595-4.719-1.784c-1.098-1.189-1.646-2.896-1.646-5.122s.55-3.925 1.651-5.099 2.678-1.761 4.733-1.761 3.626.592 4.715 1.774c1.086 1.183 1.631 2.885 1.631 5.104zm-9.759 0c0 1.494.283 2.619.851 3.375.567.756 1.414 1.134 2.542 1.134 2.262 0 3.393-1.503 3.393-4.509 0-3.012-1.125-4.518-3.375-4.518-1.128 0-1.979.379-2.552 1.139s-.859 1.885-.859 3.379zm17.688 6.704h-2.835v-11.012h-3.631v-2.36h10.097v2.36H57.09v11.012zm13.581-3.713c0 1.208-.434 2.159-1.303 2.854-.869.695-2.078 1.043-3.626 1.043-1.427 0-2.689-.269-3.786-.805v-2.634c.902.402 1.666.686 2.291.851s1.196.247 1.715.247c.622 0 1.099-.119 1.431-.356.333-.238.499-.591.499-1.061 0-.262-.073-.495-.219-.7-.146-.204-.361-.401-.645-.59s-.861-.491-1.733-.905c-.817-.384-1.43-.753-1.838-1.107a4.158 4.158 0 01-.979-1.234c-.244-.47-.366-1.019-.366-1.646 0-1.183.401-2.113 1.203-2.79s1.91-1.015 3.325-1.015c.695 0 1.358.082 1.989.247.631.165 1.291.396 1.98.695l-.915 2.204c-.713-.292-1.303-.497-1.77-.613a5.69 5.69 0 00-1.376-.174c-.537 0-.948.125-1.235.375-.287.25-.43.576-.43.979 0 .25.058.468.174.654.116.186.3.366.553.54.253.174.852.486 1.797.938 1.25.598 2.107 1.197 2.57 1.797s.694 1.334.694 2.206zm7.583 3.713h-2.835v-11.012h-3.631v-2.36h10.097v2.36h-3.631v11.012zm8.524-5.131v5.131h-2.835v-13.372h3.896c1.817 0 3.161.331 4.033.992.872.662 1.308 1.667 1.308 3.014 0 .787-.216 1.486-.649 2.099s-1.046 1.093-1.838 1.44c2.012 3.006 3.323 4.948 3.933 5.826H91.48l-3.192-5.131h-1.51zm0-2.305h.915c.896 0 1.558-.149 1.985-.448s.64-.769.64-1.409c0-.634-.218-1.085-.654-1.354-.436-.268-1.111-.402-2.026-.402h-.86v3.613zm17.716 7.436l-.97-3.183h-4.875l-.97 3.183h-3.055l4.719-13.426h3.466l4.738 13.426h-3.053zm-1.647-5.561a1027.84 1027.84 0 01-1.514-4.893 13.862 13.862 0 01-.242-.896c-.201.78-.777 2.71-1.729 5.789h3.485zm15.622-3.64c0 1.439-.45 2.54-1.349 3.301-.899.763-2.178 1.144-3.837 1.144h-1.216v4.756h-2.835v-13.372h4.271c1.622 0 2.855.349 3.7 1.047.844.699 1.266 1.74 1.266 3.124zm-6.402 2.122H113c.872 0 1.524-.172 1.957-.517.433-.345.649-.846.649-1.504 0-.665-.182-1.156-.544-1.473-.363-.317-.932-.476-1.706-.476h-1.29v3.97zm-38.116-62.12c-1.983-.653-4.838-.759-8.565-.759H52v20h14.424c2.502 0 4.259-.249 5.271-.437 1.783-.318 3.274-.93 4.472-1.676 1.198-.744 2.183-1.869 2.955-3.293.771-1.424 1.158-3.087 1.158-4.951 0-2.184-.559-3.98-1.677-5.59-1.117-1.611-2.668-2.642-4.652-3.294zm-2.056-8.612c1.97-.586 3.455-1.646 4.452-3.003.999-1.357 1.498-3.103 1.498-5.154 0-1.943-.466-3.675-1.398-5.154-.932-1.478-2.263-2.481-3.992-3.027-1.732-.544-4.7-.809-8.906-.809H52v18h12.507c3.435 0 5.897-.399 7.388-.853zM117 16.126C117 8.324 110.675 2 102.873 2H25.127C17.325 2 11 8.324 11 16.126v77.748C11 101.676 17.325 108 25.127 108h77.746c7.802 0 14.127-6.324 14.127-14.126V16.126zM86.57 73.27c-1.157 2.356-2.589 4.173-4.292 5.451-1.704 1.277-3.841 2.446-6.41 3.098A38.022 38.022 0 0166.424 83H44V24h22.065c4.473 0 8.059.62 10.761 1.804 2.703 1.185 4.818 3.021 6.351 5.483 1.53 2.463 2.296 5.046 2.296 7.735 0 2.502-.68 4.861-2.036 7.071-1.358 2.21-3.408 3.995-6.15 5.352 3.54 1.038 6.263 2.811 8.166 5.313 1.903 2.503 2.855 5.458 2.855 8.866-.001 2.742-.579 5.291-1.738 7.646z"/></svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -1 +1 @@
<svg fill="#fff" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><path d="M27.235 13.885c-7.177 0-12.486 6.284-12.249 13.099.228 6.546-.068 15.026-2.203 21.94-2.14 6.936-5.76 11.319-11.673 11.883v6.387c5.913.563 9.533 4.947 11.673 11.883 2.135 6.914 2.43 15.394 2.203 21.94-.238 6.815 5.072 13.098 12.249 13.098h73.54c7.177 0 12.486-6.284 12.249-13.098-.228-6.546.068-15.026 2.202-21.94 2.14-6.935 5.751-11.319 11.664-11.883v-6.387c-5.913-.563-9.523-4.947-11.664-11.883-2.134-6.914-2.43-15.394-2.202-21.94.237-6.815-5.072-13.099-12.25-13.099zm58.114 61.686c0 9.384-7.002 15.073-18.621 15.073H45.306a.491.491 0 01-.491-.491V37.827a.491.491 0 01.491-.492h21.309c9.689 0 16.047 5.246 16.047 13.3 0 5.653-4.277 10.713-9.727 11.6v.296c7.418.813 12.414 5.948 12.414 13.04zM64.571 44.096H53.293v15.922h9.5c7.342 0 11.391-2.955 11.391-8.238 0-4.95-3.481-7.684-9.613-7.684zm-11.278 22.24v17.548h11.695c7.645 0 11.695-3.066 11.695-8.83 0-5.763-4.163-8.718-12.187-8.718z" fill="#7952b3"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#5B4282" d="M75.701 65.603c-2.334-.768-5.694-.603-10.08-.603H48v23h18.844c2.944 0 5.012-.315 6.203-.535 2.099-.376 3.854-1.104 5.264-1.982 1.409-.876 2.568-2.205 3.478-3.881.908-1.676 1.363-3.637 1.363-5.83 0-2.568-.658-4.54-1.975-6.436-1.316-1.896-3.141-2.965-5.476-3.733zm-2.419-10.516c2.317-.688 4.064-1.89 5.239-3.487 1.176-1.598 1.763-3.631 1.763-6.044 0-2.286-.549-4.314-1.646-6.054s-2.662-2.413-4.699-3.056c-2.037-.641-5.53-.446-10.48-.446H48v20h16.587c4.042 0 6.939-.38 8.695-.913zM126 18.625C126 9.443 118.557 2 109.375 2h-91.75C8.443 2 1 9.443 1 18.625v91.75C1 119.557 8.443 127 17.625 127h91.75c9.182 0 16.625-7.443 16.625-16.625v-91.75zm-35.447 66.12c-1.362 2.773-3.047 4.911-5.052 6.415-2.006 1.504-4.521 2.78-7.544 3.548C74.935 95.477 71.229 96 66.844 96H39V27h27.42c5.264 0 9.485.609 12.665 2.002 3.181 1.395 5.671 3.497 7.474 6.395 1.801 2.898 2.702 5.907 2.702 9.071 0 2.945-.8 5.708-2.397 8.308-1.598 2.602-4.011 4.694-7.237 6.292 4.166 1.222 7.37 3.304 9.61 6.248 2.24 2.945 3.36 6.422 3.36 10.432 0 3.227-.681 6.225-2.044 8.997z"/></svg>

Before

Width:  |  Height:  |  Size: 993 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#064F8C" d="M.1 80.1l18.4-15.6-1.6-17.7z"/><path fill="#249847" d="M10.8 72.1L0 81.2h33.4z"/><path fill="#BE2128" d="M17.7 47.4l2.5 27.7 14.3 5.8z"/><path fill="#172C36" d="M43.1 66.5c-.5 1.7-.2 3.6.8 5.1 1.1 1.4 2.7 2.1 4.5 2 .9 0 1.7-.1 2.6-.3.7-.1 1.3-.3 2-.6l-.5 3.3c-.8.2-1.5.4-2.3.5-.9.1-1.7.2-2.6.2-3.4 0-5.9-.9-7.4-2.7s-1.9-4.2-1.2-7.4c.6-3 2.1-5.7 4.5-7.7 2.4-1.9 5.4-3 8.5-2.9.9 0 1.8.1 2.7.3.6.1 1.3.3 1.9.6l-1.1 3.5c-.5-.4-1.2-.6-1.8-.8-.7-.2-1.5-.3-2.2-.3-2 0-3.9.7-5.3 2-1.7 1.4-2.7 3.2-3.1 5.2zm32.3-10.1h6.4l-4.2 19.9h-3.8l3.5-16.5-8.9 16.5h-3.8l-1.9-16.6-3.5 16.6h-3.8l4.2-19.9H66l1.5 15.1 7.9-15.1zM91.1 74c-.7.9-1.6 1.7-2.6 2.2-.8.4-1.7.6-2.6.6-1.3.1-2.5-.3-3.4-1.2-.7-.8-1-1.9-.8-3 .3-1.6 1.2-2.9 2.6-3.8 1.7-1 3.7-1.4 5.7-1.3h2.4l.1-.3c.2-1 .1-1.8-.4-2.2-.7-.5-1.5-.7-2.3-.7-.8 0-1.7.2-2.5.5-.8.2-1.6.6-2.3 1.2l.6-3.3c.8-.3 1.7-.6 2.6-.8.9-.2 1.9-.4 2.8-.4 2.2 0 3.7.5 4.5 1.5.8 1.1 1 2.7.5 4.9l-.9 3.9-.6 3.3c-.1 1-.2 1.4-.2 1.4h-3.4v-.7c-.1-.6 0-1.2.2-1.8zm.7-4.1l.1-.3h-1.7c-1.1 0-2.2.2-3.2.7-.7.3-1.2 1-1.3 1.7-.1.5 0 1 .3 1.4.5.4 1.1.5 1.7.5 1.1 0 2.1-.4 2.9-1.2.5-.9.9-1.8 1.2-2.8zM102.2 55h3.8l-2.7 12.7 5.9-6h4.6l-6.8 6.6 4.5 8.1h-4.9l-3.4-7.2-1.5 7.2h-3.8l4.3-21.4zm23.3 20.6c-.8.4-1.6.7-2.4.8-.9.2-1.8.3-2.8.3-2.6 0-4.4-.7-5.4-2s-1.3-3.2-.8-5.7c.4-2.1 1.4-4.1 3-5.5 1.5-1.4 3.4-2.1 5.4-2.1 2.5 0 4.1.8 4.8 2.3.8 1.5.9 3.7.2 6.6h-10.1c-.1.8.1 1.7.5 2.4.7 1 1.8 1.5 3 1.3 1 0 2-.2 3-.6.7-.2 1.4-.6 2.1-1l-.5 3.2zm-7.6-8h6.6c.3-.9.1-1.8-.4-2.6-.5-.6-1.3-.9-2.1-.9-1.1 0-2.1.4-2.8 1.2-.5.8-.9 1.5-1.3 2.3z"/><path fill="#CDCDCE" d="M11.3 71.6l8.1 3.2-.8-9.4z"/></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#064F8C" d="M62.8.4L.3 123.8l68.1-57.9z"/><path fill="#249847" d="M123.8 127.7l-84-33.9L0 127.7z"/><path fill="#BE2128" d="M128 126.6L65.6 2.5l9.2 102.6z"/><path fill="#CDCDCE" d="M71.9 104l-3.1-34.9L42 92z"/></svg>

Before

Width:  |  Height:  |  Size: 290 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#172C36" d="M.1 80.1l18.4-15.6-1.6-17.7zm10.7-8L0 81.2h33.4zm6.9-24.7l2.5 27.7 14.3 5.8zm25.4 19.1c-.5 1.7-.2 3.6.8 5.1 1.1 1.4 2.7 2.1 4.5 2 .9 0 1.7-.1 2.6-.3.7-.1 1.3-.3 2-.6l-.5 3.3c-.8.2-1.5.4-2.3.5-.9.1-1.7.2-2.6.2-3.4 0-5.9-.9-7.4-2.7s-1.9-4.2-1.2-7.4c.6-3 2.1-5.7 4.5-7.7 2.4-1.9 5.4-3 8.5-2.9.9 0 1.8.1 2.7.3.6.1 1.3.3 1.9.6l-1.1 3.5c-.5-.4-1.2-.6-1.8-.8-.7-.2-1.5-.3-2.2-.3-2 0-3.9.7-5.3 2-1.7 1.4-2.7 3.2-3.1 5.2zm32.3-10.1h6.4l-4.2 19.9h-3.8l3.5-16.5-8.9 16.5h-3.8l-1.9-16.6-3.5 16.6h-3.8l4.2-19.9H66l1.5 15.1 7.9-15.1zM91.1 74c-.7.9-1.6 1.7-2.6 2.2-.8.4-1.7.6-2.6.6-1.3.1-2.5-.3-3.4-1.2-.7-.8-1-1.9-.8-3 .3-1.6 1.2-2.9 2.6-3.8 1.7-1 3.7-1.4 5.7-1.3h2.4l.1-.3c.2-1 .1-1.8-.4-2.2-.7-.5-1.5-.7-2.3-.7-.8 0-1.7.2-2.5.5-.8.2-1.6.6-2.3 1.2l.6-3.3c.8-.3 1.7-.6 2.6-.8.9-.2 1.9-.4 2.8-.4 2.2 0 3.7.5 4.5 1.5.8 1.1 1 2.7.5 4.9l-.9 3.9-.6 3.3c-.1 1-.2 1.4-.2 1.4h-3.4v-.7c-.1-.6 0-1.2.2-1.8zm.7-4.1l.1-.3h-1.7c-1.1 0-2.2.2-3.2.7-.7.3-1.2 1-1.3 1.7-.1.5 0 1 .3 1.4.5.4 1.1.5 1.7.5 1.1 0 2.1-.4 2.9-1.2.5-.9.9-1.8 1.2-2.8zM102.2 55h3.8l-2.7 12.7 5.9-6h4.6l-6.8 6.6 4.5 8.1h-4.9l-3.4-7.2-1.5 7.2h-3.8l4.3-21.4zm23.3 20.6c-.8.4-1.6.7-2.4.8-.9.2-1.8.3-2.8.3-2.6 0-4.4-.7-5.4-2s-1.3-3.2-.8-5.7c.4-2.1 1.4-4.1 3-5.5 1.5-1.4 3.4-2.1 5.4-2.1 2.5 0 4.1.8 4.8 2.3.8 1.5.9 3.7.2 6.6h-10.1c-.1.8.1 1.7.5 2.4.7 1 1.8 1.5 3 1.3 1 0 2-.2 3-.6.7-.2 1.4-.6 2.1-1l-.5 3.2zm-7.6-8h6.6c.3-.9.1-1.8-.4-2.6-.5-.6-1.3-.9-2.1-.9-1.1 0-2.1.4-2.8 1.2-.5.8-.9 1.5-1.3 2.3zM11.3 71.6l8.1 3.2-.8-9.4z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M62.8.4L.3 123.8l68.1-57.9zm61 127.3l-84-33.9L0 127.7zm4.2-1.1L65.6 2.5l9.2 102.6zM71.9 104l-3.1-34.9L42 92z" fill="#172C36"/></svg>

Before

Width:  |  Height:  |  Size: 204 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><linearGradient id="confluence-original-a" gradientUnits="userSpaceOnUse" x1="26.791" y1="28.467" x2="11.792" y2="19.855" gradientTransform="scale(4)"><stop offset="0" stop-color="#0052cc"/><stop offset=".918" stop-color="#2380fb"/><stop offset="1" stop-color="#2684ff"/></linearGradient><linearGradient id="confluence-original-b" gradientUnits="userSpaceOnUse" x1="5.209" y1="2.523" x2="20.208" y2="11.136" gradientTransform="scale(4)"><stop offset="0" stop-color="#0052cc"/><stop offset=".918" stop-color="#2380fb"/><stop offset="1" stop-color="#2684ff"/></linearGradient></defs><path d="M19.492 86.227a249.047 249.047 0 00-3.047 4.933c-.867 1.45-.433 3.336 1.016 4.207l19.863 12.188c1.45.87 3.332.433 4.203-1.016a139.349 139.349 0 012.899-4.934c7.832-12.91 15.804-11.46 30.011-4.64l19.72 9.281c1.593.727 3.335 0 4.058-1.45l9.426-21.323c.722-1.453 0-3.336-1.454-4.063-4.203-1.887-12.464-5.805-19.714-9.43-26.82-12.914-49.586-12.043-66.98 16.247zm0 0" fill="url(#confluence-original-a)"/><path d="M108.508 37.773a249.047 249.047 0 003.047-4.933c.87-1.45.433-3.336-1.016-4.207L90.676 16.445c-1.45-.87-3.332-.433-4.203 1.016a133.55 133.55 0 01-2.899 4.934c-7.832 12.91-15.804 11.46-30.011 4.64l-19.72-9.281c-1.593-.727-3.331 0-4.058 1.45l-9.422 21.323c-.726 1.453 0 3.34 1.45 4.063 4.203 1.887 12.468 5.805 19.714 9.43 26.825 12.77 49.586 12.042 66.98-16.247zm0 0" fill="url(#confluence-original-b)"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g fill="#205081"><path d="M89.976 82.353c-1.57-3.094-3.43-6.223-5.606-9.405a106.98 106.98 0 00-4.974-6.672c-.71-.884-.412-1.984.13-2.53.536-.55 1.075-1.098 1.617-1.653 7.46-7.61 15.175-15.475 21.09-23.974 6.293-9.042 9.78-17.618 10.66-26.44a2.723 2.723 0 00-1.03-2.375 2.663 2.663 0 00-2.56-.368c-5.738 2.194-11.563 3.86-16.88 5.098a3.318 3.318 0 00-2.324 2.026C86.223 26.674 76.33 36.778 65.953 47.363c-.417.395-1 .917-1.95.917-.948 0-1.526-.506-1.95-.918-10.38-10.586-20.27-20.654-24.146-31.268a3.323 3.323 0 00-2.323-2.025c-5.32-1.24-11.15-3.047-16.878-5.24a2.655 2.655 0 00-3.592 2.742c.88 8.824 4.365 17.506 10.66 26.547 5.914 8.498 13.63 16.365 21.09 23.973C60.607 76.106 73.59 89.347 74.73 104.7a2.654 2.654 0 002.647 2.46h16.148a2.658 2.658 0 002.653-2.788 48.635 48.635 0 00-1.242-8.69l.006-.007a1.06 1.06 0 011.02-1.337c.05 0 .1.01.15.017h.002c13.183 1.93 21.52 5.013 21.533 8.41v.007c0 3.2-7.495 8.03-19.677 11.565l-.005.005c-1.083.31-1.873 1.288-1.873 2.45 0 1.408 1.163 2.554 2.6 2.554.2 0 .39-.023.577-.065 16.375-3.787 27.23-10.152 27.23-17.338-.002-8.533-14.676-16.154-36.526-19.59zM46.675 74.03a2.66 2.66 0 00-1.886-.808c-1.206 0-1.92.778-2.19 1.19a82.094 82.094 0 00-4.632 7.95C16.148 85.803 1.5 93.418 1.5 101.943c0 7.194 10.777 13.546 27.182 17.332.002 0 .018 0 .024-.002.193.046.392.075.6.075 1.436 0 2.6-1.145 2.6-2.554 0-1.16-.792-2.126-1.87-2.438l-.007-.017c-12.183-3.536-19.678-8.367-19.678-11.565v-.008c.012-3.39 8.327-6.47 21.477-8.4a.833.833 0 01.14-.016A1.07 1.07 0 0133 95.7l.01.01a48.544 48.544 0 00-1.23 8.653c-.036.723.23 1.44.732 1.97a2.68 2.68 0 001.93.827h16.15a2.676 2.676 0 002.657-2.468c.35-4.725 1.827-9.46 4.505-14.438.928-1.722.207-3.34-.328-4.03-2.658-3.457-5.912-7.142-10.752-12.194z"/><path d="M62.138 34.137c.64.62 1.362.738 1.86.738h.005c.5 0 1.223-.116 1.862-.738C71.56 28.6 74.62 22.144 75.29 20.35a2.64 2.64 0 00.197-.98c0-1.434-1.194-2.457-2.443-2.457-1.03 0-3.967.304-9.026.304h-.033c-5.06 0-7.993-.304-9.024-.304-1.248 0-2.443 1.024-2.443 2.456 0 .417.1.716.198.98.67 1.794 3.73 8.25 9.423 13.787z"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g color="#000" font-weight="400" font-family="sans-serif"><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" d="M64 7.83H4.77l10.18 87.3 49 25h.06l49.07-25 10.15-87.3zm42.77 54.86c0 .88 0 1.67-.77 2L73.25 80.44l-2.42 1.13-.27-3.15v-6.19l.24-1.57 1.09-.47 23.18-10.38-21.54-9.6-9.18 18.13-5.45 10.53-1.22 2.27-2.05-.9L22 64.71a2.42 2.42 0 01-1.45-2v-5.8a2.39 2.39 0 011.42-2l34-15.73 3.21-1.44v9.66l.24 1.34-1.56.7-23.41 10.35 21.85 9.63 8.05-16 6.21-12.65 1.13-2.28 1.81.91L106 54.89c.73.35.76 1.14.76 2z" overflow="visible" fill="none"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" d="M4.209 7.33l10.275 88.123 49.346 25.178h.3l49.415-25.178L123.79 7.33H4.209zm1.123 1h117.336l-10.053 86.477-48.635 24.779-48.564-24.78L5.332 8.33zM59.68 36.967l-3.916 1.758L21.77 54.453a2.893 2.893 0 00-1.72 2.418v5.861l.003.024a2.92 2.92 0 001.744 2.41c.002 0 .002.003.004.004l33.623 15.525 2.478 1.088 1.44-2.68 5.453-10.535 8.967-17.707 20.082 8.95-22.155 9.921-1.341.579-.287 1.88v6.25l.332 3.885 3.072-1.433 32.732-15.743c.518-.222.836-.673.96-1.12.123-.448.113-.9.113-1.34l-.01-5.8c0-.435 0-.886-.125-1.328a1.765 1.765 0 00-.918-1.123h-.002L73.72 38.951l-2.256-1.133-1.354 2.73-6.209 12.65-7.836 15.573L35.69 59.79l22.373-9.893 1.918-.859-.3-1.682V36.967zm-1 1.545v8.933l.18.998-1.204.54L33.211 59.79l23.322 10.277 8.264-16.425 6.21-12.653.907-1.826 1.365.686 32.504 15.492c.235.113.316.238.389.494.072.256.088.63.088 1.055l.01 5.8c0 .44-.01.823-.079 1.073s-.136.358-.388.466l-.01.004-32.758 15.754-1.767.826-.207-2.416v-6.13l.191-1.258.84-.362 24.203-10.84L73.299 49.56l-9.395 18.55-5.447 10.526-.998 1.86-1.623-.714-33.633-15.53-.004-.001a1.919 1.919 0 01-1.148-1.582v-5.727a1.888 1.888 0 011.12-1.576l.005-.002 34.002-15.73 2.502-1.123z" overflow="visible" fill="#60be86"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g color="#000" font-weight="400" font-family="sans-serif"><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" d="M64 7.83H4.77l10.18 87.3 49 25h.06l49.07-25 10.15-87.3zm42.77 54.86c0 .88 0 1.67-.77 2L73.25 80.44l-2.42 1.13-.27-3.15v-6.19l.24-1.57 1.09-.47 23.18-10.38-21.54-9.6-9.18 18.13-5.45 10.53-1.22 2.27-2.05-.9L22 64.71a2.42 2.42 0 01-1.45-2v-5.8a2.39 2.39 0 011.42-2l34-15.73 3.21-1.44v9.66l.24 1.34-1.56.7-23.41 10.35 21.85 9.63 8.05-16 6.21-12.65 1.13-2.28 1.81.91L106 54.89c.73.35.76 1.14.76 2z" overflow="visible" fill="none"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" d="M4.209 7.33l10.275 88.123 49.346 25.178h.3l49.415-25.178L123.79 7.33H4.209zm1.123 1h117.336l-10.053 86.477-48.635 24.779-48.564-24.78L5.332 8.33zM59.68 36.967l-3.916 1.758L21.77 54.453a2.893 2.893 0 00-1.72 2.418v5.861l.003.024a2.92 2.92 0 001.744 2.41c.002 0 .002.003.004.004l33.623 15.525 2.478 1.088 1.44-2.68 5.453-10.535 8.967-17.707 20.082 8.95-22.155 9.921-1.341.579-.287 1.88v6.25l.332 3.885 3.072-1.433 32.732-15.743c.518-.222.836-.673.96-1.12.123-.448.113-.9.113-1.34l-.01-5.8c0-.435 0-.886-.125-1.328-.125-.441-.423-.885-.918-1.123h-.002L73.72 38.951l-2.256-1.133-1.354 2.73-6.209 12.65-7.836 15.573L35.69 59.79l22.373-9.893 1.918-.859-.3-1.682V36.967zm-1 1.545v8.933l.18.998-1.204.54L33.211 59.79l23.322 10.277 8.264-16.425 6.21-12.653.907-1.826 1.365.686 32.504 15.492c.235.113.316.238.389.494.072.256.088.63.088 1.055l.01 5.8c0 .44-.01.823-.079 1.073s-.136.358-.388.466l-.01.004-32.758 15.754-1.767.826-.207-2.416v-6.13l.191-1.258.84-.362 24.203-10.84-22.996-10.247-9.395 18.55-5.447 10.526-.998 1.86-1.623-.714-33.633-15.53-.004-.001a1.919 1.919 0 01-1.148-1.582v-5.727a1.888 1.888 0 011.12-1.576l.005-.002 34.002-15.73 2.502-1.123z" overflow="visible" fill="#60be86"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -1 +0,0 @@
<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><path d="M21.602 38.473c-.055.055-.098 8.73-.098 19.281v19.188l8.864-.043c10.418-.05 11.324-.148 14.383-1.574l.652-.305.082-.902c.379-4.074 3.707-7.328 7.621-7.445.902-.028.852.023 1.48-1.547 1.34-3.368 1.641-9.078.704-13.223-1.68-7.403-6.942-12.121-14.777-13.254-1.18-.168-18.758-.332-18.91-.176m40.094 18.469v18.547l-.309 1.199c-1.508 5.879-8.484 8.113-13.094 4.191-.195-.168-.637-.628-.98-1.03l-.625-.727-.72.324c-1.565.707-5.081 1.707-5.991 1.707-1.207 0 1.347 3.976 3.855 6 3.149 2.543 5.715 3.402 10.121 3.398 8.106-.011 13.402-3.922 15.598-11.512.727-2.515.727-2.562.692-22.398l-.036-18.176-8.511-.07v18.547m31.297-18.453c-9.203.477-15.488 6.207-15.488 14.121 0 6.332 2.965 10.234 10.176 13.402.879.387 2.32 1.02 3.199 1.41 2.027.895 2.434 1.07 3.457 1.508 6.484 2.766 7.937 4.125 7.937 7.441 0 7.926-12.508 8.95-21.109 1.723-.52-.437-.984-.75-1.035-.691l-3.906 4.629c-.21.25-.512.597-.672.765-.433.473-.379.574.88 1.645 8.745 7.441 22.206 8.324 29.874 1.96 5.211-4.324 6.535-12.515 2.93-18.136-1.414-2.207-4.426-4.614-7.09-5.668-.246-.098-.512-.223-.586-.282-.078-.058-.367-.187-.64-.289a41.816 41.816 0 01-1.59-.652c-1.075-.465-1.86-.797-3.297-1.39-.403-.169-1.168-.489-1.696-.716a46.742 46.742 0 00-1.421-.578c-4.282-1.593-6.454-3.668-6.614-6.324-.383-6.285 8.649-8.398 16.355-3.82.246.148.89.601 1.438 1.012.543.41 1.03.742 1.086.738.09-.008 3.285-3.895 4.172-5.078l.359-.477-.617-.55c-1.172-1.051-3.125-2.442-4.23-3.016-.887-.461-1.141-.586-1.723-.844-2.997-1.34-6.75-2.02-10.148-1.844m-54.668 8.239c4.921.683 7.628 4.238 7.843 10.297.215 6.164-2.523 10.418-7.382 11.473-1.254.273-7.106.507-7.868.316l-.324-.082V57.747c0-6.04.035-11.023.082-11.07.14-.137 6.594-.094 7.649.05m13.62 23.274c-5.25 2.117-3.98 9.699 1.622 9.676 5.406-.024 6.964-7.165 2.074-9.508-.918-.442-2.809-.528-3.695-.168" fill="#fff" fill-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M127 44.9c0-4.3-3.5-7.9-7.9-7.9H8.9C4.5 37 1 40.5 1 44.9v39.3C1 88.5 4.5 92 8.9 92h110.3c4.3 0 7.9-3.5 7.9-7.9V44.9zm-2 39.2c0 3.2-2.6 5.9-5.9 5.9H8.9C5.6 90 3 87.4 3 84.1V44.9C3 41.6 5.6 39 8.9 39h110.2c3.2 0 5.9 2.6 5.9 5.9v39.2zM30 46h-6v9.2c-1-.2-1.7-.3-2.6-.3-6.1 0-10.1 3.9-10.1 9.9 0 6.2 3.9 9.4 11 9.4 2.4 0 4.8-.2 7.8-.8V46zm-6 23.3c-1 .1-1.5.2-2.1.2-3 0-4.7-1.7-4.7-4.8 0-3.2 1.8-5 4.8-5 .7 0 1.1.1 2.1.3v9.3zM33 46h6v6h-6zm0 20.9c0 5.1-.2 7-1 8.7-.8 1.6-2 2.7-4.6 3.9l5.5 2.6c2.6-1.3 3.9-2.5 4.8-4.3 1-1.9 1.4-4.2 1.4-8.9V55h-6v11.9zm17.5-12c-2.7 0-4.5.5-7.5 1.8v4.5c2-1.2 4.3-1.8 6.4-1.8 1.5 0 1.6.4 1.6 1.4v1.3c-6 .6-9.9 2.5-9.9 6.6 0 3.8 1.9 5.5 6.8 5.5 2.4 0 6.1-.3 8.1-.6V61.7c0-2.4.4-3.6-.1-4.5-.9-1.5-2.4-2.3-5.4-2.3zm.5 15c-1 .2-1.6.3-2.5.3-1.6 0-2.5-.5-2.5-1.7 0-1.5 2-2.1 5-2.5v3.9zm17.5-15c-2.9 0-5.5.4-9.5 1.3V74h6V60.1c1-.3 2.1-.4 2.9-.4 2.1 0 3.1.8 3.1 3.1V74h6V62.5c0-2.9-.6-4.3-1.8-5.6-1.3-1.3-3.7-2-6.7-2zm29 5.1l2.1-4.2c-2.8-.6-5.1-.8-7.6-.8-8.6 0-13.4 3.8-13.4 10.4 0 5.4 3.3 8.8 8.4 8.8 1.5 0 2.8-.2 3.8-.8v.1c0 3.7-1.8 5.3-5.6 5.3-2.2 0-4.4-.5-6.4-1.6v5.4c2 .8 4.1 1.1 6.4 1.1 4.5 0 7.9-1.4 9.7-4.3 1.3-1.9 1.9-4.3 1.9-9.3v-1.6l-.2-2.4-.2-3.1-.4-2.5v-.6c2 .1 0-.2 1.5.1zM91 68.6v.4c-1 .2-1.4.4-2.2.4-2.6 0-4-1.7-4-4.6 0-2.1.7-3.8 2.1-4.6.9-.6 2.2-1.2 3.4-1.2h.7v9.6zm17.9-13.7c-6 0-9.7 3.8-9.7 10 0 5.9 3.6 9.6 9.5 9.6s9.7-3.8 9.7-10c-.1-6-3.7-9.6-9.5-9.6zm-.1 14.9c-2.3 0-3.6-1.9-3.6-5.1 0-3.2 1.3-5.1 3.7-5.1 2.2 0 3.5 1.9 3.5 5.1-.1 3.2-1.4 5.1-3.6 5.1z" fill="#003A2B"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#003A2B" d="M126.5 83.8c0 3.8-3.1 6.9-6.9 6.9H8.4c-3.8 0-6.9-3.1-6.9-6.9V44.2c0-3.8 3.1-6.9 6.9-6.9h111.2c3.8 0 6.9 3.1 6.9 6.9v39.6z"/><path fill="#fff" d="M23 45.6h6V73c-3 .6-5.3.8-7.7.8-7.2 0-11-3.3-11-9.5 0-6 4-10 10.2-10 1 0 1.7.1 2.6.3v-9H23zm0 13.8c-.7-.2-1.3-.3-2-.3-3 0-4.7 1.8-4.7 5.1 0 3.2 1.7 4.9 4.7 4.9.7 0 1.2 0 2-.2v-9.5zm15.4-4.6v13.7c0 4.7-.3 7-1.4 9-1 1.9-2.2 3.1-4.8 4.4l-5.5-2.6c2.6-1.2 3.9-2.3 4.7-4 .8-1.7 1.1-3.7 1.1-8.8V54.8h5.9zm-5.9-9.1h5.9v6.1h-5.9v-6.1zM42 56.1c2.6-1.2 5.1-1.8 7.8-1.8 3 0 5 .8 5.9 2.4.5.9.7 2 .7 4.5v12c-2.7.4-6 .7-8.5.7-5 0-7.2-1.7-7.2-5.6 0-4.2 3-6.1 10.2-6.7v-1.3c0-1.1-.5-1.5-2-1.5-2.2 0-4.7.6-7 1.8v-4.5h.1zm9.2 9.4c-3.9.4-5.2 1-5.2 2.5 0 1.2.7 1.7 2.3 1.7.9 0 1.7-.1 2.8-.3v-3.9h.1zm8.1-9.8c3.5-.9 6.4-1.3 9.3-1.3 3 0 5.2.7 6.5 2 1.2 1.3 1.6 2.7 1.6 5.6v11.6h-5.9V62.2c0-2.3-.8-3.1-2.9-3.1-.8 0-1.5.1-2.7.4v14.1h-5.9V55.7zM79 76.8c2.1 1.1 4.2 1.6 6.3 1.6 3.9 0 5.5-1.6 5.5-5.3V73c-1.2.6-2.3.8-3.8.8-5.2 0-8.5-3.4-8.5-8.8 0-6.7 4.9-10.5 13.5-10.5 2.5 0 4.9.3 7.7.8l-2 4.3c-1.6-.3-.1 0-1.3-.2v.6l.1 2.5v3.2c0 .8 0 1.6.1 2.4v1.6c0 5.1-.4 7.5-1.7 9.4-1.8 2.9-5 4.3-9.6 4.3-2.3 0-4.3-.3-6.4-1.2v-5.4h.1zm11.8-17.6h-.6c-1.2 0-2.5.3-3.4.8-1.4.8-2.2 2.3-2.2 4.3 0 3 1.5 4.7 4.1 4.7.8 0 1.5-.2 2.2-.4v-9.4h-.1zm18.2-4.9c5.9 0 9.5 3.7 9.5 9.8 0 6.2-3.8 10.1-9.8 10.1-5.9 0-9.6-3.7-9.6-9.7.1-6.3 3.9-10.2 9.9-10.2zm-.1 15c2.3 0 3.6-1.9 3.6-5.2 0-3.2-1.3-5.2-3.6-5.2s-3.7 1.9-3.7 5.2c.1 3.4 1.4 5.2 3.7 5.2z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg version="1.0" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg" fill="#092e20"><path d="M15.091 41.64h7v32.403c-3.59.682-6.227.955-9.09.955C4.455 74.998 0 71.134 0 63.724c0-7.136 4.728-11.772 12.046-11.772 1.136 0 2 .09 3.045.363zm0 16.31c-.818-.272-1.5-.363-2.363-.363-3.546 0-5.591 2.182-5.591 6 0 3.727 1.954 5.773 5.545 5.773.773 0 1.41-.046 2.41-.182z"/><path d="M33.227 52.45v16.228c0 5.59-.409 8.272-1.636 10.59-1.137 2.229-2.637 3.637-5.728 5.183l-6.5-3.091c3.091-1.455 4.59-2.727 5.545-4.682 1-2 1.32-4.318 1.32-10.41V52.45zm-7-10.773h7v7.182h-7zm11.229 12.364c3.09-1.454 6.045-2.09 9.273-2.09 3.59 0 5.954.954 7 2.818.59 1.045.772 2.409.772 5.318v14.227c-3.136.455-7.09.773-10 .773-5.863 0-8.5-2.046-8.5-6.591 0-4.91 3.5-7.182 12.091-7.91v-1.545c0-1.273-.636-1.727-2.409-1.727-2.59 0-5.5.727-8.228 2.137v-5.41zM48.41 65.178c-4.636.454-6.136 1.182-6.136 3 0 1.363.864 2 2.773 2 1.045 0 2-.09 3.363-.318zm9.502-11.637c4.136-1.09 7.545-1.59 11-1.59 3.591 0 6.182.817 7.728 2.409 1.455 1.5 1.909 3.135 1.909 6.636v13.727h-7V61.27c0-2.682-.91-3.682-3.41-3.682-.954 0-1.817.09-3.227.5v16.636h-7zm23.357 25c2.455 1.273 4.909 1.864 7.5 1.864 4.59 0 6.545-1.864 6.545-6.319v-.136c-1.363.682-2.727.955-4.545.955-6.137 0-10.046-4.046-10.046-10.455 0-7.955 5.773-12.455 16-12.455 3 0 5.773.318 9.137 1l-2.397 5.05c-1.864-.364-.15-.05-1.558-.186v.728l.09 2.954.046 3.818c.046.955.046 1.91.091 2.864v1.91c0 6-.5 8.817-2 11.135-2.182 3.41-5.954 5.092-11.318 5.092-2.728 0-5.09-.41-7.546-1.364V78.54zm13.91-20.91h-.728c-1.363-.045-2.954.318-4.046 1-1.681.955-2.545 2.682-2.545 5.137 0 3.5 1.727 5.5 4.818 5.5.955 0 1.728-.182 2.636-.454v-2.41c0-.817-.045-1.727-.045-2.681l-.045-3.227-.046-2.319v-.545zm21.548-5.771c7 0 11.273 4.409 11.273 11.545 0 7.319-4.454 11.91-11.546 11.91-7 0-11.318-4.41-11.318-11.5 0-7.365 4.455-11.956 11.591-11.956zm-.137 17.818c2.682 0 4.274-2.228 4.274-6.091 0-3.818-1.546-6.091-4.227-6.091-2.774 0-4.365 2.228-4.365 6.09 0 3.865 1.591 6.092 4.318 6.092z"/></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

Some files were not shown because too many files have changed in this diff Show More