Additions

This commit is contained in:
Fabio 2020-05-12 18:27:31 +02:00
parent 1e025cdaf6
commit 5e03321eec
16 changed files with 418 additions and 234 deletions

View File

@ -11,17 +11,17 @@
<TheAppWelcome @newConn="showNewConnModal" />
</div>
<TheFooter />
<NewConnectionModal v-if="isNewConnModal" />
<ModalNewConnection v-if="isNewConnModal" />
</div>
</template>
<script>
import { mapActions, mapState } from 'vuex';
import { mapActions, mapGetters } from 'vuex';
import TheSettingBar from '@/components/TheSettingBar';
import TheExploreBar from '@/components/TheExploreBar';
import TheFooter from '@/components/TheFooter';
import TheAppWelcome from '@/components/TheAppWelcome';
import NewConnectionModal from '@/components/NewConnectionModal';
import ModalNewConnection from '@/components/ModalNewConnection';
export default {
name: 'App',
@ -30,16 +30,16 @@ export default {
TheExploreBar,
TheFooter,
TheAppWelcome,
NewConnectionModal
ModalNewConnection
},
data () {
return {
};
},
computed: {
...mapState({
isLoading: state => state.application.isLoading,
isNewConnModal: state => state.connections.isNewConnModal
...mapGetters({
isLoading: 'application/isLoading',
isNewConnModal: 'connections/isNewModal'
})
},
methods: {

View File

@ -0,0 +1,77 @@
<template>
<div class="modal active modal-sm">
<a class="modal-overlay" />
<div class="modal-container">
<div class="modal-header text-light">
<div class="modal-title h6">
Credentials
</div>
<a class="btn btn-clear c-hand" @click="closeModal" />
</div>
<div class="modal-body">
<div class="content">
<form class="form-horizontal">
<div class="form-group">
<div class="col-3">
<label class="form-label">User:</label>
</div>
<div class="col-9">
<input
v-model="credentials.user"
class="form-input"
type="text"
>
</div>
</div>
<div class="form-group">
<div class="col-3">
<label class="form-label">Password:</label>
</div>
<div class="col-9">
<input
v-model="credentials.password"
class="form-input"
type="password"
>
</div>
</div>
</form>
</div>
</div>
<div class="modal-footer text-light">
<button class="btn btn-primary mr-2" @click="sendCredentials">
Send
</button>
<button class="btn btn-link" @click="closeModal">
Close
</button>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ModalAskCredentials',
data () {
return {
credentials: {
user: '',
password: ''
}
};
},
methods: {
closeModal () {
this.$emit('closeAsking');
},
sendCredentials () {
this.$emit('credentials', this.credentials);
}
}
};
</script>
<style>
</style>

View File

@ -0,0 +1,224 @@
<template>
<div class="modal active">
<a class="modal-overlay c-hand" @click="closeModal" />
<div class="modal-container">
<div class="modal-header text-light">
<div class="modal-title h6">
Create a new connection
</div>
<a class="btn btn-clear c-hand" @click="closeModal" />
</div>
<div class="modal-body">
<div class="content">
<form class="form-horizontal">
<fieldset class="m-0" :disabled="isTesting">
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Client:</label>
</div>
<div class="col-9 col-sm-12">
<select v-model="connection.client" class="form-select">
<option value="mysql">
MySQL/MariaDB
</option>
<option value="mssql">
Microsoft SQL
</option>
<option value="pg">
PostgreSQL
</option>
<option value="oracledb">
Oracle DB
</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Host name/IP:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.host"
class="form-input"
type="text"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Port:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.port"
class="form-input"
type="number"
min="1"
max="65535"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">User:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.user"
class="form-input"
type="text"
:disabled="connection.ask"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Password:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.password"
class="form-input"
type="password"
:disabled="connection.ask"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12" />
<div class="col-9 col-sm-12">
<label class="form-checkbox form-inline">
<input v-model="connection.ask" type="checkbox"><i class="form-icon" /> Ask for credentials
</label>
</div>
</div>
</fieldset>
</form>
</div>
</div>
<div class="modal-footer text-light">
<BaseToast
class="mb-2"
:message="toast.message"
:status="toast.status"
/>
<button
class="btn btn-gray mr-2"
:class="{'loading': isTesting}"
@click="startTest"
>
Test connection
</button>
<button class="btn btn-primary mr-2" @click="saveNewConnection">
Save
</button>
<button class="btn btn-link" @click="closeModal">
Close
</button>
</div>
</div>
<ModalAskCredentials
v-if="isAsking"
@closeAsking="closeAsking"
@credentials="continueTest"
/>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import { ipcRenderer } from 'electron';
import ModalAskCredentials from '@/components/ModalAskCredentials';
import BaseToast from '@/components/BaseToast';
export default {
name: 'ModalNewConnection',
components: {
ModalAskCredentials,
BaseToast
},
props: {
isOpened: {
type: Boolean,
default: false
}
},
data () {
return {
connection: {
client: 'mysql',
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '',
ask: false
},
toast: {
status: '',
message: ''
},
isTesting: false,
isAsking: false
};
},
methods: {
...mapActions({
closeModal: 'connections/hideNewConnModal',
addConnection: 'connections/addConnection'
}),
async startTest () {
this.isTesting = true;
this.toast = {
status: '',
message: ''
};
if (this.connection.ask)
this.isAsking = true;
else
await this.invokeTest(this.connection);
},
async continueTest (credentials) { // if "Ask for credentials" is true
this.isAsking = false;
const params = Object.assign({}, this.connection, credentials);
await this.invokeTest(params);
},
invokeTest (params) {
return new Promise((resolve, reject) => {
ipcRenderer.invoke('testConnection', params).then(res => {
if (res.status === 'error') {
this.toast = {
status: 'error',
message: res.response.message
};
}
else {
this.toast = {
status: 'success',
message: 'Connection successifully made!'
};
}
this.isTesting = false;
resolve();
});
});
},
saveNewConnection () {
this.addConnection(this.connection);
this.closeModal();
},
closeAsking () {
this.isAsking = false;
this.isTesting = false;
}
}
};
</script>
<style scoped>
.modal-container{
max-width: 450px;
}
</style>

View File

@ -1,190 +0,0 @@
<template>
<div class="modal active">
<a class="modal-overlay c-hand" @click="closeModal" />
<div class="modal-container">
<div class="modal-header text-light">
<div class="modal-title h6">
Create a new connection
</div>
<a class="btn btn-clear c-hand" @click="closeModal" />
</div>
<div class="modal-body">
<div class="content">
<form class="form-horizontal">
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Client:</label>
</div>
<div class="col-9 col-sm-12">
<select v-model="connection.client" class="form-select">
<option value="mysql">
MySQL/MariaDB
</option>
<option value="mssql">
Microsoft SQL
</option>
<option value="pg">
PostgreSQL
</option>
<option value="oracledb">
Oracle DB
</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Host name/IP:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.host"
class="form-input"
type="text"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Port:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.port"
class="form-input"
type="number"
min="1"
max="65535"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">User:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.user"
class="form-input"
type="text"
:disabled="connection.ask"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12">
<label class="form-label">Password:</label>
</div>
<div class="col-9 col-sm-12">
<input
v-model="connection.password"
class="form-input"
type="password"
:disabled="connection.ask"
>
</div>
</div>
<div class="form-group">
<div class="col-3 col-sm-12" />
<div class="col-9 col-sm-12">
<label class="form-checkbox form-inline">
<input v-model="connection.ask" type="checkbox"><i class="form-icon" /> Ask for credentials
</label>
</div>
</div>
</form>
</div>
</div>
<div class="modal-footer text-light">
<BaseToast
class="mb-2"
:message="toast.message"
:status="toast.status"
/>
<button
class="btn btn-gray mr-2"
:class="{'loading': isTesting}"
@click="testConnection"
>
Test connection
</button>
<button class="btn btn-primary mr-2">
Save
</button>
<button class="btn btn-link" @click="closeModal">
Close
</button>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import { ipcRenderer } from 'electron';
import BaseToast from '@/components/BaseToast';
export default {
name: 'NewConnectionModal',
components: {
BaseToast
},
props: {
isOpened: {
type: Boolean,
default: false
}
},
data () {
return {
connection: {
client: 'mysql',
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '',
ask: false
},
toast: {
status: '',
message: ''
},
isTesting: false
};
},
methods: {
...mapActions({
closeModal: 'connections/hideNewConnModal'
}),
testConnection () {
this.isTesting = true;
this.toast = {
status: '',
message: ''
};
ipcRenderer.invoke('testConnection', this.connection).then(res => {
this.isTesting = false;
if (res.status === 'error') {
this.toast = {
status: 'error',
message: res.response.message
};
}
else {
this.toast = {
status: 'success',
message: 'Connection successifully made!'
};
}
});
}
}
};
</script>
<style scoped>
.modal-container{
max-width: 450px;
}
</style>

View File

@ -2,6 +2,14 @@
<div id="settingbar" class="container">
<div class="settingbar-top-elements">
<ul class="settingbar-elements">
<li
v-for="(connection, key) in connections"
:key="key"
class="settingbar-element btn btn-link tooltip tooltip-right p-0"
:data-tooltip="`${connection.user}@${connection.host}:${connection.port}`"
>
<i class="dbi" :class="`dbi-${connection.client}`" />
</li>
<li
class="settingbar-element btn btn-link tooltip tooltip-right"
data-tooltip="Add connection"
@ -23,10 +31,15 @@
</template>
<script>
import { mapActions } from 'vuex';
import { mapActions, mapGetters } from 'vuex';
export default {
name: 'TheSettingBar',
computed: {
...mapGetters({
connections: 'connections/getConnections'
})
},
methods: {
...mapActions({
showNewConnModal: 'connections/showNewConnModal'
@ -50,8 +63,18 @@ export default {
.settingbar-elements{
list-style: none;
text-align: center;
padding: 0;
margin: 0;
.settingbar-element{
height: initial;
.settingbar-element-icon{
width: 42px;
}
}
}
}
</style>

View File

@ -26,24 +26,50 @@ body{
align-items: center;
}
/*Override*/
.modal-overlay,
.modal.active .modal-overlay{
background: rgba(255, 255, 255, 0.15);
.dbi{
display: inline-block;
width: 42px;
height: 42px;
background-size: cover;
&.dbi-mysql{
background-image: url('/svg/mysql.svg');
}
&.dbi-mssql{
background-image: url('/svg/mssql.svg');
}
&.dbi-pg{
background-image: url('/svg/pg.svg');
}
&.dbi-oracledb{
background-image: url('/svg/oracledb3.svg');
}
}
.modal-container{
box-shadow: 0 0 1px 0px #000;
padding: 0;
background: $bg-color;
.modal-header{
padding: .4rem .8rem;
text-transform: uppercase;
background: $bg-color-gray;
display: flex;
justify-content: space-between;
align-items: center;
/*Override*/
.modal{
.modal-overlay,
&.active .modal-overlay{
background: rgba(255, 255, 255, 0.15);
}
.modal-sm .modal-container,
.modal-container{
box-shadow: 0 0 1px 0px #000;
padding: 0;
background: $bg-color;
.modal-header{
padding: .4rem .8rem;
text-transform: uppercase;
background: $bg-color-gray;
display: flex;
justify-content: space-between;
align-items: center;
}
}
}

View File

@ -2,10 +2,19 @@
import Vue from 'vue';
import Vuex from 'vuex';
import VuexPersist from 'vuex-persist';
import application from './modules/application.store';
import connections from './modules/connections.store';
const vuexLocalStorage = new VuexPersist({
key: 'vuex', // The key to store the state on in the storage provider.
storage: window.localStorage,
reducer: state => ({
connections: state.connections.connections
})
});
Vue.use(Vuex);
export default new Vuex.Store({
@ -13,5 +22,6 @@ export default new Vuex.Store({
modules: {
application,
connections
}
},
plugins: [vuexLocalStorage.plugin]
});

View File

@ -1,20 +1,24 @@
'use strict';
export default {
namespaced: false,
namespaced: true,
strict: true,
state: {
appName: 'Antares - SQL Client',
isLoading: false
app_name: 'Antares - SQL Client',
is_loading: false
},
getters: {
isLoading: state => state.is_loading,
appName: state => state.app_name
},
mutations: {
setLoadingStatus (state, payload) {
state.isLoading = payload;
SET_LOADING_STATUS (state, payload) {
state.is_loading = payload;
}
},
actions: {
setLoadingStatus ({ commit }, payload) {
commit('setLoadingStatus', payload);
commit('SET_LOADING_STATUS', payload);
}
}
};

View File

@ -5,23 +5,33 @@ export default {
strict: true,
state: {
connections: [],
isNewConnModal: false
is_new_modal: false
},
getters: {
getConnections: state => state.connections,
isNewModal: state => state.is_new_modal
},
mutations: {
showNewConnModal (state) {
state.isNewConnModal = true;
ADD_CONNECTION (state, connection) {
state.connections.push(connection);
},
hideNewConnModal (state) {
state.isNewConnModal = false;
SHOW_NEW_CONNECTION_MODAL (state) {
state.is_new_modal = true;
},
HIDE_NEW_CONNECTION_MODAL (state) {
state.is_new_modal = false;
}
},
actions: {
addConnection ({ commit }, connection) {
commit('ADD_CONNECTION', connection);
},
// Modals
showNewConnModal ({ commit }) {
commit('showNewConnModal');
commit('SHOW_NEW_CONNECTION_MODAL');
},
hideNewConnModal ({ commit }) {
commit('hideNewConnModal');
commit('HIDE_NEW_CONNECTION_MODAL');
}
}
};

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#444" d="M16 27.534c-5.323 0-9.641-1.44-9.641-3.214v-3.214c0-.279.14-.545.341-.803 1.075 1.384 4.813 2.41 9.301 2.41s8.226-1.026 9.301-2.41c.201.259.34.524.34.803v3.214c0 1.773-4.318 3.214-9.641 3.214zm0-6.428c-5.323 0-9.641-1.441-9.641-3.214v-3.214c0-.17.064-.336.151-.5.049-.103.113-.204.19-.304 1.075 1.383 4.813 2.41 9.301 2.41s8.226-1.027 9.301-2.41c.077.1.141.201.19.304.086.164.151.33.151.5v3.214c0 1.773-4.318 3.214-9.641 3.214zm0-6.427c-5.323 0-9.641-1.44-9.641-3.214V9.858 8.251c0-1.774 4.318-3.214 9.641-3.214s9.641 1.44 9.641 3.214v3.214c0 1.774-4.318 3.214-9.641 3.214zm0-8.034c-3.55 0-6.427.718-6.427 1.607S12.451 9.859 16 9.859c3.55 0 6.427-.718 6.427-1.607S19.549 6.645 16 6.645z"/></svg>

Before

Width:  |  Height:  |  Size: 799 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#444" d="M5.082 5.593c-.564.564-.423 1.213.564 2.679.508.761 1.1 1.946 1.326 2.623.226.705.677 1.664.987 2.143.564.79.564.959.197 2.397-.226.902-.31 2.031-.197 2.736.169 1.185 1.128 2.905 1.72 3.102.508.169 1.241-.733 1.269-1.551 0-.705.028-.733.338-.226.536.874 2.228 2.735 2.369 2.594.056-.056-.31-.79-.846-1.607-.508-.846-1.1-1.946-1.325-2.454-.31-.846-.423-.902-.79-.508-.226.226-.508.874-.592 1.466-.226 1.354-.733 1.523-1.128.367s-.395-3.131 0-4.484c.282-.931.254-1.184-.226-1.89-.31-.423-.79-1.438-1.044-2.256-.254-.79-.846-1.974-1.325-2.595-1.1-1.551-1.1-2.115.056-1.89.479.085 1.213.423 1.664.733.423.31 1.156.564 1.607.564 1.354 0 3.723 1.326 5.443 3.046 1.326 1.325 2.002 2.397 3.441 5.302 1.692 3.44 1.833 3.638 2.877 3.976 1.241.423 3.835 2.002 3.835 2.341 0 .113-.649.282-1.438.338-2.115.226-2.313.62-.931 1.861.649.564 1.862 1.438 2.736 1.918l1.579.902-.733-.931c-.423-.508-1.297-1.297-1.974-1.72s-1.213-.874-1.213-.987c0-.113.479-.31 1.072-.395 1.579-.282 2.03-.423 2.03-.705 0-.423-2.848-2.566-4.202-3.159-1.156-.536-1.297-.762-2.792-3.835-1.326-2.82-1.861-3.61-3.553-5.302-2.171-2.171-3.666-3.102-5.584-3.384-.649-.113-1.551-.451-1.946-.733-.931-.705-2.82-.959-3.272-.479z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#fff" d="M5.082 5.593c-.564.564-.423 1.213.564 2.679.508.761 1.1 1.946 1.326 2.623.226.705.677 1.664.987 2.143.564.79.564.959.197 2.397-.226.902-.31 2.031-.197 2.736.169 1.185 1.128 2.905 1.72 3.102.508.169 1.241-.733 1.269-1.551 0-.705.028-.733.338-.226.536.874 2.228 2.735 2.369 2.594.056-.056-.31-.79-.846-1.607-.508-.846-1.1-1.946-1.325-2.454-.31-.846-.423-.902-.79-.508-.226.226-.508.874-.592 1.466-.226 1.354-.733 1.523-1.128.367s-.395-3.131 0-4.484c.282-.931.254-1.184-.226-1.89-.31-.423-.79-1.438-1.044-2.256-.254-.79-.846-1.974-1.325-2.595-1.1-1.551-1.1-2.115.056-1.89.479.085 1.213.423 1.664.733.423.31 1.156.564 1.607.564 1.354 0 3.723 1.326 5.443 3.046 1.326 1.325 2.002 2.397 3.441 5.302 1.692 3.44 1.833 3.638 2.877 3.976 1.241.423 3.835 2.002 3.835 2.341 0 .113-.649.282-1.438.338-2.115.226-2.313.62-.931 1.861.649.564 1.862 1.438 2.736 1.918l1.579.902-.733-.931c-.423-.508-1.297-1.297-1.974-1.72s-1.213-.874-1.213-.987c0-.113.479-.31 1.072-.395 1.579-.282 2.03-.423 2.03-.705 0-.423-2.848-2.566-4.202-3.159-1.156-.536-1.297-.762-2.792-3.835-1.326-2.82-1.861-3.61-3.553-5.302-2.171-2.171-3.666-3.102-5.584-3.384-.649-.113-1.551-.451-1.946-.733-.931-.705-2.82-.959-3.272-.479z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><path d="M438.7 408.1c270.6 0 459.4-68.6 459.4-153.1v-91.9C898.1 78.6 709.4 10 438.7 10 168.1 10 10 78.6 10 163.1V255c0 84.6 158.1 153.1 428.7 153.1zM383.2 774.6c-185.9-6.9-294.4-49.3-351.5-106.1C17.1 683 10 698.4 10 714.4v122.5C10 921.5 168.1 990 438.7 990c27.1 0 53.5-.9 79.4-2.2-69.5-50-119.1-125.6-134.9-213.2zM377.6 713c.3-81 29.1-155.2 77-213.1-5.8 0-11.4.1-17.4.1-219.4 0-343.1-45.1-405.6-107.2-14.5 14.5-21.6 29.9-21.6 46v122.5c0 77.9 134.6 142.1 367.6 151.7zM730.1 608.7c-26.9 0-50.1 9.8-69.5 29.3-19.4 19.6-31.3 45.1-35.7 76.8-4.5 31.9.2 57.5 13.7 76.7 13.6 19.3 33.6 28.9 59.8 28.9 28.2 0 51.6-9.3 70.2-27.7 18.6-18.5 30.3-44.2 34.9-77.4 4.7-34 .5-60.3-12.6-78.8-13.2-18.6-33.4-27.8-60.8-27.8z"/><path d="M714.4 438.8c-152.2 0-275.6 123.4-275.6 275.6 0 152.2 123.4 275.6 275.6 275.6C866.6 990 990 866.6 990 714.4c0-152.2-123.4-275.6-275.6-275.6zM840 711.2c-6 42.8-22.2 76.8-48.6 101.9-26.5 25.1-58.9 37.6-97.2 37.6-37.5 0-65.8-12.3-85-37-19.2-24.7-26-56.7-20.5-96.3 5.9-42.6 22.2-76.5 48.7-101.7 26.6-25.2 59.5-37.8 99-37.8 36.7 0 64.5 12.3 83.4 36.9 19 24.9 25.7 56.9 20.2 96.4z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#fff" d="M16 27.534c-5.323 0-9.641-1.44-9.641-3.214v-3.214c0-.279.14-.545.341-.803 1.075 1.384 4.813 2.41 9.301 2.41s8.226-1.026 9.301-2.41c.201.259.34.524.34.803v3.214c0 1.773-4.318 3.214-9.641 3.214zm0-6.428c-5.323 0-9.641-1.441-9.641-3.214v-3.214c0-.17.064-.336.151-.5.049-.103.113-.204.19-.304 1.075 1.383 4.813 2.41 9.301 2.41s8.226-1.027 9.301-2.41c.077.1.141.201.19.304.086.164.151.33.151.5v3.214c0 1.773-4.318 3.214-9.641 3.214zm0-6.427c-5.323 0-9.641-1.44-9.641-3.214V9.858 8.251c0-1.774 4.318-3.214 9.641-3.214s9.641 1.44 9.641 3.214v3.214c0 1.774-4.318 3.214-9.641 3.214zm0-8.034c-3.55 0-6.427.718-6.427 1.607S12.451 9.859 16 9.859c3.55 0 6.427-.718 6.427-1.607S19.549 6.645 16 6.645z"/></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 799 B

1
static/svg/oracledb2.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" fill="#fff"><path d="M438.7 408.1c270.6 0 459.4-68.6 459.4-153.1v-91.9C898.1 78.6 709.4 10 438.7 10 168.1 10 10 78.6 10 163.1V255c0 84.6 158.1 153.1 428.7 153.1zM383.2 774.6c-185.9-6.9-294.4-49.3-351.5-106.1C17.1 683 10 698.4 10 714.4v122.5C10 921.5 168.1 990 438.7 990c27.1 0 53.5-.9 79.4-2.2-69.5-50-119.1-125.6-134.9-213.2zM377.6 713c.3-81 29.1-155.2 77-213.1-5.8 0-11.4.1-17.4.1-219.4 0-343.1-45.1-405.6-107.2-14.5 14.5-21.6 29.9-21.6 46v122.5c0 77.9 134.6 142.1 367.6 151.7zM730.1 608.7c-26.9 0-50.1 9.8-69.5 29.3-19.4 19.6-31.3 45.1-35.7 76.8-4.5 31.9.2 57.5 13.7 76.7 13.6 19.3 33.6 28.9 59.8 28.9 28.2 0 51.6-9.3 70.2-27.7 18.6-18.5 30.3-44.2 34.9-77.4 4.7-34 .5-60.3-12.6-78.8-13.2-18.6-33.4-27.8-60.8-27.8z"/><path d="M714.4 438.8c-152.2 0-275.6 123.4-275.6 275.6 0 152.2 123.4 275.6 275.6 275.6C866.6 990 990 866.6 990 714.4c0-152.2-123.4-275.6-275.6-275.6zM840 711.2c-6 42.8-22.2 76.8-48.6 101.9-26.5 25.1-58.9 37.6-97.2 37.6-37.5 0-65.8-12.3-85-37-19.2-24.7-26-56.7-20.5-96.3 5.9-42.6 22.2-76.5 48.7-101.7 26.6-25.2 59.5-37.8 99-37.8 36.7 0 64.5 12.3 83.4 36.9 19 24.9 25.7 56.9 20.2 96.4z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#444" d="M55.387 66.469h8.333l-4.407-7.09-8.088 12.819h-3.681l9.838-15.398c.428-.622 1.14-.998 1.931-.998.765 0 1.478.363 1.892.972l9.876 15.424h-3.681l-1.736-2.865h-8.438l-1.839-2.864zm38.235 2.864v-13.375h-3.123v14.685c0 .402.156.791.454 1.089.298.298.7.466 1.141.466h14.244l1.841-2.865h-14.557zm-51.677-2.397c3.033 0 5.496-2.449 5.496-5.482s-2.462-5.496-5.496-5.496h-13.665v16.241h3.123v-13.377h10.335c1.452 0 2.618 1.18 2.618 2.631s-1.167 2.631-2.618 2.631l-8.806-.013 9.324 8.127h4.538l-6.274-5.263h1.425zm-32.886 5.262c-4.483 0-8.122-3.629-8.122-8.114s3.638-8.127 8.122-8.127h9.439c4.485 0 8.121 3.643 8.121 8.127s-3.636 8.114-8.121 8.114h-9.439zm9.229-2.865c2.905 0 5.258-2.346 5.258-5.249 0-2.903-2.353-5.263-5.258-5.263h-9.021c-2.902 0-5.256 2.359-5.256 5.263 0 2.903 2.354 5.249 5.256 5.249h9.021zm59.314 2.865c-4.484 0-8.126-3.629-8.126-8.114s3.642-8.127 8.126-8.127h11.212l-1.829 2.864h-9.175c-2.904 0-5.264 2.359-5.264 5.263 0 2.903 2.36 5.249 5.264 5.249h11.263l-1.84 2.865h-9.631zm38.197-2.865c-2.397 0-4.433-1.607-5.055-3.824h13.35l1.84-2.864h-15.19c.622-2.203 2.658-3.824 5.055-3.824h9.163l1.854-2.864h-11.225c-4.484 0-8.126 3.643-8.126 8.127s3.642 8.114 8.126 8.114h9.631l1.841-2.865h-11.264"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#fff" d="M55.387 66.469h8.333l-4.407-7.09-8.088 12.819h-3.681l9.838-15.398c.428-.622 1.14-.998 1.931-.998.765 0 1.478.363 1.892.972l9.876 15.424h-3.681l-1.736-2.865h-8.438l-1.839-2.864zm38.235 2.864v-13.375h-3.123v14.685c0 .402.156.791.454 1.089.298.298.7.466 1.141.466h14.244l1.841-2.865h-14.557zm-51.677-2.397c3.033 0 5.496-2.449 5.496-5.482s-2.462-5.496-5.496-5.496h-13.665v16.241h3.123v-13.377h10.335c1.452 0 2.618 1.18 2.618 2.631s-1.167 2.631-2.618 2.631l-8.806-.013 9.324 8.127h4.538l-6.274-5.263h1.425zm-32.886 5.262c-4.483 0-8.122-3.629-8.122-8.114s3.638-8.127 8.122-8.127h9.439c4.485 0 8.121 3.643 8.121 8.127s-3.636 8.114-8.121 8.114h-9.439zm9.229-2.865c2.905 0 5.258-2.346 5.258-5.249 0-2.903-2.353-5.263-5.258-5.263h-9.021c-2.902 0-5.256 2.359-5.256 5.263 0 2.903 2.354 5.249 5.256 5.249h9.021zm59.314 2.865c-4.484 0-8.126-3.629-8.126-8.114s3.642-8.127 8.126-8.127h11.212l-1.829 2.864h-9.175c-2.904 0-5.264 2.359-5.264 5.263 0 2.903 2.36 5.249 5.264 5.249h11.263l-1.84 2.865h-9.631zm38.197-2.865c-2.397 0-4.433-1.607-5.055-3.824h13.35l1.84-2.864h-15.19c.622-2.203 2.658-3.824 5.055-3.824h9.163l1.854-2.864h-11.225c-4.484 0-8.126 3.643-8.126 8.127s3.642 8.114 8.126 8.114h9.631l1.841-2.865h-11.264"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#444" d="M26.741 18.661c-.24-.278-.65-.202-.967-.139-.762.136-1.591.294-2.329-.023 1.318-2.08 2.355-4.351 2.935-6.748.211-.911.374-1.843.343-2.781-.023-.525-.096-1.084-.417-1.519A6.019 6.019 0 0023.092 5.3c-1.585-.43-3.285-.302-4.844.18-.129.026-.256-.032-.382-.048-1.415-.287-2.975-.174-4.202.645-1.473-.53-3.056-.85-4.624-.686-1.166.121-2.337.663-3.006 1.656-.846 1.239-.961 2.821-.826 4.273.272 1.928.742 3.826 1.34 5.677.394 1.154.828 2.317 1.529 3.325.356.495.829.994 1.466 1.072.566.069 1.078-.282 1.425-.698.6-.718 1.217-1.423 1.857-2.105.418.205.872.323 1.336.358-.251.298-.458.687-.858.804-.539.208-1.17.18-1.645.539-.274.196-.287.623-.041.848.445.432 1.101.525 1.693.575a3.21 3.21 0 002.324-.768c-.004 1.334.002 2.672.152 3.999.075.777.41 1.551 1.001 2.074.557.486 1.351.587 2.058.464.694-.132 1.407-.34 1.949-.814.576-.508.822-1.275.936-2.011a93.19 93.19 0 00.514-3.969c1.483.25 3.161-.034 4.269-1.117.237-.223.462-.609.228-.912zM23.45 6.117c.89.338 1.681.925 2.275 1.668.283.355.319.832.337 1.268.013 1.04-.197 2.067-.464 3.067a21.858 21.858 0 01-2.262 5.277 4.38 4.38 0 01-.317.469 60.07 60.07 0 01-.036-.183c.121-.318.298-.618.367-.956.244-.953.038-1.934-.05-2.893-.092-.905.217-1.786.209-2.689.035-.442-.14-.86-.31-1.257-.615-1.375-1.593-2.598-2.848-3.438-.306-.21-.648-.357-.953-.568 1.334-.286 2.765-.25 4.051.234zm-.813 7.719c.078 1.071.389 2.221-.116 3.237-.677-1.347-1.552-2.633-1.857-4.133-.086-.477-.108-1.081.316-1.413.538-.382 1.241-.296 1.863-.258-.027.859-.291 1.702-.205 2.567zm-12.103 6.345c-.243.286-.571.627-.985.542-.484-.14-.792-.582-1.062-.979-.729-1.166-1.168-2.483-1.571-3.79-.451-1.547-.831-3.119-1.05-4.717-.109-1.216-.041-2.52.581-3.603.466-.82 1.335-1.343 2.248-1.514 1.462-.281 2.961.017 4.364.445a6.438 6.438 0 00-1.382 2.358 9.506 9.506 0 00-.466 3.648c.053.867.03 1.738-.091 2.598-.152 1.123.299 2.278 1.133 3.036-.568.664-1.17 1.297-1.72 1.977zm1.28-4.023c-.143-.636.044-1.276.065-1.913.049-.721-.002-1.443-.016-2.164.674-.436 1.462-.777 2.279-.73a.992.992 0 01.915.734c.371 1.477.486 3.121-.225 4.52a13.24 13.24 0 00-.622 1.666c-1.182.012-2.187-.987-2.396-2.112zm3.678 3.954c-.742 1.005-2.227 1.197-3.3.65.529-.245 1.148-.226 1.659-.528.494-.266.69-.851 1.152-1.152.503-.071.87.676.49 1.029zm6.364-1.174c-.282.454-.183 1.008-.252 1.512-.162 1.413-.321 2.828-.551 4.232-.109.673-.395 1.388-1.03 1.723-.651.331-1.407.539-2.139.426-.695-.122-1.133-.77-1.33-1.401-.144-.529-.159-1.082-.2-1.627a50.004 50.004 0 01-.037-3.949c.029-.514-.235-1.049-.694-1.299-.222-.125-.482-.142-.73-.162.195-.967.784-1.802.986-2.768.262-1.195.117-2.439-.151-3.619-.131-.589-.579-1.11-1.175-1.253-.918-.231-1.844.128-2.665.512.104-1.334.461-2.7 1.278-3.783a3.79 3.79 0 012.528-1.473c1.642-.209 3.366.243 4.671 1.27a7.406 7.406 0 012.389 3.304c-.763-.027-1.628-.058-2.245.472-.56.472-.632 1.277-.506 1.953.292 1.608 1.241 2.975 1.941 4.421.186.339.436.635.674.939-.283.143-.599.28-.76.571zm1.964 1.137c-.504.06-1.028.078-1.514-.089.002-.275-.013-.601.208-.806.175-.129.424-.248.626-.107.86.453 1.86.232 2.775.121-.559.544-1.333.798-2.095.881zm-2.642-8.347c-.179.147.014.367.168.436.373.219.884-.087.896-.513-.337-.157-.76-.141-1.065.077zm-6.602.68c.159-.09.327-.337.143-.486-.262-.213-.643-.254-.962-.168-.103.036-.211.106-.19.232.074.428.647.688 1.008.422z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#fff" d="M26.741 18.661c-.24-.278-.65-.202-.967-.139-.762.136-1.591.294-2.329-.023 1.318-2.08 2.355-4.351 2.935-6.748.211-.911.374-1.843.343-2.781-.023-.525-.096-1.084-.417-1.519A6.019 6.019 0 0023.092 5.3c-1.585-.43-3.285-.302-4.844.18-.129.026-.256-.032-.382-.048-1.415-.287-2.975-.174-4.202.645-1.473-.53-3.056-.85-4.624-.686-1.166.121-2.337.663-3.006 1.656-.846 1.239-.961 2.821-.826 4.273.272 1.928.742 3.826 1.34 5.677.394 1.154.828 2.317 1.529 3.325.356.495.829.994 1.466 1.072.566.069 1.078-.282 1.425-.698.6-.718 1.217-1.423 1.857-2.105.418.205.872.323 1.336.358-.251.298-.458.687-.858.804-.539.208-1.17.18-1.645.539-.274.196-.287.623-.041.848.445.432 1.101.525 1.693.575a3.21 3.21 0 002.324-.768c-.004 1.334.002 2.672.152 3.999.075.777.41 1.551 1.001 2.074.557.486 1.351.587 2.058.464.694-.132 1.407-.34 1.949-.814.576-.508.822-1.275.936-2.011a93.19 93.19 0 00.514-3.969c1.483.25 3.161-.034 4.269-1.117.237-.223.462-.609.228-.912zM23.45 6.117c.89.338 1.681.925 2.275 1.668.283.355.319.832.337 1.268.013 1.04-.197 2.067-.464 3.067a21.858 21.858 0 01-2.262 5.277 4.38 4.38 0 01-.317.469 60.07 60.07 0 01-.036-.183c.121-.318.298-.618.367-.956.244-.953.038-1.934-.05-2.893-.092-.905.217-1.786.209-2.689.035-.442-.14-.86-.31-1.257-.615-1.375-1.593-2.598-2.848-3.438-.306-.21-.648-.357-.953-.568 1.334-.286 2.765-.25 4.051.234zm-.813 7.719c.078 1.071.389 2.221-.116 3.237-.677-1.347-1.552-2.633-1.857-4.133-.086-.477-.108-1.081.316-1.413.538-.382 1.241-.296 1.863-.258-.027.859-.291 1.702-.205 2.567zm-12.103 6.345c-.243.286-.571.627-.985.542-.484-.14-.792-.582-1.062-.979-.729-1.166-1.168-2.483-1.571-3.79-.451-1.547-.831-3.119-1.05-4.717-.109-1.216-.041-2.52.581-3.603.466-.82 1.335-1.343 2.248-1.514 1.462-.281 2.961.017 4.364.445a6.438 6.438 0 00-1.382 2.358 9.506 9.506 0 00-.466 3.648c.053.867.03 1.738-.091 2.598-.152 1.123.299 2.278 1.133 3.036-.568.664-1.17 1.297-1.72 1.977zm1.28-4.023c-.143-.636.044-1.276.065-1.913.049-.721-.002-1.443-.016-2.164.674-.436 1.462-.777 2.279-.73a.992.992 0 01.915.734c.371 1.477.486 3.121-.225 4.52a13.24 13.24 0 00-.622 1.666c-1.182.012-2.187-.987-2.396-2.112zm3.678 3.954c-.742 1.005-2.227 1.197-3.3.65.529-.245 1.148-.226 1.659-.528.494-.266.69-.851 1.152-1.152.503-.071.87.676.49 1.029zm6.364-1.174c-.282.454-.183 1.008-.252 1.512-.162 1.413-.321 2.828-.551 4.232-.109.673-.395 1.388-1.03 1.723-.651.331-1.407.539-2.139.426-.695-.122-1.133-.77-1.33-1.401-.144-.529-.159-1.082-.2-1.627a50.004 50.004 0 01-.037-3.949c.029-.514-.235-1.049-.694-1.299-.222-.125-.482-.142-.73-.162.195-.967.784-1.802.986-2.768.262-1.195.117-2.439-.151-3.619-.131-.589-.579-1.11-1.175-1.253-.918-.231-1.844.128-2.665.512.104-1.334.461-2.7 1.278-3.783a3.79 3.79 0 012.528-1.473c1.642-.209 3.366.243 4.671 1.27a7.406 7.406 0 012.389 3.304c-.763-.027-1.628-.058-2.245.472-.56.472-.632 1.277-.506 1.953.292 1.608 1.241 2.975 1.941 4.421.186.339.436.635.674.939-.283.143-.599.28-.76.571zm1.964 1.137c-.504.06-1.028.078-1.514-.089.002-.275-.013-.601.208-.806.175-.129.424-.248.626-.107.86.453 1.86.232 2.775.121-.559.544-1.333.798-2.095.881zm-2.642-8.347c-.179.147.014.367.168.436.373.219.884-.087.896-.513-.337-.157-.76-.141-1.065.077zm-6.602.68c.159-.09.327-.337.143-.486-.262-.213-.643-.254-.962-.168-.103.036-.211.106-.19.232.074.428.647.688 1.008.422z"/></svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB