Code cleanup

This commit is contained in:
Abdelilah El Aissaoui 2023-04-15 16:34:04 +02:00
parent 0512510be6
commit e16939a6ef
No known key found for this signature in database
GPG Key ID: 7587FC860F594869
33 changed files with 75 additions and 78 deletions

View File

@ -1,26 +1,31 @@
# Gitnuro - Multiplatform Git Client
[![Latest release](https://img.shields.io/github/v/release/JetpackDuba/Gitnuro?color=blue&label=latest%20release)](https://github.com/JetpackDuba/Gitnuro/releases/latest)
![Icon](res/img/cover.png)
A FOSS Git client based on (Jetbrains) Compose and JGit.
The main goal of Gitnuro is to provide a multiplatform open source Git client without any kind of constraint to how you can use it nor relying on web technologies.
The main goal of Gitnuro is to provide a multiplatform open source Git client without any kind of constraint to how you
can use it nor relying on web technologies.
## Download/Install
Linux:
- Available as Flatpak [here](https://beta.flathub.org/apps/details/com.jetpackduba.Gitnuro) or by running `flatpak install --user com.jetpackduba.Gitnuro` if you have Flatpak & Flathub already setup.
- Available as Flatpak [here](https://beta.flathub.org/apps/details/com.jetpackduba.Gitnuro) or by
running `flatpak install --user com.jetpackduba.Gitnuro` if you have Flatpak & Flathub already setup.
- JAR file can be executed as a portable version (Requires JRE 17).
Windows:
- [Installable & portable version](https://github.com/JetpackDuba/Gitnuro/releases/latest).
MacOS:
- [ZIP which contains the app bundle](https://github.com/JetpackDuba/Gitnuro/releases/latest).
- Using hombrew: `brew install jetpackduba/apps/gitnuro`
## Features
Gitnuro has support for the following features:
@ -56,11 +61,9 @@ Gitnuro has support for the following features:
- Side by side diff in text files.
- Stage/Unstage specific lines.
<details>
<summary><b>Features planned</b></summary>
- Create/Apply patches
- Remove tags from remote.
- View stashes in the log tree.
@ -69,13 +72,15 @@ Gitnuro has support for the following features:
- Syntax highlighting for diff.
- Various log options like showing the author, filtering by current branch o hide remote branches.
- Customizations settings.
</details>
## Contributing
If you find a bug or you would like to suggest a new feature, feel free to open an issue.
Pull requests are also welcome but please create an issue first if it's a new feature. If you want to work on an existing issue, please comment so I'm aware of it and discuss the changes if required.
Pull requests are also welcome but please create an issue first if it's a new feature. If you want to work on an
existing issue, please comment so I'm aware of it and discuss the changes if required.
See [this page](DEVELOPMENT.md) for how to set up your development environment.
## FAQ
@ -90,7 +95,8 @@ Gitnuro does not track data in any way, don't worry.
> I don't like the built-in themes, can I create a custom one?
Gitnuro includes the option to set custom themes in a JSON format. Keep in mind that themes may break with new releases, making the default theme the fallback option.
Gitnuro includes the option to set custom themes in a JSON format. Keep in mind that themes may break with new releases,
making the default theme the fallback option.
For the latest stable version (1.1.0), you can use this JSON as an example:
@ -124,32 +130,37 @@ For the latest stable version (1.1.0), you can use this JSON as an example:
Colors are in ARGB Hex format.
> Why isn't the Mac version signed?
> Why isn't the Mac version signed?
The cost of the Apple Developer Program is quite high with a platform that currently has very few users. I may pay for it if it's a very requested feature but not for now.
The cost of the Apple Developer Program is quite high with a platform that currently has very few users. I may pay for
it if it's a very requested feature but not for now.
> Authentication has failed. What's wrong?
Currently there are some limitations regarding this topic. Here are some known problematic setups:
- SSH keys managed by external agents (https://github.com/JetpackDuba/Gitnuro/issues/17).
- Configurations added to .ssh/config
- Non-default ssh dir path.
- Multicast DNS remote URL (https://github.com/JetpackDuba/Gitnuro/issues/19) with this workaround (https://github.com/JetpackDuba/Gitnuro/issues/19#issuecomment-1374431720).
- Multicast DNS remote URL (https://github.com/JetpackDuba/Gitnuro/issues/19) with this
workaround (https://github.com/JetpackDuba/Gitnuro/issues/19#issuecomment-1374431720).
- Self signed server certificate (https://github.com/JetpackDuba/Gitnuro/issues/48)
If the authentication fails and you think its due to a different reason, please open a new issue.
> Does it support Git credentials manager (aka manager-core)?
Yes but it requires specifying the full path of the binary in your `.gitconfig`.
> Yes but it requires specifying the full path of the binary in your `.gitconfig`.
Example for linux:
Example for linux:
```
[credential]
helper = /usr/share/git-credential-manager-core/git-credential-manager-core
```
Example for windows (you may want to edit `C:\Program Files\mingw64\etc\gitconfig`):
Example for windows (you may want to edit `C:\Program Files\mingw64\etc\gitconfig`):
```
[credential]
helper = C:/Program Files/Git/mingw64/bin/git-credential-manager-core.exe

View File

@ -29,7 +29,6 @@ import com.jetpackduba.gitnuro.extensions.systemSeparator
import com.jetpackduba.gitnuro.extensions.toWindowPlacement
import com.jetpackduba.gitnuro.git.AppGpgSigner
import com.jetpackduba.gitnuro.logging.printError
import com.jetpackduba.gitnuro.logging.printLog
import com.jetpackduba.gitnuro.preferences.AppSettings
import com.jetpackduba.gitnuro.theme.AppTheme
import com.jetpackduba.gitnuro.theme.Theme
@ -155,7 +154,7 @@ class App {
val tabs by tabsManager.tabsFlow.collectAsState()
val currentTab = tabsManager.currentTab.collectAsState().value
if(currentTab != null) {
if (currentTab != null) {
Column(
modifier = Modifier.background(MaterialTheme.colors.background)
) {
@ -200,7 +199,7 @@ class App {
}
}
fun getDirToOpen(args: Array<String>): File? {
private fun getDirToOpen(args: Array<String>): File? {
if (args.isNotEmpty()) {
val repoToOpen = args.first()
val path = Paths.get(repoToOpen)

View File

@ -3,7 +3,6 @@ package com.jetpackduba.gitnuro
import com.jetpackduba.gitnuro.extensions.OS
import com.jetpackduba.gitnuro.extensions.getCurrentOs
import com.jetpackduba.gitnuro.logging.printError
import com.jetpackduba.gitnuro.logging.printLog
import java.io.File
import javax.inject.Inject

View File

@ -2,7 +2,10 @@ package com.jetpackduba.gitnuro
import com.jetpackduba.gitnuro.di.qualifiers.AppCoroutineScope
import com.jetpackduba.gitnuro.preferences.AppSettings
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString

View File

@ -50,7 +50,7 @@ class HttpCredentialsProvider @AssistedInject constructor(
passwordItem.value = credentials.password.toCharArray()
return true
} else if(credentials is CredentialsState.CredentialsDenied) {
} else if (credentials is CredentialsState.CredentialsDenied) {
throw CancellationException("Credentials denied")
}
@ -83,7 +83,7 @@ class HttpCredentialsProvider @AssistedInject constructor(
credentials: CredentialsAccepted.HttpCredentialsAccepted
) {
val process = Runtime.getRuntime()
.exec(String.format("${externalCredentialsHelper.path} %s", "store"));
.exec(String.format("${externalCredentialsHelper.path} %s", "store"))
val output = process.outputStream // write to the input stream of the helper
val bufferedWriter = BufferedWriter(OutputStreamWriter(output))

View File

@ -118,7 +118,7 @@ class TabState @Inject constructor(
delayMs = 300,
onDelayTriggered = {
_processing.update { processingState ->
if(processingState is ProcessingState.None) {
if (processingState is ProcessingState.None) {
ProcessingState.Processing(title, subtitle, isCancellable)
} else {
processingState

View File

@ -29,7 +29,7 @@ class FetchAllBranchesUseCase @Inject constructor(
.setRemoveDeletedRefs(true)
.setTransportConfigCallback { handleTransportUseCase(it, git) }
.setCredentialsProvider(CredentialsProvider.getDefault())
.setProgressMonitor(object: ProgressMonitor {
.setProgressMonitor(object : ProgressMonitor {
override fun start(totalTasks: Int) {}
override fun beginTask(title: String?, totalWork: Int) {}

View File

@ -25,7 +25,7 @@ class PushBranchUseCase @Inject constructor(
setPushTags()
}
.setTransportConfigCallback { handleTransportUseCase(it, git) }
.setProgressMonitor(object: ProgressMonitor {
.setProgressMonitor(object : ProgressMonitor {
override fun start(totalTasks: Int) {}
override fun beginTask(title: String?, totalWork: Int) {}
override fun update(completed: Int) {}

View File

@ -7,6 +7,7 @@ val logger = KotlinLogging.logger("org.slf4j")
fun printLog(tag: String, message: String) {
logger.info("$tag - $message")
}
fun printDebug(tag: String, message: String) {
logger.debug("$tag - $message")
}

View File

@ -1,8 +1,5 @@
package com.jetpackduba.gitnuro
import io.github.oshai.KotlinLogging
import java.util.logging.Logger
fun main(args: Array<String>) {
val app = App()
app.start(args)

View File

@ -17,7 +17,6 @@ interface SSHLibrary : Library {
fun ssh_connect(session: ssh_session): Int
fun ssh_userauth_agent(session: ssh_session, username: String?): Int
fun ssh_userauth_publickey_auto(session: ssh_session, username: String?, password: String?): Int
fun ssh_userauth_password(session: ssh_session, username: String?, password: String?): Int
fun ssh_get_error(session: ssh_session): String
@ -29,23 +28,13 @@ interface SSHLibrary : Library {
fun ssh_channel_request_exec(sshChannel: ssh_channel, command: String): Int
fun ssh_channel_read(sshChannel: ssh_channel, buffer: ByteArray, count: Int, isStderr: Int): Int
fun ssh_channel_read_timeout(
sshChannel: ssh_channel,
buffer: ByteArray,
count: Int,
isStderr: Int,
timeoutMs: Int
): Int
fun ssh_channel_poll(sshChannel: ssh_channel, isStderr: Int): Int
fun ssh_channel_read_nonblocking(sshChannel: ssh_channel, buffer: ByteArray, count: Int, isStderr: Int): Int
fun ssh_channel_write(sshChannel: ssh_channel, data: ByteArray, len: Int): Int
fun ssh_channel_close(sshChannel: ssh_channel): Int
fun ssh_channel_send_eof(sshChannel: ssh_channel): Int
fun ssh_channel_free(sshChannel: ssh_channel)
fun ssh_channel_is_open(sshChannel: ssh_channel): Int

View File

@ -56,7 +56,7 @@ fun Blame(
.focusRequester(focusRequester)
.focusable()
.onPreviewKeyEvent { keyEvent ->
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown ) {
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown) {
onClose()
true
} else

View File

@ -13,6 +13,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
@ -33,7 +34,6 @@ import org.eclipse.jgit.diff.DiffEntry
import org.eclipse.jgit.lib.ObjectId
import org.eclipse.jgit.lib.PersonIdent
import org.eclipse.jgit.revwalk.RevCommit
import androidx.compose.ui.res.painterResource
@Composable
fun CommitChanges(
@ -128,7 +128,7 @@ fun CommitChangesView(
}
}
if(showSearch) {
if (showSearch) {
AdjustableOutlinedTextField(
value = searchFilter,
onValueChange = {
@ -141,14 +141,18 @@ fun CommitChangesView(
}
LaunchedEffect(showSearch) {
if(showSearch) {
if (showSearch) {
searchFocusRequester.requestFocus()
}
}
CommitLogChanges(
diffSelected = diffSelected,
diffEntries = if(showSearch && searchFilter.isNotBlank()) changes.filter { it.filePath.lowercaseContains(searchFilter) } else changes,
diffEntries = if (showSearch && searchFilter.isNotBlank()) changes.filter {
it.filePath.lowercaseContains(
searchFilter
)
} else changes,
onDiffSelected = onDiffSelected,
onBlame = onBlame,
onHistory = onHistory,

View File

@ -62,7 +62,7 @@ fun FileHistory(
.focusRequester(focusRequester)
.focusable()
.onKeyEvent { keyEvent ->
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown ) {
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown) {
onClose()
true
} else

View File

@ -11,7 +11,9 @@ import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier

View File

@ -31,7 +31,7 @@ import java.io.File
@Composable
fun CloneDialog(
cloneViewModel: CloneViewModel = gitnuroViewModel(), // TODO THIS CRASHES
cloneViewModel: CloneViewModel = gitnuroViewModel(),
onClose: () -> Unit,
onOpenRepository: (File) -> Unit,
) {

View File

@ -17,7 +17,6 @@ import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.handMouseClickable
import com.jetpackduba.gitnuro.models.AuthorInfo
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.theme.outlinedTextFieldColors
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton

View File

@ -64,7 +64,7 @@ fun MaterialDialog(
.focusRequester(focusRequester)
.focusable()
.onPreviewKeyEvent { keyEvent ->
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown ) {
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown) {
onCloseRequested()
true
} else

View File

@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton

View File

@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton

View File

@ -27,7 +27,6 @@ import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.handOnHover
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.theme.outlinedTextFieldColors
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton

View File

@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton

View File

@ -20,7 +20,6 @@ import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton

View File

@ -85,7 +85,7 @@ fun Diff(
indication = null
) {}
.onPreviewKeyEvent { keyEvent ->
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown ) {
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown) {
onCloseDiffView()
true
} else

View File

@ -41,7 +41,6 @@ import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.*
import com.jetpackduba.gitnuro.git.graph.GraphCommitList
import com.jetpackduba.gitnuro.git.graph.GraphNode
import com.jetpackduba.gitnuro.git.graph.UncommitedChangesGraphNode
import com.jetpackduba.gitnuro.git.workspace.StatusSummary
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
@ -774,7 +773,7 @@ fun CommitLine(
onRevCommitSelected: () -> Unit,
onRebaseInteractive: () -> Unit,
) {
val isLastCommitOfCurrentBranch = currentBranch?.objectId?.name == graphNode.id.name
val isLastCommitOfCurrentBranch = currentBranch?.objectId?.name == graphNode.id.name
ContextMenu(
items = {

View File

@ -181,7 +181,7 @@ class TabViewModel @Inject constructor(
val git = Git(repository)
tabState.initGit(git)
val path = if(directory.name == ".git") {
val path = if (directory.name == ".git") {
directory.parent
} else
directory.absolutePath

View File

@ -29,9 +29,4 @@ class TabViewModelsHolder @Inject constructor(
cloneViewModel::class to cloneViewModel,
settingsViewModel::class to settingsViewModel,
)
fun getVMAndCacheIt() {
}
}

View File

@ -29,7 +29,6 @@ class BranchesViewModel @AssistedInject constructor(
private val getCurrentBranchUseCase: GetCurrentBranchUseCase,
private val mergeBranchUseCase: MergeBranchUseCase,
private val getBranchesUseCase: GetBranchesUseCase,
private val createBranchUseCase: CreateBranchUseCase,
private val deleteBranchUseCase: DeleteBranchUseCase,
private val checkoutRefUseCase: CheckoutRefUseCase,
private val tabScope: CoroutineScope,

View File

@ -71,23 +71,23 @@ class SubmodulesViewModel @AssistedInject constructor(
fun onDeinitializeSubmodule(path: String) = tabState.safeProcessing(
refreshType = RefreshType.SUBMODULES,
title = "Deinitializing submodule $path",
){ git ->
) { git ->
deInitializeSubmoduleUseCase(git, path)
}
fun onSyncSubmodule(path: String) = tabState.safeProcessing(
fun onSyncSubmodule(path: String) = tabState.safeProcessing(
refreshType = RefreshType.SUBMODULES,
title = "Syncing submodule $path",
subtitle = "Please wait until synchronization has finished",
){ git ->
) { git ->
syncSubmoduleUseCase(git, path)
}
fun onUpdateSubmodule(path: String) = tabState.safeProcessing(
fun onUpdateSubmodule(path: String) = tabState.safeProcessing(
refreshType = RefreshType.SUBMODULES,
title = "Updating submodule $path",
subtitle = "Please wait until update has finished",
){ git ->
) { git ->
updateSubmoduleUseCase(git, path)
}
}

View File

@ -1,7 +1,8 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<line x1="8" y1="9" x2="8" y2="16" stroke="black" stroke-width="2"/>
<circle cx="8" cy="6" r="3" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="9" r="3" stroke="black" stroke-width="1.5"/>
<circle cx="8" cy="19" r="3" stroke="black" stroke-width="1.5"/>
<path d="M9.60651 17.0001L11.1551 15.7964C11.7332 15.3471 12.4033 15.031 13.1176 14.8708L15.0484 14.4378C16.1892 14.1819 17 13.1691 17 12" stroke="black" stroke-width="2"/>
<line x1="8" y1="9" x2="8" y2="16" stroke="black" stroke-width="2"/>
<circle cx="8" cy="6" r="3" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="9" r="3" stroke="black" stroke-width="1.5"/>
<circle cx="8" cy="19" r="3" stroke="black" stroke-width="1.5"/>
<path d="M9.60651 17.0001L11.1551 15.7964C11.7332 15.3471 12.4033 15.031 13.1176 14.8708L15.0484 14.4378C16.1892 14.1819 17 13.1691 17 12"
stroke="black" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 539 B

After

Width:  |  Height:  |  Size: 569 B

View File

@ -1,6 +1,5 @@
# Root logger option
log4j.rootLogger=INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${user.home}/.gitnuro/gitnuro.log
@ -8,7 +7,6 @@ log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out

View File

@ -1 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M4 4h16v12H5.17L4 17.17V4m0-2c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2H4zm2 10h12v2H6v-2zm0-3h12v2H6V9zm0-3h12v2H6V6z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none"/>
<path d="M4 4h16v12H5.17L4 17.17V4m0-2c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2H4zm2 10h12v2H6v-2zm0-3h12v2H6V9zm0-3h12v2H6V6z"/>
</svg>

Before

Width:  |  Height:  |  Size: 300 B

After

Width:  |  Height:  |  Size: 311 B

View File

@ -1 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2m0 10c2.7 0 5.8 1.29 6 2H6c.23-.72 3.31-2 6-2m0-12C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 10c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none"/>
<path d="M12 6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2m0 10c2.7 0 5.8 1.29 6 2H6c.23-.72 3.31-2 6-2m0-12C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 10c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/>
</svg>

Before

Width:  |  Height:  |  Size: 360 B

After

Width:  |  Height:  |  Size: 371 B