Merge branch 'master' into master-android
@@ -52,6 +52,9 @@ actual fun windowOrientation(): WindowOrientation = when (mainActivity.get()?.re
|
||||
@Composable
|
||||
actual fun windowWidth(): Dp = LocalConfiguration.current.screenWidthDp.dp
|
||||
|
||||
@Composable
|
||||
actual fun windowHeight(): Dp = LocalConfiguration.current.screenHeightDp.dp
|
||||
|
||||
actual fun desktopExpandWindowToWidth(width: Dp) {}
|
||||
|
||||
actual fun isRtl(text: CharSequence): Boolean = BidiFormatter.getInstance().isRtl(text)
|
||||
|
||||
@@ -4,14 +4,21 @@ import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.gestures.FlingBehavior
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.unit.dp
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import kotlinx.coroutines.flow.filter
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
@Composable
|
||||
actual fun LazyColumnWithScrollBar(
|
||||
modifier: Modifier,
|
||||
state: LazyListState,
|
||||
state: LazyListState?,
|
||||
contentPadding: PaddingValues,
|
||||
reverseLayout: Boolean,
|
||||
verticalArrangement: Arrangement.Vertical,
|
||||
@@ -20,7 +27,24 @@ actual fun LazyColumnWithScrollBar(
|
||||
userScrollEnabled: Boolean,
|
||||
content: LazyListScope.() -> Unit
|
||||
) {
|
||||
LazyColumn(modifier, state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content)
|
||||
val state = state ?: LocalAppBarHandler.current?.listState ?: rememberLazyListState()
|
||||
val connection = LocalAppBarHandler.current?.connection
|
||||
LaunchedEffect(Unit) {
|
||||
snapshotFlow { state.firstVisibleItemScrollOffset }
|
||||
.filter { state.firstVisibleItemIndex == 0 }
|
||||
.collect { scrollPosition ->
|
||||
val offset = connection?.appBarOffset
|
||||
if (offset != null && (offset + scrollPosition).absoluteValue > 1) {
|
||||
connection.appBarOffset = -scrollPosition.toFloat()
|
||||
// Log.d(TAG, "Scrolling position changed from $offset to ${connection.appBarOffset}")
|
||||
}
|
||||
}
|
||||
}
|
||||
if (connection != null) {
|
||||
LazyColumn(modifier.nestedScroll(connection), state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content)
|
||||
} else {
|
||||
LazyColumn(modifier, state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@@ -28,8 +52,34 @@ actual fun ColumnWithScrollBar(
|
||||
modifier: Modifier,
|
||||
verticalArrangement: Arrangement.Vertical,
|
||||
horizontalAlignment: Alignment.Horizontal,
|
||||
state: ScrollState,
|
||||
content: @Composable ColumnScope.() -> Unit
|
||||
state: ScrollState?,
|
||||
maxIntrinsicSize: Boolean,
|
||||
content: @Composable() (ColumnScope.() -> Unit)
|
||||
) {
|
||||
Column(modifier.verticalScroll(rememberScrollState()), verticalArrangement, horizontalAlignment, content)
|
||||
val state = state ?: LocalAppBarHandler.current?.scrollState ?: rememberScrollState()
|
||||
val connection = LocalAppBarHandler.current?.connection
|
||||
LaunchedEffect(Unit) {
|
||||
snapshotFlow { state.value }
|
||||
.collect { scrollPosition ->
|
||||
val offset = connection?.appBarOffset
|
||||
if (offset != null && (offset + scrollPosition).absoluteValue > 1) {
|
||||
connection.appBarOffset = -scrollPosition.toFloat()
|
||||
// Log.d(TAG, "Scrolling position changed from $offset to ${connection.appBarOffset}")
|
||||
}
|
||||
}
|
||||
}
|
||||
if (connection != null) {
|
||||
Column(
|
||||
if (maxIntrinsicSize) {
|
||||
modifier.nestedScroll(connection).verticalScroll(state).height(IntrinsicSize.Max)
|
||||
} else {
|
||||
modifier.nestedScroll(connection).verticalScroll(state)
|
||||
}, verticalArrangement, horizontalAlignment, content)
|
||||
} else {
|
||||
Column(if (maxIntrinsicSize) {
|
||||
modifier.verticalScroll(state).height(IntrinsicSize.Max)
|
||||
} else {
|
||||
modifier.verticalScroll(state)
|
||||
}, verticalArrangement, horizontalAlignment, content)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -457,7 +457,7 @@ private fun DisabledBackgroundCallsButton() {
|
||||
) {
|
||||
Text(stringResource(MR.strings.system_restricted_background_in_call_title), color = WarningOrange)
|
||||
Spacer(Modifier.width(8.dp))
|
||||
IconButton(onClick = { show = false }, Modifier.size(24.dp)) {
|
||||
IconButton(onClick = { show = false }, Modifier.size(22.dp)) {
|
||||
Icon(painterResource(MR.images.ic_close), null, tint = WarningOrange)
|
||||
}
|
||||
}
|
||||
@@ -539,7 +539,7 @@ fun CallPermissionsView(pipActive: Boolean, hasVideo: Boolean, cancel: () -> Uni
|
||||
Icon(
|
||||
painterResource(MR.images.ic_call_500),
|
||||
stringResource(MR.strings.permissions_record_audio),
|
||||
Modifier.size(24.dp),
|
||||
Modifier.size(22.dp),
|
||||
tint = Color(0xFFFFFFD8)
|
||||
)
|
||||
}
|
||||
@@ -547,7 +547,7 @@ fun CallPermissionsView(pipActive: Boolean, hasVideo: Boolean, cancel: () -> Uni
|
||||
Icon(
|
||||
painterResource(MR.images.ic_videocam),
|
||||
stringResource(MR.strings.permissions_camera),
|
||||
Modifier.size(24.dp),
|
||||
Modifier.size(22.dp),
|
||||
tint = Color(0xFFFFFFD8)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -13,12 +13,15 @@ import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.LazyRow
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.material.MaterialTheme.colors
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
@@ -112,13 +115,13 @@ fun AppearanceScope.AppearanceLayout(
|
||||
}
|
||||
}
|
||||
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionDividerSpaced()
|
||||
ThemesSection(systemDarkTheme)
|
||||
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionDividerSpaced()
|
||||
ProfileImageSection()
|
||||
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_icon), padding = PaddingValues(horizontal = DEFAULT_PADDING_HALF)) {
|
||||
LazyRow {
|
||||
@@ -129,7 +132,8 @@ fun AppearanceScope.AppearanceLayout(
|
||||
contentDescription = "",
|
||||
contentScale = ContentScale.Fit,
|
||||
modifier = Modifier
|
||||
.shadow(if (item == icon.value) 1.dp else 0.dp, ambientColor = colors.secondaryVariant)
|
||||
.border(1.dp, color = if (item == icon.value) colors.secondaryVariant else Color.Transparent, RoundedCornerShape(percent = 22))
|
||||
.clip(RoundedCornerShape(percent = 22))
|
||||
.size(70.dp)
|
||||
.clickable { changeIcon(item) }
|
||||
.padding(10.dp)
|
||||
@@ -143,7 +147,7 @@ fun AppearanceScope.AppearanceLayout(
|
||||
}
|
||||
}
|
||||
|
||||
SectionDividerSpaced(maxBottomPadding = true)
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
FontScaleSection()
|
||||
|
||||
SectionBottomSpacer()
|
||||
|
||||
@@ -19,9 +19,9 @@ actual fun SettingsSectionApp(
|
||||
withAuth: (title: String, desc: String, block: () -> Unit) -> Unit
|
||||
) {
|
||||
SectionView(stringResource(MR.strings.settings_section_title_app)) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_restart_alt), stringResource(MR.strings.settings_restart_app), ::restartApp, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_power_settings_new), stringResource(MR.strings.settings_shutdown), { shutdownAppAlert(::shutdownApp) }, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_code), stringResource(MR.strings.settings_developer_tools), showSettingsModal { DeveloperView(it, showCustomModal, withAuth) }, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_restart_alt), stringResource(MR.strings.settings_restart_app), ::restartApp)
|
||||
SettingsActionItem(painterResource(MR.images.ic_power_settings_new), stringResource(MR.strings.settings_shutdown), { shutdownAppAlert(::shutdownApp) })
|
||||
SettingsActionItem(painterResource(MR.images.ic_code), stringResource(MR.strings.settings_developer_tools), showSettingsModal { DeveloperView(it, showCustomModal, withAuth) })
|
||||
AppVersionItem(showVersion)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.clipToBounds
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.unit.dp
|
||||
import chat.simplex.common.views.usersettings.SetDeliveryReceiptsView
|
||||
import chat.simplex.common.model.*
|
||||
@@ -50,6 +51,7 @@ data class SettingsViewState(
|
||||
|
||||
@Composable
|
||||
fun AppScreen() {
|
||||
AppBarHandler.appBarMaxHeightPx = with(LocalDensity.current) { AppBarHeight.roundToPx() }
|
||||
SimpleXTheme {
|
||||
ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
|
||||
Surface(color = MaterialTheme.colors.background, contentColor = LocalContentColor.current) {
|
||||
|
||||
@@ -28,9 +28,6 @@ interface PlatformInterface {
|
||||
fun androidRestartNetworkObserver() {}
|
||||
@Composable fun androidLockPortraitOrientation() {}
|
||||
suspend fun androidAskToAllowBackgroundCalls(): Boolean = true
|
||||
@Composable fun desktopScrollBarComponents(): Triple<Animatable<Float, AnimationVector1D>, Modifier, MutableState<Job>> = remember { Triple(Animatable(0f), Modifier, mutableStateOf(Job())) }
|
||||
@Composable fun desktopScrollBar(state: LazyListState, modifier: Modifier, scrollBarAlpha: Animatable<Float, AnimationVector1D>, scrollJob: MutableState<Job>, reversed: Boolean) {}
|
||||
@Composable fun desktopScrollBar(state: ScrollState, modifier: Modifier, scrollBarAlpha: Animatable<Float, AnimationVector1D>, scrollJob: MutableState<Job>, reversed: Boolean) {}
|
||||
@Composable fun desktopShowAppUpdateNotice() {}
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -30,6 +30,9 @@ expect fun windowOrientation(): WindowOrientation
|
||||
@Composable
|
||||
expect fun windowWidth(): Dp
|
||||
|
||||
@Composable
|
||||
expect fun windowHeight(): Dp
|
||||
|
||||
expect fun desktopExpandWindowToWidth(width: Dp)
|
||||
|
||||
expect fun isRtl(text: CharSequence): Boolean
|
||||
|
||||
@@ -13,7 +13,7 @@ import androidx.compose.ui.unit.dp
|
||||
@Composable
|
||||
expect fun LazyColumnWithScrollBar(
|
||||
modifier: Modifier = Modifier,
|
||||
state: LazyListState = rememberLazyListState(),
|
||||
state: LazyListState? = null,
|
||||
contentPadding: PaddingValues = PaddingValues(0.dp),
|
||||
reverseLayout: Boolean = false,
|
||||
verticalArrangement: Arrangement.Vertical =
|
||||
@@ -29,6 +29,8 @@ expect fun ColumnWithScrollBar(
|
||||
modifier: Modifier = Modifier,
|
||||
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
||||
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
|
||||
state: ScrollState = rememberScrollState(),
|
||||
state: ScrollState? = null,
|
||||
// set true when you want to show something in the center with respected .fillMaxSize()
|
||||
maxIntrinsicSize: Boolean = false,
|
||||
content: @Composable ColumnScope.() -> Unit
|
||||
)
|
||||
|
||||
@@ -607,6 +607,8 @@ val DEFAULT_SPACE_AFTER_ICON = 4.dp
|
||||
val DEFAULT_PADDING_HALF = DEFAULT_PADDING / 2
|
||||
val DEFAULT_BOTTOM_PADDING = 48.dp
|
||||
val DEFAULT_BOTTOM_BUTTON_PADDING = 20.dp
|
||||
val DEFAULT_MIN_SECTION_ITEM_HEIGHT = 50.dp
|
||||
val DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL = 15.dp
|
||||
|
||||
val DEFAULT_START_MODAL_WIDTH = 388.dp
|
||||
val DEFAULT_MIN_CENTER_MODAL_WIDTH = 590.dp
|
||||
|
||||
@@ -125,19 +125,13 @@ fun TerminalLayout(
|
||||
}
|
||||
}
|
||||
|
||||
private var lazyListState = 0 to 0
|
||||
|
||||
@Composable
|
||||
fun TerminalLog() {
|
||||
val listState = rememberLazyListState(lazyListState.first, lazyListState.second)
|
||||
DisposableEffect(Unit) {
|
||||
onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset }
|
||||
}
|
||||
val reversedTerminalItems by remember {
|
||||
derivedStateOf { chatModel.terminalItems.value.asReversed() }
|
||||
}
|
||||
val clipboard = LocalClipboardManager.current
|
||||
LazyColumnWithScrollBar(state = listState, reverseLayout = true) {
|
||||
LazyColumnWithScrollBar(reverseLayout = true) {
|
||||
items(reversedTerminalItems) { item ->
|
||||
val rhId = item.remoteHostId
|
||||
val rhIdStr = if (rhId == null) "" else "$rhId "
|
||||
|
||||
@@ -599,7 +599,7 @@ fun ChatInfoLayout(
|
||||
}
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
val conn = contact.activeConn
|
||||
if (conn != null) {
|
||||
@@ -616,7 +616,7 @@ fun ChatInfoLayout(
|
||||
ShareAddressButton { clipboard.shareText(simplexChatLink(contact.contactLink)) }
|
||||
SectionTextFooter(stringResource(MR.strings.you_can_share_this_address_with_your_contacts).format(contact.displayName))
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
}
|
||||
|
||||
if (contact.ready && contact.active) {
|
||||
@@ -650,7 +650,7 @@ fun ChatInfoLayout(
|
||||
}
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
}
|
||||
|
||||
SectionView {
|
||||
@@ -970,7 +970,7 @@ fun InfoViewActionButton(
|
||||
Icon(
|
||||
icon,
|
||||
contentDescription = null,
|
||||
Modifier.size(24.dp * fontSizeSqrtMultiplier),
|
||||
Modifier.size(22.dp * fontSizeSqrtMultiplier),
|
||||
tint = if (disabledLook) MaterialTheme.colors.secondary else MaterialTheme.colors.onPrimary
|
||||
)
|
||||
}
|
||||
|
||||
@@ -224,7 +224,7 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
|
||||
Row(
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.sizeIn(minHeight = 46.dp)
|
||||
.sizeIn(minHeight = DEFAULT_MIN_SECTION_ITEM_HEIGHT)
|
||||
.padding(PaddingValues(horizontal = DEFAULT_PADDING))
|
||||
.clickable { expanded.value = !expanded.value },
|
||||
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
||||
@@ -277,7 +277,6 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
|
||||
|
||||
@Composable
|
||||
fun HistoryTab() {
|
||||
// LALAL SCROLLBAR DOESN'T WORK
|
||||
ColumnWithScrollBar(Modifier.fillMaxWidth()) {
|
||||
Details()
|
||||
SectionDividerSpaced(maxTopPadding = false, maxBottomPadding = true)
|
||||
@@ -302,7 +301,6 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
|
||||
|
||||
@Composable
|
||||
fun QuoteTab(qi: CIQuote) {
|
||||
// LALAL SCROLLBAR DOESN'T WORK
|
||||
ColumnWithScrollBar(Modifier.fillMaxWidth()) {
|
||||
Details()
|
||||
SectionDividerSpaced(maxTopPadding = false, maxBottomPadding = true)
|
||||
@@ -316,7 +314,6 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
|
||||
|
||||
@Composable
|
||||
fun ForwardedFromTab(forwardedFromItem: AChatItem) {
|
||||
// LALAL SCROLLBAR DOESN'T WORK
|
||||
ColumnWithScrollBar(Modifier.fillMaxWidth()) {
|
||||
Details()
|
||||
SectionDividerSpaced(maxTopPadding = false, maxBottomPadding = true)
|
||||
@@ -379,7 +376,6 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
|
||||
|
||||
@Composable
|
||||
fun DeliveryTab(memberDeliveryStatuses: List<MemberDeliveryStatus>) {
|
||||
// LALAL SCROLLBAR DOESN'T WORK
|
||||
ColumnWithScrollBar(Modifier.fillMaxWidth()) {
|
||||
Details()
|
||||
SectionDividerSpaced(maxTopPadding = false, maxBottomPadding = true)
|
||||
|
||||
@@ -504,24 +504,34 @@ fun ChatView(staleChatId: State<String?>, onComposed: suspend (chatId: String) -
|
||||
}
|
||||
is ChatInfo.ContactConnection -> {
|
||||
val close = { chatModel.chatId.value = null }
|
||||
ModalView(close, showClose = appPlatform.isAndroid, content = {
|
||||
ContactConnectionInfoView(chatModel, chatRh, chatInfo.contactConnection.connReqInv, chatInfo.contactConnection, false, close)
|
||||
})
|
||||
LaunchedEffect(chatInfo.id) {
|
||||
onComposed(chatInfo.id)
|
||||
ModalManager.end.closeModals()
|
||||
chatModel.chatItems.clear()
|
||||
val handler = remember { AppBarHandler() }
|
||||
CompositionLocalProvider(
|
||||
LocalAppBarHandler provides handler
|
||||
) {
|
||||
ModalView(close, showClose = appPlatform.isAndroid, content = {
|
||||
ContactConnectionInfoView(chatModel, chatRh, chatInfo.contactConnection.connReqInv, chatInfo.contactConnection, false, close)
|
||||
})
|
||||
LaunchedEffect(chatInfo.id) {
|
||||
onComposed(chatInfo.id)
|
||||
ModalManager.end.closeModals()
|
||||
chatModel.chatItems.clear()
|
||||
}
|
||||
}
|
||||
}
|
||||
is ChatInfo.InvalidJSON -> {
|
||||
val close = { chatModel.chatId.value = null }
|
||||
ModalView(close, showClose = appPlatform.isAndroid, endButtons = { ShareButton { clipboard.shareText(chatInfo.json) } }, content = {
|
||||
InvalidJSONView(chatInfo.json)
|
||||
})
|
||||
LaunchedEffect(chatInfo.id) {
|
||||
onComposed(chatInfo.id)
|
||||
ModalManager.end.closeModals()
|
||||
chatModel.chatItems.clear()
|
||||
val handler = remember { AppBarHandler() }
|
||||
CompositionLocalProvider(
|
||||
LocalAppBarHandler provides handler
|
||||
) {
|
||||
ModalView(close, showClose = appPlatform.isAndroid, endButtons = { ShareButton { clipboard.shareText(chatInfo.json) } }, content = {
|
||||
InvalidJSONView(chatInfo.json)
|
||||
})
|
||||
LaunchedEffect(chatInfo.id) {
|
||||
onComposed(chatInfo.id)
|
||||
ModalManager.end.closeModals()
|
||||
chatModel.chatItems.clear()
|
||||
}
|
||||
}
|
||||
}
|
||||
else -> {}
|
||||
|
||||
@@ -93,22 +93,22 @@ private fun ContactPreferencesLayout(
|
||||
TimedMessagesFeatureSection(featuresAllowed, contact.mergedPreferences.timedMessages, timedMessages, onTTLUpdated) { allowed, ttl ->
|
||||
applyPrefs(featuresAllowed.copy(timedMessagesAllowed = allowed, timedMessagesTTL = ttl ?: currentFeaturesAllowed.timedMessagesTTL))
|
||||
}
|
||||
SectionDividerSpaced(true, maxBottomPadding = false)
|
||||
SectionDividerSpaced(true)
|
||||
val allowFullDeletion: MutableState<ContactFeatureAllowed> = remember(featuresAllowed) { mutableStateOf(featuresAllowed.fullDelete) }
|
||||
FeatureSection(ChatFeature.FullDelete, user.fullPreferences.fullDelete.allow, contact.mergedPreferences.fullDelete, allowFullDeletion) {
|
||||
applyPrefs(featuresAllowed.copy(fullDelete = it))
|
||||
}
|
||||
SectionDividerSpaced(true, maxBottomPadding = false)
|
||||
SectionDividerSpaced(true)
|
||||
val allowReactions: MutableState<ContactFeatureAllowed> = remember(featuresAllowed) { mutableStateOf(featuresAllowed.reactions) }
|
||||
FeatureSection(ChatFeature.Reactions, user.fullPreferences.reactions.allow, contact.mergedPreferences.reactions, allowReactions) {
|
||||
applyPrefs(featuresAllowed.copy(reactions = it))
|
||||
}
|
||||
SectionDividerSpaced(true, maxBottomPadding = false)
|
||||
SectionDividerSpaced(true)
|
||||
val allowVoice: MutableState<ContactFeatureAllowed> = remember(featuresAllowed) { mutableStateOf(featuresAllowed.voice) }
|
||||
FeatureSection(ChatFeature.Voice, user.fullPreferences.voice.allow, contact.mergedPreferences.voice, allowVoice) {
|
||||
applyPrefs(featuresAllowed.copy(voice = it))
|
||||
}
|
||||
SectionDividerSpaced(true, maxBottomPadding = false)
|
||||
SectionDividerSpaced(true)
|
||||
val allowCalls: MutableState<ContactFeatureAllowed> = remember(featuresAllowed) { mutableStateOf(featuresAllowed.calls) }
|
||||
FeatureSection(ChatFeature.Calls, user.fullPreferences.calls.allow, contact.mergedPreferences.calls, allowCalls) {
|
||||
applyPrefs(featuresAllowed.copy(calls = it))
|
||||
|
||||
@@ -66,7 +66,7 @@ fun SelectedItemsBottomToolbar(
|
||||
Icon(
|
||||
painterResource(MR.images.ic_delete),
|
||||
null,
|
||||
Modifier.size(24.dp),
|
||||
Modifier.size(22.dp),
|
||||
tint = if (!deleteEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error
|
||||
)
|
||||
}
|
||||
@@ -75,7 +75,7 @@ fun SelectedItemsBottomToolbar(
|
||||
Icon(
|
||||
painterResource(MR.images.ic_flag),
|
||||
null,
|
||||
Modifier.size(24.dp),
|
||||
Modifier.size(22.dp),
|
||||
tint = if (!moderateEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error
|
||||
)
|
||||
}
|
||||
@@ -84,7 +84,7 @@ fun SelectedItemsBottomToolbar(
|
||||
Icon(
|
||||
painterResource(MR.images.ic_share),
|
||||
null,
|
||||
Modifier.size(24.dp),
|
||||
Modifier.size(22.dp),
|
||||
tint = if (allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.primary
|
||||
)
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import SectionBottomSpacer
|
||||
import SectionCustomFooter
|
||||
import SectionDividerSpaced
|
||||
import SectionItemView
|
||||
import SectionItemViewWithoutMinPadding
|
||||
import SectionSpacer
|
||||
import SectionView
|
||||
import androidx.compose.foundation.*
|
||||
@@ -177,7 +178,7 @@ fun AddGroupMembersLayout(
|
||||
InviteSectionFooter(selectedContactsCount = selectedContacts.size, allowModifyMembers, clearSelection)
|
||||
}
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionView(stringResource(MR.strings.select_contacts)) {
|
||||
SectionView(stringResource(MR.strings.select_contacts).uppercase()) {
|
||||
SectionItemView(padding = PaddingValues(start = DEFAULT_PADDING, end = DEFAULT_PADDING_HALF)) {
|
||||
SearchRowView(searchText)
|
||||
}
|
||||
@@ -255,7 +256,8 @@ fun InviteSectionFooter(selectedContactsCount: Int, enabled: Boolean, clearSelec
|
||||
Text(
|
||||
String.format(generalGetString(MR.strings.num_contacts_selected), selectedContactsCount),
|
||||
color = MaterialTheme.colors.secondary,
|
||||
fontSize = 12.sp
|
||||
lineHeight = 18.sp,
|
||||
fontSize = 14.sp
|
||||
)
|
||||
Box(
|
||||
Modifier.clickable { if (enabled) clearSelection() }
|
||||
@@ -263,14 +265,16 @@ fun InviteSectionFooter(selectedContactsCount: Int, enabled: Boolean, clearSelec
|
||||
Text(
|
||||
stringResource(MR.strings.clear_contacts_selection_button),
|
||||
color = if (enabled) MaterialTheme.colors.primary else MaterialTheme.colors.secondary,
|
||||
fontSize = 12.sp
|
||||
lineHeight = 18.sp,
|
||||
fontSize = 14.sp,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
Text(
|
||||
stringResource(MR.strings.no_contacts_selected),
|
||||
color = MaterialTheme.colors.secondary,
|
||||
fontSize = 12.sp
|
||||
lineHeight = 18.sp,
|
||||
fontSize = 14.sp,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -318,7 +322,7 @@ fun ContactCheckRow(
|
||||
icon = painterResource(MR.images.ic_circle)
|
||||
iconColor = MaterialTheme.colors.secondary
|
||||
}
|
||||
SectionItemView(
|
||||
SectionItemViewWithoutMinPadding(
|
||||
click = if (enabled) {
|
||||
{
|
||||
if (prohibitedToInviteIncognito) {
|
||||
|
||||
@@ -284,7 +284,6 @@ fun GroupChatInfoLayout(
|
||||
if (s.isEmpty()) members else members.filter { m -> m.anyNameContains(s) }
|
||||
}
|
||||
}
|
||||
// LALAL strange scrolling
|
||||
LazyColumnWithScrollBar(
|
||||
Modifier
|
||||
.fillMaxWidth(),
|
||||
@@ -366,7 +365,7 @@ fun GroupChatInfoLayout(
|
||||
SearchRowView(searchText)
|
||||
}
|
||||
}
|
||||
SectionItemView(minHeight = 54.dp) {
|
||||
SectionItemView(minHeight = 54.dp, padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
|
||||
MemberRow(groupInfo.membership, user = true)
|
||||
}
|
||||
}
|
||||
@@ -374,7 +373,7 @@ fun GroupChatInfoLayout(
|
||||
items(filteredMembers.value) { member ->
|
||||
Divider()
|
||||
val showMenu = remember { mutableStateOf(false) }
|
||||
SectionItemViewLongClickable({ showMemberInfo(member) }, { showMenu.value = true }, minHeight = 54.dp) {
|
||||
SectionItemViewLongClickable({ showMemberInfo(member) }, { showMenu.value = true }, minHeight = 54.dp, padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
|
||||
DropDownMenuForMember(chat.remoteHostId, member, groupInfo, showMenu)
|
||||
MemberRow(member, onClick = { showMemberInfo(member) })
|
||||
}
|
||||
@@ -514,7 +513,7 @@ private fun MemberRow(member: GroupMember, user: Boolean = false, onClick: (() -
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
MemberProfileImage(size = 46.dp, member)
|
||||
MemberProfileImage(size = DEFAULT_MIN_SECTION_ITEM_HEIGHT, member)
|
||||
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
|
||||
Column {
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
|
||||
@@ -133,13 +133,7 @@ private fun GroupWelcomeLayout(
|
||||
val clipboard = LocalClipboardManager.current
|
||||
CopyTextButton { clipboard.setText(AnnotatedString(wt.value)) }
|
||||
|
||||
Divider(
|
||||
Modifier.padding(
|
||||
start = DEFAULT_PADDING_HALF,
|
||||
top = 8.dp,
|
||||
end = DEFAULT_PADDING_HALF,
|
||||
bottom = 8.dp)
|
||||
)
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
SaveButton(
|
||||
save = save,
|
||||
|
||||
@@ -185,7 +185,14 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf
|
||||
scaffoldState = scaffoldState,
|
||||
drawerContent = {
|
||||
tryOrShowError("Settings", error = { ErrorSettingsView() }) {
|
||||
SettingsView(chatModel, setPerformLA, scaffoldState.drawerState)
|
||||
val handler = remember { AppBarHandler() }
|
||||
CompositionLocalProvider(
|
||||
LocalAppBarHandler provides handler
|
||||
) {
|
||||
ModalView(showClose = appPlatform.isDesktop, close = { scope.launch { scaffoldState.drawerState.close() } }) {
|
||||
SettingsView(chatModel, setPerformLA, scaffoldState.drawerState)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
contentColor = LocalContentColor.current,
|
||||
@@ -212,7 +219,7 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf
|
||||
backgroundColor = if (!stopped) MaterialTheme.colors.primary else MaterialTheme.colors.secondary,
|
||||
contentColor = Color.White
|
||||
) {
|
||||
Icon(painterResource(MR.images.ic_edit_filled), stringResource(MR.strings.add_contact_or_create_group), Modifier.size(24.dp * fontSizeSqrtMultiplier))
|
||||
Icon(painterResource(MR.images.ic_edit_filled), stringResource(MR.strings.add_contact_or_create_group), Modifier.size(22.dp * fontSizeSqrtMultiplier))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -513,7 +520,7 @@ private fun ChatListSearchBar(listState: LazyListState, searchText: MutableState
|
||||
Icon(
|
||||
painterResource(MR.images.ic_search),
|
||||
contentDescription = null,
|
||||
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING_HALF).size(24.dp * fontSizeSqrtMultiplier),
|
||||
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING_HALF).size(22.dp * fontSizeSqrtMultiplier),
|
||||
tint = MaterialTheme.colors.secondary
|
||||
)
|
||||
SearchTextField(
|
||||
|
||||
@@ -546,15 +546,19 @@ fun XFTPServerSummaryLayout(summary: XFTPServerSummary, statsStartedAt: Instant,
|
||||
}) {
|
||||
Text(generalGetString(MR.strings.open_server_settings_button))
|
||||
}
|
||||
if (summary.stats != null || summary.sessions != null) {
|
||||
SectionDividerSpaced()
|
||||
}
|
||||
}
|
||||
|
||||
if (summary.stats != null) {
|
||||
SectionDividerSpaced()
|
||||
XFTPStatsView(stats = summary.stats, rh = rh, statsStartedAt = statsStartedAt)
|
||||
if (summary.sessions != null) {
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
}
|
||||
}
|
||||
|
||||
if (summary.sessions != null) {
|
||||
SectionDividerSpaced()
|
||||
ServerSessionsView(summary.sessions)
|
||||
}
|
||||
}
|
||||
@@ -581,20 +585,24 @@ fun SMPServerSummaryLayout(summary: SMPServerSummary, statsStartedAt: Instant, r
|
||||
}) {
|
||||
Text(generalGetString(MR.strings.open_server_settings_button))
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
}
|
||||
|
||||
if (summary.stats != null) {
|
||||
SectionDividerSpaced()
|
||||
SMPStatsView(stats = summary.stats, remoteHostInfo = rh, statsStartedAt = statsStartedAt)
|
||||
if (summary.subs != null || summary.sessions != null) {
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
}
|
||||
}
|
||||
|
||||
if (summary.subs != null) {
|
||||
SectionDividerSpaced()
|
||||
SMPSubscriptionsSection(subs = summary.subs, summary = summary, rh = rh)
|
||||
if (summary.sessions != null) {
|
||||
SectionDividerSpaced()
|
||||
}
|
||||
}
|
||||
|
||||
if (summary.sessions != null) {
|
||||
SectionDividerSpaced()
|
||||
ServerSessionsView(summary.sessions)
|
||||
}
|
||||
}
|
||||
@@ -615,14 +623,12 @@ fun ModalData.SMPServerSummaryView(
|
||||
ColumnWithScrollBar(
|
||||
Modifier.fillMaxSize(),
|
||||
) {
|
||||
Box(contentAlignment = Alignment.Center) {
|
||||
val bottomPadding = DEFAULT_PADDING
|
||||
AppBarTitle(
|
||||
stringResource(MR.strings.smp_server),
|
||||
hostDevice(rh?.remoteHostId),
|
||||
bottomPadding = bottomPadding
|
||||
)
|
||||
}
|
||||
val bottomPadding = DEFAULT_PADDING
|
||||
AppBarTitle(
|
||||
stringResource(MR.strings.smp_server),
|
||||
hostDevice(rh?.remoteHostId),
|
||||
bottomPadding = bottomPadding
|
||||
)
|
||||
SMPServerSummaryLayout(summary, statsStartedAt, rh)
|
||||
}
|
||||
}
|
||||
@@ -709,7 +715,7 @@ fun ModalData.XFTPServerSummaryView(
|
||||
|
||||
@Composable
|
||||
fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableState<PresentedServersSummary?>) {
|
||||
Column(
|
||||
ColumnWithScrollBar(
|
||||
Modifier.fillMaxSize(),
|
||||
) {
|
||||
var showUserSelection by remember { mutableStateOf(false) }
|
||||
@@ -760,14 +766,12 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
|
||||
Column(
|
||||
Modifier.fillMaxSize(),
|
||||
) {
|
||||
Box(contentAlignment = Alignment.Center) {
|
||||
val bottomPadding = DEFAULT_PADDING
|
||||
AppBarTitle(
|
||||
stringResource(MR.strings.servers_info),
|
||||
hostDevice(rh?.remoteHostId),
|
||||
bottomPadding = bottomPadding
|
||||
)
|
||||
}
|
||||
val bottomPadding = DEFAULT_PADDING
|
||||
AppBarTitle(
|
||||
stringResource(MR.strings.servers_info),
|
||||
hostDevice(rh?.remoteHostId),
|
||||
bottomPadding = bottomPadding
|
||||
)
|
||||
if (serversSummary.value == null) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
@@ -827,7 +831,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
|
||||
verticalAlignment = Alignment.Top,
|
||||
userScrollEnabled = appPlatform.isAndroid
|
||||
) { index ->
|
||||
ColumnWithScrollBar(
|
||||
Column(
|
||||
Modifier
|
||||
.fillMaxSize(),
|
||||
verticalArrangement = Arrangement.Top
|
||||
@@ -858,7 +862,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
|
||||
val statsStartedAt = it.statsStartedAt
|
||||
|
||||
SMPStatsView(totals.stats, statsStartedAt, rh)
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SMPSubscriptionsSection(totals)
|
||||
SectionDividerSpaced()
|
||||
|
||||
@@ -890,7 +894,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
|
||||
footer = generalGetString(MR.strings.servers_info_proxied_servers_section_footer),
|
||||
rh = rh
|
||||
)
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
}
|
||||
|
||||
ServerSessionsView(totals.sessions)
|
||||
@@ -907,7 +911,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
|
||||
val previouslyUsedXFTPServers = xftpSummary.previouslyUsedXFTPServers
|
||||
|
||||
XFTPStatsView(totals.stats, statsStartedAt, rh)
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
|
||||
if (currentlyUsedXFTPServers.isNotEmpty()) {
|
||||
XFTPServersListView(
|
||||
@@ -934,7 +938,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
|
||||
}
|
||||
}
|
||||
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
SectionView {
|
||||
ReconnectAllServersButton(rh)
|
||||
|
||||
@@ -262,7 +262,7 @@ fun UserProfilePickerItem(
|
||||
Row(
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.sizeIn(minHeight = 46.dp)
|
||||
.sizeIn(minHeight = DEFAULT_MIN_SECTION_ITEM_HEIGHT)
|
||||
.combinedClickable(
|
||||
enabled = enabled,
|
||||
onClick = if (u.activeUser) openSettings else onClick,
|
||||
@@ -330,7 +330,7 @@ fun RemoteHostPickerItem(h: RemoteHostInfo, onLongClick: () -> Unit = {}, action
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.background(color = if (h.activeHost) MaterialTheme.colors.surface.mixWith(MaterialTheme.colors.onBackground, 0.95f) else Color.Unspecified)
|
||||
.sizeIn(minHeight = 46.dp)
|
||||
.sizeIn(minHeight = DEFAULT_MIN_SECTION_ITEM_HEIGHT)
|
||||
.combinedClickable(
|
||||
onClick = onClick,
|
||||
onLongClick = onLongClick
|
||||
@@ -373,7 +373,7 @@ fun LocalDevicePickerItem(active: Boolean, onLongClick: () -> Unit = {}, onClick
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.background(color = if (active) MaterialTheme.colors.surface.mixWith(MaterialTheme.colors.onBackground, 0.95f) else Color.Unspecified)
|
||||
.sizeIn(minHeight = 46.dp)
|
||||
.sizeIn(minHeight = DEFAULT_MIN_SECTION_ITEM_HEIGHT)
|
||||
.combinedClickable(
|
||||
onClick = if (active) {{}} else onClick,
|
||||
onLongClick = onLongClick,
|
||||
|
||||
@@ -107,101 +107,104 @@ fun DatabaseEncryptionLayout(
|
||||
migration: Boolean,
|
||||
onConfirmEncrypt: () -> Unit,
|
||||
) {
|
||||
val (scrollBarAlpha, scrollModifier, scrollJob) = platform.desktopScrollBarComponents()
|
||||
val scrollState = rememberScrollState()
|
||||
Column(
|
||||
if (!migration) Modifier.fillMaxWidth().verticalScroll(scrollState).then(if (appPlatform.isDesktop) scrollModifier else Modifier) else Modifier.fillMaxWidth(),
|
||||
) {
|
||||
if (!migration) {
|
||||
AppBarTitle(stringResource(MR.strings.database_passphrase))
|
||||
} else {
|
||||
ChatStoppedView()
|
||||
SectionSpacer()
|
||||
}
|
||||
SectionView(if (migration) generalGetString(MR.strings.database_passphrase).uppercase() else null) {
|
||||
SavePassphraseSetting(
|
||||
useKeychain.value,
|
||||
initialRandomDBPassphrase.value,
|
||||
storedKey.value,
|
||||
enabled = (!initialRandomDBPassphrase.value && !progressIndicator.value) || migration
|
||||
) { checked ->
|
||||
if (checked) {
|
||||
setUseKeychain(true, useKeychain, migration)
|
||||
} else if (storedKey.value && !migration) {
|
||||
// Don't show in migration process since it will remove the key after successful encryption
|
||||
removePassphraseAlert {
|
||||
removePassphraseFromKeyChain(useKeychain, storedKey, false)
|
||||
}
|
||||
} else {
|
||||
setUseKeychain(false, useKeychain, migration)
|
||||
}
|
||||
@Composable
|
||||
fun Layout() {
|
||||
Column {
|
||||
if (!migration) {
|
||||
AppBarTitle(stringResource(MR.strings.database_passphrase))
|
||||
} else {
|
||||
ChatStoppedView()
|
||||
SectionSpacer()
|
||||
}
|
||||
SectionView(if (migration) generalGetString(MR.strings.database_passphrase).uppercase() else null) {
|
||||
SavePassphraseSetting(
|
||||
useKeychain.value,
|
||||
initialRandomDBPassphrase.value,
|
||||
storedKey.value,
|
||||
enabled = (!initialRandomDBPassphrase.value && !progressIndicator.value) || migration
|
||||
) { checked ->
|
||||
if (checked) {
|
||||
setUseKeychain(true, useKeychain, migration)
|
||||
} else if (storedKey.value && !migration) {
|
||||
// Don't show in migration process since it will remove the key after successful encryption
|
||||
removePassphraseAlert {
|
||||
removePassphraseFromKeyChain(useKeychain, storedKey, false)
|
||||
}
|
||||
} else {
|
||||
setUseKeychain(false, useKeychain, migration)
|
||||
}
|
||||
}
|
||||
|
||||
if (!initialRandomDBPassphrase.value && chatDbEncrypted == true) {
|
||||
PassphraseField(
|
||||
currentKey,
|
||||
generalGetString(MR.strings.current_passphrase),
|
||||
modifier = Modifier.padding(horizontal = DEFAULT_PADDING),
|
||||
isValid = ::validKey,
|
||||
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
|
||||
)
|
||||
}
|
||||
|
||||
if (!initialRandomDBPassphrase.value && chatDbEncrypted == true) {
|
||||
PassphraseField(
|
||||
currentKey,
|
||||
generalGetString(MR.strings.current_passphrase),
|
||||
newKey,
|
||||
generalGetString(MR.strings.new_passphrase),
|
||||
modifier = Modifier.padding(horizontal = DEFAULT_PADDING),
|
||||
showStrength = true,
|
||||
isValid = ::validKey,
|
||||
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
|
||||
)
|
||||
}
|
||||
|
||||
PassphraseField(
|
||||
newKey,
|
||||
generalGetString(MR.strings.new_passphrase),
|
||||
modifier = Modifier.padding(horizontal = DEFAULT_PADDING),
|
||||
showStrength = true,
|
||||
isValid = ::validKey,
|
||||
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
|
||||
)
|
||||
val onClickUpdate = {
|
||||
// Don't do things concurrently. Shouldn't be here concurrently, just in case
|
||||
if (!progressIndicator.value) {
|
||||
if (currentKey.value == "") {
|
||||
if (useKeychain.value)
|
||||
encryptDatabaseSavedAlert(onConfirmEncrypt)
|
||||
else
|
||||
encryptDatabaseAlert(onConfirmEncrypt)
|
||||
} else {
|
||||
if (useKeychain.value)
|
||||
changeDatabaseKeySavedAlert(onConfirmEncrypt)
|
||||
else
|
||||
changeDatabaseKeyAlert(onConfirmEncrypt)
|
||||
val onClickUpdate = {
|
||||
// Don't do things concurrently. Shouldn't be here concurrently, just in case
|
||||
if (!progressIndicator.value) {
|
||||
if (currentKey.value == "") {
|
||||
if (useKeychain.value)
|
||||
encryptDatabaseSavedAlert(onConfirmEncrypt)
|
||||
else
|
||||
encryptDatabaseAlert(onConfirmEncrypt)
|
||||
} else {
|
||||
if (useKeychain.value)
|
||||
changeDatabaseKeySavedAlert(onConfirmEncrypt)
|
||||
else
|
||||
changeDatabaseKeyAlert(onConfirmEncrypt)
|
||||
}
|
||||
}
|
||||
}
|
||||
val disabled = currentKey.value == newKey.value ||
|
||||
newKey.value != confirmNewKey.value ||
|
||||
newKey.value.isEmpty() ||
|
||||
!validKey(currentKey.value) ||
|
||||
!validKey(newKey.value) ||
|
||||
progressIndicator.value
|
||||
|
||||
PassphraseField(
|
||||
confirmNewKey,
|
||||
generalGetString(MR.strings.confirm_new_passphrase),
|
||||
modifier = Modifier.padding(horizontal = DEFAULT_PADDING),
|
||||
isValid = { confirmNewKey.value == "" || newKey.value == confirmNewKey.value },
|
||||
keyboardActions = KeyboardActions(onDone = {
|
||||
if (!disabled) onClickUpdate()
|
||||
defaultKeyboardAction(ImeAction.Done)
|
||||
}),
|
||||
)
|
||||
|
||||
SectionItemViewSpaceBetween(onClickUpdate, disabled = disabled, minHeight = TextFieldDefaults.MinHeight) {
|
||||
Text(generalGetString(if (migration) MR.strings.set_passphrase else MR.strings.update_database_passphrase), color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
val disabled = currentKey.value == newKey.value ||
|
||||
newKey.value != confirmNewKey.value ||
|
||||
newKey.value.isEmpty() ||
|
||||
!validKey(currentKey.value) ||
|
||||
!validKey(newKey.value) ||
|
||||
progressIndicator.value
|
||||
|
||||
PassphraseField(
|
||||
confirmNewKey,
|
||||
generalGetString(MR.strings.confirm_new_passphrase),
|
||||
modifier = Modifier.padding(horizontal = DEFAULT_PADDING),
|
||||
isValid = { confirmNewKey.value == "" || newKey.value == confirmNewKey.value },
|
||||
keyboardActions = KeyboardActions(onDone = {
|
||||
if (!disabled) onClickUpdate()
|
||||
defaultKeyboardAction(ImeAction.Done)
|
||||
}),
|
||||
)
|
||||
|
||||
SectionItemViewSpaceBetween(onClickUpdate, disabled = disabled, minHeight = TextFieldDefaults.MinHeight) {
|
||||
Text(generalGetString(if (migration) MR.strings.set_passphrase else MR.strings.update_database_passphrase), color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary)
|
||||
Column {
|
||||
DatabaseEncryptionFooter(useKeychain, chatDbEncrypted, storedKey, initialRandomDBPassphrase, migration)
|
||||
}
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
|
||||
Column {
|
||||
DatabaseEncryptionFooter(useKeychain, chatDbEncrypted, storedKey, initialRandomDBPassphrase, migration)
|
||||
}
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
if (appPlatform.isDesktop && !migration) {
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
platform.desktopScrollBar(scrollState, Modifier.align(Alignment.CenterEnd).fillMaxHeight(), scrollBarAlpha, scrollJob, false)
|
||||
if (migration) {
|
||||
Column(Modifier.fillMaxWidth()) {
|
||||
Layout()
|
||||
}
|
||||
} else {
|
||||
ColumnWithScrollBar(Modifier.fillMaxWidth(), maxIntrinsicSize = true) {
|
||||
Layout()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@ fun DatabaseLayout(
|
||||
stringResource(MR.strings.stop_chat_to_enable_database_actions)
|
||||
}
|
||||
)
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
}
|
||||
|
||||
SectionView(stringResource(MR.strings.chat_database_section)) {
|
||||
@@ -264,7 +264,7 @@ fun DatabaseLayout(
|
||||
disabled = operationsDisabled
|
||||
)
|
||||
}
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.files_and_media_section).uppercase()) {
|
||||
val deleteFilesDisabled = operationsDisabled || appFilesCountAndSize.value.first == 0
|
||||
|
||||
@@ -6,59 +6,90 @@ import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.geometry.Offset
|
||||
import androidx.compose.ui.graphics.Brush
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.desktop.ui.tooling.preview.Preview
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.ui.draw.*
|
||||
import androidx.compose.ui.graphics.*
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.*
|
||||
import chat.simplex.common.platform.appPlatform
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
@Composable
|
||||
fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Color = if (close != null) MaterialTheme.colors.primary else MaterialTheme.colors.secondary, arrangement: Arrangement.Vertical = Arrangement.Top, closeBarTitle: String? = null, barPaddingValues: PaddingValues = PaddingValues(horizontal = AppBarHorizontalPadding), endButtons: @Composable RowScope.() -> Unit = {}) {
|
||||
var rowModifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(AppBarHeight * fontSizeSqrtMultiplier)
|
||||
|
||||
val themeBackgroundMix = MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.97f)
|
||||
if (!closeBarTitle.isNullOrEmpty()) {
|
||||
rowModifier = rowModifier.background(MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.97f))
|
||||
rowModifier = rowModifier.background(themeBackgroundMix)
|
||||
}
|
||||
val handler = LocalAppBarHandler.current
|
||||
val connection = LocalAppBarHandler.current?.connection
|
||||
val title = remember(handler?.title?.value) { handler?.title ?: mutableStateOf("") }
|
||||
|
||||
Column(
|
||||
verticalArrangement = arrangement,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.heightIn(min = AppBarHeight * fontSizeSqrtMultiplier)
|
||||
.drawWithCache {
|
||||
val backgroundColor = if (appPlatform.isDesktop && connection != null) themeBackgroundMix.copy(alpha = topTitleAlpha(connection)) else Color.Transparent
|
||||
onDrawBehind {
|
||||
if (appPlatform.isDesktop) {
|
||||
drawRect(backgroundColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.padding(barPaddingValues),
|
||||
content = {
|
||||
Row(
|
||||
rowModifier,
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
if (showClose) {
|
||||
if (showClose) {
|
||||
NavigationButtonBack(tintColor = tintColor, onButtonClicked = close)
|
||||
} else {
|
||||
Spacer(Modifier)
|
||||
}
|
||||
if (!closeBarTitle.isNullOrEmpty()) {
|
||||
Row(
|
||||
Modifier.weight(1f),
|
||||
horizontalArrangement = Arrangement.Center,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Text(
|
||||
closeBarTitle,
|
||||
color = MaterialTheme.colors.onBackground,
|
||||
fontWeight = FontWeight.SemiBold,
|
||||
maxLines = 1
|
||||
)
|
||||
}
|
||||
} else if (title.value.isNotEmpty() && connection != null) {
|
||||
Row(
|
||||
Modifier
|
||||
.padding(start = if (showClose) 0.dp else DEFAULT_PADDING_HALF)
|
||||
.weight(1f) // hides the title if something wants full width (eg, search field in chat profiles screen)
|
||||
.graphicsLayer {
|
||||
alpha = topTitleAlpha((connection))
|
||||
}
|
||||
.padding(start = 4.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Text(
|
||||
title.value,
|
||||
fontWeight = FontWeight.SemiBold,
|
||||
maxLines = 1
|
||||
)
|
||||
}
|
||||
} else {
|
||||
Spacer(Modifier.weight(1f))
|
||||
}
|
||||
Row {
|
||||
endButtons()
|
||||
@@ -66,11 +97,24 @@ fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Co
|
||||
}
|
||||
}
|
||||
)
|
||||
if (closeBarTitle.isNullOrEmpty() && title.value.isNotEmpty() && connection != null) {
|
||||
Divider(
|
||||
Modifier
|
||||
.graphicsLayer {
|
||||
alpha = topTitleAlpha(connection)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun AppBarTitle(title: String, hostDevice: Pair<Long?, String>? = null, withPadding: Boolean = true, bottomPadding: Dp = DEFAULT_PADDING * 1.5f + 8.dp) {
|
||||
val handler = LocalAppBarHandler.current
|
||||
val connection = handler?.connection
|
||||
LaunchedEffect(title) {
|
||||
handler?.title?.value = title
|
||||
}
|
||||
val theme = CurrentColors.collectAsState()
|
||||
val titleColor = MaterialTheme.appColors.title
|
||||
val brush = if (theme.value.base == DefaultTheme.SIMPLEX)
|
||||
@@ -81,23 +125,37 @@ fun AppBarTitle(title: String, hostDevice: Pair<Long?, String>? = null, withPad
|
||||
Text(
|
||||
title,
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(start = if (withPadding) DEFAULT_PADDING else 0.dp, end = if (withPadding) DEFAULT_PADDING else 0.dp,),
|
||||
.padding(start = if (withPadding) DEFAULT_PADDING else 0.dp, top = DEFAULT_PADDING_HALF, end = if (withPadding) DEFAULT_PADDING else 0.dp,)
|
||||
.graphicsLayer {
|
||||
alpha = bottomTitleAlpha(connection)
|
||||
},
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
style = MaterialTheme.typography.h1.copy(brush = brush),
|
||||
color = MaterialTheme.colors.primaryVariant,
|
||||
textAlign = TextAlign.Center
|
||||
textAlign = TextAlign.Start
|
||||
)
|
||||
if (hostDevice != null) {
|
||||
HostDeviceTitle(hostDevice)
|
||||
Box(Modifier.padding(start = if (withPadding) DEFAULT_PADDING else 0.dp, end = if (withPadding) DEFAULT_PADDING else 0.dp).graphicsLayer {
|
||||
alpha = bottomTitleAlpha(connection)
|
||||
}) {
|
||||
HostDeviceTitle(hostDevice)
|
||||
}
|
||||
}
|
||||
Spacer(Modifier.height(bottomPadding))
|
||||
}
|
||||
}
|
||||
|
||||
private fun topTitleAlpha(connection: CollapsingAppBarNestedScrollConnection) =
|
||||
if (connection.appBarOffset.absoluteValue < AppBarHandler.appBarMaxHeightPx / 3) 0f
|
||||
else ((-connection.appBarOffset * 1.5f) / (AppBarHandler.appBarMaxHeightPx)).coerceIn(0f, 1f)
|
||||
|
||||
private fun bottomTitleAlpha(connection: CollapsingAppBarNestedScrollConnection?) =
|
||||
if ((connection?.appBarOffset ?: 0f).absoluteValue < AppBarHandler.appBarMaxHeightPx / 3) 1f
|
||||
else ((AppBarHandler.appBarMaxHeightPx) + (connection?.appBarOffset ?: 0f) / 1.5f).coerceAtLeast(0f) / AppBarHandler.appBarMaxHeightPx
|
||||
|
||||
@Composable
|
||||
private fun HostDeviceTitle(hostDevice: Pair<Long?, String>, extraPadding: Boolean = false) {
|
||||
Row(Modifier.fillMaxWidth().padding(top = 5.dp, bottom = if (extraPadding) DEFAULT_PADDING * 2 else DEFAULT_PADDING_HALF), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center) {
|
||||
Row(Modifier.fillMaxWidth().padding(top = 5.dp, bottom = if (extraPadding) DEFAULT_PADDING * 2 else DEFAULT_PADDING_HALF), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start) {
|
||||
Icon(painterResource(if (hostDevice.first == null) MR.images.ic_desktop else MR.images.ic_smartphone_300), null, Modifier.size(15.dp), tint = MaterialTheme.colors.secondary)
|
||||
Spacer(Modifier.width(10.dp))
|
||||
Text(hostDevice.second, color = MaterialTheme.colors.secondary)
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package chat.simplex.common.views.helpers
|
||||
|
||||
import androidx.compose.foundation.ScrollState
|
||||
import androidx.compose.foundation.lazy.LazyListState
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.geometry.Offset
|
||||
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
|
||||
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
|
||||
import androidx.compose.ui.unit.Velocity
|
||||
|
||||
val LocalAppBarHandler: ProvidableCompositionLocal<AppBarHandler?> = staticCompositionLocalOf { null }
|
||||
|
||||
@Stable
|
||||
class AppBarHandler(
|
||||
listState: LazyListState = LazyListState(0, 0),
|
||||
scrollState: ScrollState = ScrollState(initial = 0)
|
||||
) {
|
||||
val title = mutableStateOf("")
|
||||
var listState by mutableStateOf(listState, structuralEqualityPolicy())
|
||||
internal set
|
||||
|
||||
var scrollState by mutableStateOf(scrollState, structuralEqualityPolicy())
|
||||
internal set
|
||||
|
||||
val connection = CollapsingAppBarNestedScrollConnection()
|
||||
|
||||
companion object {
|
||||
var appBarMaxHeightPx: Int = 0
|
||||
}
|
||||
}
|
||||
|
||||
class CollapsingAppBarNestedScrollConnection(): NestedScrollConnection {
|
||||
var appBarOffset: Float by mutableFloatStateOf(0f)
|
||||
|
||||
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
|
||||
appBarOffset += available.y
|
||||
return Offset(0f, 0f)
|
||||
}
|
||||
|
||||
override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
|
||||
appBarOffset -= available.y
|
||||
return Offset(x = 0f, 0f)
|
||||
}
|
||||
}
|
||||
@@ -25,9 +25,9 @@ fun DefaultSwitch(
|
||||
)
|
||||
) {
|
||||
val color = if (checked) MaterialTheme.colors.primary.copy(alpha = 0.3f) else MaterialTheme.colors.secondary.copy(alpha = 0.3f)
|
||||
val size = with(LocalDensity.current) { Size(46.dp.toPx(), 28.dp.toPx()) }
|
||||
val offset = with(LocalDensity.current) { Offset(1.dp.toPx(), 10.dp.toPx()) }
|
||||
val radius = with(LocalDensity.current) { 28.dp.toPx() }
|
||||
val size = with(LocalDensity.current) { Size(40.dp.toPx(), 26.dp.toPx()) }
|
||||
val offset = with(LocalDensity.current) { Offset(4.dp.toPx(), 11.dp.toPx()) }
|
||||
val radius = with(LocalDensity.current) { 13.dp.toPx() }
|
||||
Switch(
|
||||
checked = checked,
|
||||
onCheckedChange = onCheckedChange,
|
||||
|
||||
@@ -50,7 +50,7 @@ fun <T> ExposedDropDownSetting(
|
||||
)
|
||||
Spacer(Modifier.size(12.dp))
|
||||
Icon(
|
||||
if (!expanded.value) painterResource(MR.images.ic_expand_more) else painterResource(MR.images.ic_expand_less),
|
||||
if (!expanded.value) painterResource(MR.images.ic_arrow_drop_down) else painterResource(MR.images.ic_arrow_drop_up),
|
||||
generalGetString(MR.strings.icon_descr_more_button),
|
||||
tint = MaterialTheme.colors.secondary
|
||||
)
|
||||
|
||||
@@ -2,11 +2,12 @@ package chat.simplex.common.views.helpers
|
||||
|
||||
import androidx.compose.animation.*
|
||||
import androidx.compose.animation.core.*
|
||||
import androidx.compose.foundation.ScrollState
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.LazyListState
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import chat.simplex.common.model.ChatController.appPrefs
|
||||
@@ -48,13 +49,15 @@ enum class ModalPlacement {
|
||||
START, CENTER, END, FULLSCREEN
|
||||
}
|
||||
|
||||
class ModalData {
|
||||
class ModalData() {
|
||||
private val state = mutableMapOf<String, MutableState<Any?>>()
|
||||
fun <T> stateGetOrPut (key: String, default: () -> T): MutableState<T> =
|
||||
state.getOrPut(key) { mutableStateOf(default() as Any) } as MutableState<T>
|
||||
|
||||
fun <T> stateGetOrPutNullable (key: String, default: () -> T?): MutableState<T?> =
|
||||
state.getOrPut(key) { mutableStateOf(default() as Any?) } as MutableState<T?>
|
||||
|
||||
val appBarHandler = AppBarHandler()
|
||||
}
|
||||
|
||||
class ModalManager(private val placement: ModalPlacement? = null) {
|
||||
@@ -139,7 +142,13 @@ class ModalManager(private val placement: ModalPlacement? = null) {
|
||||
fun showInView() {
|
||||
// Without animation
|
||||
if (modalCount.value > 0 && modalViews.lastOrNull()?.first == false) {
|
||||
modalViews.lastOrNull()?.let { it.third(it.second, ::closeModal) }
|
||||
modalViews.lastOrNull()?.let {
|
||||
CompositionLocalProvider(
|
||||
LocalAppBarHandler provides it.second.appBarHandler
|
||||
) {
|
||||
it.third(it.second, ::closeModal)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
AnimatedContent(targetState = modalCount.value,
|
||||
@@ -151,7 +160,13 @@ class ModalManager(private val placement: ModalPlacement? = null) {
|
||||
}.using(SizeTransform(clip = false))
|
||||
}
|
||||
) {
|
||||
modalViews.getOrNull(it - 1)?.let { it.third(it.second, ::closeModal) }
|
||||
modalViews.getOrNull(it - 1)?.let {
|
||||
CompositionLocalProvider(
|
||||
LocalAppBarHandler provides it.second.appBarHandler
|
||||
) {
|
||||
it.third(it.second, ::closeModal)
|
||||
}
|
||||
}
|
||||
// This is needed because if we delete from modalViews immediately on request, animation will be bad
|
||||
if (toRemove.isNotEmpty() && it == modalCount.value && transition.currentState == EnterExitState.Visible && !transition.isRunning) {
|
||||
runAtomically { toRemove.removeIf { elem -> modalViews.removeAt(elem); true } }
|
||||
|
||||
@@ -12,7 +12,6 @@ import androidx.compose.ui.text.AnnotatedString
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.*
|
||||
import chat.simplex.common.model.NotificationsMode
|
||||
import chat.simplex.common.platform.onRightClick
|
||||
import chat.simplex.common.platform.windowWidth
|
||||
import chat.simplex.common.ui.theme.*
|
||||
@@ -20,7 +19,6 @@ import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.common.views.onboarding.SelectableCard
|
||||
import chat.simplex.common.views.usersettings.SettingsActionItemWithContent
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
|
||||
@Composable
|
||||
fun SectionView(title: String? = null, padding: PaddingValues = PaddingValues(), content: (@Composable ColumnScope.() -> Unit)) {
|
||||
@@ -28,7 +26,7 @@ fun SectionView(title: String? = null, padding: PaddingValues = PaddingValues(),
|
||||
if (title != null) {
|
||||
Text(
|
||||
title, color = MaterialTheme.colors.secondary, style = MaterialTheme.typography.body2,
|
||||
modifier = Modifier.padding(start = DEFAULT_PADDING, bottom = 5.dp), fontSize = 12.sp
|
||||
modifier = Modifier.padding(start = DEFAULT_PADDING, bottom = DEFAULT_PADDING), fontSize = 12.sp
|
||||
)
|
||||
}
|
||||
Column(Modifier.padding(padding).fillMaxWidth()) { content() }
|
||||
@@ -101,13 +99,13 @@ fun <T> SectionViewSelectableCards(
|
||||
@Composable
|
||||
fun SectionItemView(
|
||||
click: (() -> Unit)? = null,
|
||||
minHeight: Dp = 46.dp,
|
||||
minHeight: Dp = DEFAULT_MIN_SECTION_ITEM_HEIGHT,
|
||||
disabled: Boolean = false,
|
||||
extraPadding: Boolean = false,
|
||||
padding: PaddingValues = if (extraPadding)
|
||||
PaddingValues(start = DEFAULT_PADDING * 1.7f, end = DEFAULT_PADDING)
|
||||
PaddingValues(start = DEFAULT_PADDING * 1.7f, end = DEFAULT_PADDING, top = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL, bottom = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL)
|
||||
else
|
||||
PaddingValues(horizontal = DEFAULT_PADDING),
|
||||
PaddingValues(horizontal = DEFAULT_PADDING, vertical = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL),
|
||||
content: (@Composable RowScope.() -> Unit)
|
||||
) {
|
||||
val modifier = Modifier
|
||||
@@ -122,10 +120,9 @@ fun SectionItemView(
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SectionItemViewLongClickable(
|
||||
click: () -> Unit,
|
||||
longClick: () -> Unit,
|
||||
minHeight: Dp = 46.dp,
|
||||
fun SectionItemViewWithoutMinPadding(
|
||||
click: (() -> Unit)? = null,
|
||||
minHeight: Dp = DEFAULT_MIN_SECTION_ITEM_HEIGHT,
|
||||
disabled: Boolean = false,
|
||||
extraPadding: Boolean = false,
|
||||
padding: PaddingValues = if (extraPadding)
|
||||
@@ -133,6 +130,22 @@ fun SectionItemViewLongClickable(
|
||||
else
|
||||
PaddingValues(horizontal = DEFAULT_PADDING),
|
||||
content: (@Composable RowScope.() -> Unit)
|
||||
) {
|
||||
SectionItemView(click, minHeight, disabled, extraPadding, padding, content)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SectionItemViewLongClickable(
|
||||
click: () -> Unit,
|
||||
longClick: () -> Unit,
|
||||
minHeight: Dp = DEFAULT_MIN_SECTION_ITEM_HEIGHT,
|
||||
disabled: Boolean = false,
|
||||
extraPadding: Boolean = false,
|
||||
padding: PaddingValues = if (extraPadding)
|
||||
PaddingValues(start = DEFAULT_PADDING * 1.7f, end = DEFAULT_PADDING, top = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL, bottom = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL)
|
||||
else
|
||||
PaddingValues(horizontal = DEFAULT_PADDING, vertical = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL),
|
||||
content: (@Composable RowScope.() -> Unit)
|
||||
) {
|
||||
val modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
@@ -149,30 +162,11 @@ fun SectionItemViewLongClickable(
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SectionItemViewWithIcon(
|
||||
click: (() -> Unit)? = null,
|
||||
minHeight: Dp = 46.dp,
|
||||
disabled: Boolean = false,
|
||||
padding: PaddingValues = PaddingValues(start = DEFAULT_PADDING * 1.7f, end = DEFAULT_PADDING),
|
||||
content: (@Composable RowScope.() -> Unit)
|
||||
) {
|
||||
val modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.sizeIn(minHeight = minHeight)
|
||||
Row(
|
||||
if (click == null || disabled) modifier.padding(padding) else modifier.clickable(onClick = click).padding(padding),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SectionItemViewSpaceBetween(
|
||||
click: (() -> Unit)? = null,
|
||||
onLongClick: (() -> Unit)? = null,
|
||||
minHeight: Dp = 46.dp,
|
||||
minHeight: Dp = DEFAULT_MIN_SECTION_ITEM_HEIGHT,
|
||||
padding: PaddingValues = PaddingValues(horizontal = DEFAULT_PADDING),
|
||||
disabled: Boolean = false,
|
||||
content: (@Composable RowScope.() -> Unit)
|
||||
@@ -181,7 +175,7 @@ fun SectionItemViewSpaceBetween(
|
||||
.fillMaxWidth()
|
||||
.sizeIn(minHeight = minHeight)
|
||||
Row(
|
||||
if (click == null || disabled) modifier.padding(padding) else modifier
|
||||
if (click == null || disabled) modifier.padding(padding).padding(vertical = DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL) else modifier
|
||||
.combinedClickable(onClick = click, onLongClick = onLongClick).padding(padding)
|
||||
.onRightClick { onLongClick?.invoke() },
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
@@ -254,9 +248,9 @@ fun SectionDividerSpaced(maxTopPadding: Boolean = false, maxBottomPadding: Boole
|
||||
Divider(
|
||||
Modifier.padding(
|
||||
start = DEFAULT_PADDING_HALF,
|
||||
top = if (maxTopPadding) 37.dp else 27.dp,
|
||||
top = if (maxTopPadding) DEFAULT_PADDING + 18.dp else DEFAULT_PADDING + 2.dp,
|
||||
end = DEFAULT_PADDING_HALF,
|
||||
bottom = if (maxBottomPadding) 37.dp else 27.dp)
|
||||
bottom = if (maxBottomPadding) DEFAULT_PADDING + 18.dp else DEFAULT_PADDING + 2.dp)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package chat.simplex.common.views.helpers
|
||||
|
||||
import SectionBottomSpacer
|
||||
import SectionDividerSpaced
|
||||
import SectionItemView
|
||||
import SectionSpacer
|
||||
import SectionView
|
||||
@@ -203,11 +204,12 @@ fun ModalData.UserWallpaperEditor(
|
||||
}
|
||||
)
|
||||
|
||||
SectionSpacer()
|
||||
SectionDividerSpaced()
|
||||
|
||||
AppearanceScope.CustomizeThemeColorsSection(currentTheme, editColor = editColor)
|
||||
|
||||
SectionSpacer()
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
ImportExportThemeSection(null, remember { chatModel.currentUser }.value?.uiThemes) {
|
||||
withBGApi {
|
||||
themeModeOverride.value = it
|
||||
@@ -440,11 +442,11 @@ fun ModalData.ChatWallpaperEditor(
|
||||
}
|
||||
)
|
||||
|
||||
SectionSpacer()
|
||||
SectionDividerSpaced()
|
||||
|
||||
AppearanceScope.CustomizeThemeColorsSection(currentTheme, editColor = editColor)
|
||||
|
||||
SectionSpacer()
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
ImportExportThemeSection(themeModeOverride.value, remember { chatModel.currentUser }.value?.uiThemes) {
|
||||
withBGApi {
|
||||
themeModeOverride.value = it
|
||||
|
||||
@@ -4,7 +4,7 @@ import SectionBottomSpacer
|
||||
import SectionSpacer
|
||||
import SectionTextFooter
|
||||
import SectionView
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.*
|
||||
@@ -17,7 +17,6 @@ import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.model.ChatController.appPrefs
|
||||
import chat.simplex.common.model.ChatController.getNetCfg
|
||||
import chat.simplex.common.model.ChatController.startChat
|
||||
import chat.simplex.common.model.ChatController.startChatWithTemporaryDatabase
|
||||
@@ -147,20 +146,13 @@ private fun MigrateFromDeviceLayout(
|
||||
) {
|
||||
val tempDatabaseFile = rememberSaveable { mutableStateOf(fileForTemporaryDatabase()) }
|
||||
|
||||
val (scrollBarAlpha, scrollModifier, scrollJob) = platform.desktopScrollBarComponents()
|
||||
val scrollState = rememberScrollState()
|
||||
Column(
|
||||
Modifier.fillMaxSize().verticalScroll(scrollState).then(if (appPlatform.isDesktop) scrollModifier else Modifier).height(IntrinsicSize.Max),
|
||||
ColumnWithScrollBar(
|
||||
Modifier.fillMaxSize(), maxIntrinsicSize = true
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.migrate_from_device_title))
|
||||
SectionByState(migrationState, tempDatabaseFile.value, chatReceiver)
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
if (appPlatform.isDesktop) {
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
platform.desktopScrollBar(scrollState, Modifier.align(Alignment.CenterEnd).fillMaxHeight(), scrollBarAlpha, scrollJob, false)
|
||||
}
|
||||
}
|
||||
platform.androidLockPortraitOrientation()
|
||||
}
|
||||
|
||||
|
||||
@@ -155,20 +155,13 @@ private fun ModalData.MigrateToDeviceLayout(
|
||||
close: () -> Unit,
|
||||
) {
|
||||
val tempDatabaseFile = rememberSaveable { mutableStateOf(fileForTemporaryDatabase()) }
|
||||
val (scrollBarAlpha, scrollModifier, scrollJob) = platform.desktopScrollBarComponents()
|
||||
val scrollState = rememberScrollState()
|
||||
Column(
|
||||
Modifier.fillMaxSize().verticalScroll(scrollState).then(if (appPlatform.isDesktop) scrollModifier else Modifier).height(IntrinsicSize.Max),
|
||||
ColumnWithScrollBar(
|
||||
Modifier.fillMaxSize(), maxIntrinsicSize = true
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.migrate_to_device_title))
|
||||
SectionByState(migrationState, tempDatabaseFile.value, chatReceiver, close)
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
if (appPlatform.isDesktop) {
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
platform.desktopScrollBar(scrollState, Modifier.align(Alignment.CenterEnd).fillMaxHeight(), scrollBarAlpha, scrollJob, false)
|
||||
}
|
||||
}
|
||||
platform.androidLockPortraitOrientation()
|
||||
}
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ private fun ContactConnectionInfoLayout(
|
||||
}
|
||||
SectionTextFooter(sharedProfileInfo(chatModel, contactConnection.incognito))
|
||||
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false)
|
||||
|
||||
DeleteButton(deleteConnection)
|
||||
|
||||
|
||||
@@ -68,10 +68,10 @@ fun NewChatSheet(rh: RemoteHostInfo?, close: () -> Unit) {
|
||||
Column(modifier = Modifier.fillMaxSize()) {
|
||||
NewChatSheetLayout(
|
||||
addContact = {
|
||||
ModalManager.start.showModalCloseable { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = closeAll ) }
|
||||
ModalManager.start.showModalCloseable(endButtons = { AddContactLearnMoreButton() }) { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = closeAll ) }
|
||||
},
|
||||
scanPaste = {
|
||||
ModalManager.start.showModalCloseable { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, close = closeAll) }
|
||||
ModalManager.start.showModalCloseable(endButtons = { AddContactLearnMoreButton() }) { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, close = closeAll) }
|
||||
},
|
||||
createGroup = {
|
||||
ModalManager.start.showCustomModal { close -> AddGroupView(chatModel, chatModel.currentRemoteHost.value, close, closeAll) }
|
||||
@@ -194,7 +194,15 @@ private fun NewChatSheetLayout(
|
||||
(appPlatform.isAndroid && keyboardState == KeyboardState.Opened)
|
||||
) {
|
||||
0
|
||||
} else if (listState.firstVisibleItemIndex == 0) offsetMultiplier * listState.firstVisibleItemScrollOffset else offsetMultiplier * 1000
|
||||
} else if (oneHandUI.value && listState.firstVisibleItemIndex == 0) {
|
||||
listState.firstVisibleItemScrollOffset
|
||||
} else if (!oneHandUI.value && listState.firstVisibleItemIndex == 0) {
|
||||
0
|
||||
} else if (!oneHandUI.value && listState.firstVisibleItemIndex == 1) {
|
||||
-listState.firstVisibleItemScrollOffset
|
||||
} else {
|
||||
offsetMultiplier * 1000
|
||||
}
|
||||
} else {
|
||||
0
|
||||
}
|
||||
@@ -254,13 +262,13 @@ private fun NewChatSheetLayout(
|
||||
}
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
val deletedContactTypes = listOf(ContactType.CHAT_DELETED)
|
||||
val deletedChats by remember(chatModel.chats.value, deletedContactTypes) {
|
||||
derivedStateOf { filterContactTypes(chatModel.chats.value, deletedContactTypes) }
|
||||
}
|
||||
if (deletedChats.isNotEmpty()) {
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
Row(modifier = sectionModifier) {
|
||||
SectionView {
|
||||
SectionItemView(
|
||||
@@ -287,16 +295,20 @@ private fun NewChatSheetLayout(
|
||||
}
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
item {
|
||||
if (filteredContactChats.isNotEmpty() && !oneHandUI.value) {
|
||||
if (searchText.value.text.isNotEmpty()) {
|
||||
Spacer(Modifier.height(DEFAULT_PADDING))
|
||||
} else {
|
||||
SectionDividerSpaced()
|
||||
}
|
||||
Text(
|
||||
stringResource(MR.strings.contact_list_header_title).uppercase(), color = MaterialTheme.colors.secondary, style = MaterialTheme.typography.body2,
|
||||
modifier = sectionModifier.padding(start = DEFAULT_PADDING, top = DEFAULT_PADDING_HALF, bottom = DEFAULT_PADDING_HALF), fontSize = 12.sp
|
||||
modifier = sectionModifier.padding(start = DEFAULT_PADDING, bottom = DEFAULT_PADDING_HALF), fontSize = 12.sp
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -356,7 +368,7 @@ private fun ContactsSearchBar(
|
||||
Icon(
|
||||
painterResource(MR.images.ic_search),
|
||||
contentDescription = null,
|
||||
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING_HALF).size(24.dp * fontSizeSqrtMultiplier),
|
||||
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING_HALF).size(22.dp * fontSizeSqrtMultiplier),
|
||||
tint = MaterialTheme.colors.secondary
|
||||
)
|
||||
SearchTextField(
|
||||
|
||||
@@ -5,6 +5,7 @@ import SectionItemView
|
||||
import SectionTextFooter
|
||||
import SectionView
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.gestures.scrollBy
|
||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.pager.HorizontalPager
|
||||
@@ -96,66 +97,61 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
Modifier.fillMaxSize(),
|
||||
) {
|
||||
Box(contentAlignment = Alignment.Center) {
|
||||
val bottomPadding = DEFAULT_PADDING
|
||||
AppBarTitle(stringResource(MR.strings.new_chat), hostDevice(rh?.remoteHostId), bottomPadding = bottomPadding)
|
||||
Column(Modifier.align(Alignment.CenterEnd).padding(bottom = bottomPadding, end = DEFAULT_PADDING)) {
|
||||
AddContactLearnMoreButton()
|
||||
BoxWithConstraints {
|
||||
ColumnWithScrollBar {
|
||||
AppBarTitle(stringResource(MR.strings.new_chat), hostDevice(rh?.remoteHostId), bottomPadding = DEFAULT_PADDING)
|
||||
val scope = rememberCoroutineScope()
|
||||
val pagerState = rememberPagerState(
|
||||
initialPage = selection.value.ordinal,
|
||||
initialPageOffsetFraction = 0f
|
||||
) { NewChatOption.values().size }
|
||||
KeyChangeEffect(pagerState.currentPage) {
|
||||
selection.value = NewChatOption.values()[pagerState.currentPage]
|
||||
}
|
||||
}
|
||||
val scope = rememberCoroutineScope()
|
||||
val pagerState = rememberPagerState(
|
||||
initialPage = selection.value.ordinal,
|
||||
initialPageOffsetFraction = 0f
|
||||
) { NewChatOption.values().size }
|
||||
KeyChangeEffect(pagerState.currentPage) {
|
||||
selection.value = NewChatOption.values()[pagerState.currentPage]
|
||||
}
|
||||
TabRow(
|
||||
selectedTabIndex = pagerState.currentPage,
|
||||
backgroundColor = Color.Transparent,
|
||||
contentColor = MaterialTheme.colors.primary,
|
||||
) {
|
||||
tabTitles.forEachIndexed { index, it ->
|
||||
LeadingIconTab(
|
||||
selected = pagerState.currentPage == index,
|
||||
onClick = {
|
||||
scope.launch {
|
||||
pagerState.animateScrollToPage(index)
|
||||
}
|
||||
},
|
||||
text = { Text(it, fontSize = 13.sp) },
|
||||
icon = {
|
||||
Icon(
|
||||
if (NewChatOption.INVITE.ordinal == index) painterResource(MR.images.ic_repeat_one) else painterResource(MR.images.ic_qr_code),
|
||||
it
|
||||
)
|
||||
},
|
||||
selectedContentColor = MaterialTheme.colors.primary,
|
||||
unselectedContentColor = MaterialTheme.colors.secondary,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
HorizontalPager(state = pagerState, Modifier.fillMaxSize(), verticalAlignment = Alignment.Top, userScrollEnabled = appPlatform.isAndroid) { index ->
|
||||
// LALAL SCROLLBAR DOESN'T WORK
|
||||
ColumnWithScrollBar(
|
||||
Modifier
|
||||
.fillMaxSize(),
|
||||
verticalArrangement = if (index == NewChatOption.INVITE.ordinal && connReqInvitation.isEmpty()) Arrangement.Center else Arrangement.Top) {
|
||||
Spacer(Modifier.height(DEFAULT_PADDING))
|
||||
when (index) {
|
||||
NewChatOption.INVITE.ordinal -> {
|
||||
PrepareAndInviteView(rh?.remoteHostId, contactConnection, connReqInvitation, creatingConnReq)
|
||||
}
|
||||
NewChatOption.CONNECT.ordinal -> {
|
||||
ConnectView(rh?.remoteHostId, showQRCodeScanner, pastedLink, close)
|
||||
}
|
||||
TabRow(
|
||||
selectedTabIndex = pagerState.currentPage,
|
||||
backgroundColor = Color.Transparent,
|
||||
contentColor = MaterialTheme.colors.primary,
|
||||
) {
|
||||
tabTitles.forEachIndexed { index, it ->
|
||||
LeadingIconTab(
|
||||
selected = pagerState.currentPage == index,
|
||||
onClick = {
|
||||
scope.launch {
|
||||
pagerState.animateScrollToPage(index)
|
||||
}
|
||||
},
|
||||
text = { Text(it, fontSize = 13.sp) },
|
||||
icon = {
|
||||
Icon(
|
||||
if (NewChatOption.INVITE.ordinal == index) painterResource(MR.images.ic_repeat_one) else painterResource(MR.images.ic_qr_code),
|
||||
it
|
||||
)
|
||||
},
|
||||
selectedContentColor = MaterialTheme.colors.primary,
|
||||
unselectedContentColor = MaterialTheme.colors.secondary,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
HorizontalPager(state = pagerState, Modifier, pageNestedScrollConnection = LocalAppBarHandler.current!!.connection, verticalAlignment = Alignment.Top, userScrollEnabled = appPlatform.isAndroid) { index ->
|
||||
Column(
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.heightIn(min = this@BoxWithConstraints.maxHeight - 150.dp),
|
||||
verticalArrangement = if (index == NewChatOption.INVITE.ordinal && connReqInvitation.isEmpty()) Arrangement.Center else Arrangement.Top
|
||||
) {
|
||||
Spacer(Modifier.height(DEFAULT_PADDING))
|
||||
when (index) {
|
||||
NewChatOption.INVITE.ordinal -> {
|
||||
PrepareAndInviteView(rh?.remoteHostId, contactConnection, connReqInvitation, creatingConnReq)
|
||||
}
|
||||
NewChatOption.CONNECT.ordinal -> {
|
||||
ConnectView(rh?.remoteHostId, showQRCodeScanner, pastedLink, close)
|
||||
}
|
||||
}
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -228,18 +224,18 @@ private fun InviteView(rhId: Long?, connReqInvitation: String, contactConnection
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AddContactLearnMoreButton() {
|
||||
fun AddContactLearnMoreButton() {
|
||||
IconButton(
|
||||
{
|
||||
ModalManager.start.showModalCloseable { close ->
|
||||
AddContactLearnMore(close)
|
||||
}
|
||||
},
|
||||
Modifier.size(18.dp * fontSizeSqrtMultiplier)
|
||||
}
|
||||
) {
|
||||
Icon(
|
||||
painterResource(MR.images.ic_info),
|
||||
stringResource(MR.strings.learn_more),
|
||||
tint = MaterialTheme.colors.primary
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -297,7 +293,7 @@ private fun PasteLinkView(rhId: Long?, pastedLink: MutableState<String>, showQRC
|
||||
@Composable
|
||||
fun LinkTextView(link: String, share: Boolean) {
|
||||
val clipboard = LocalClipboardManager.current
|
||||
Row(Modifier.fillMaxWidth().heightIn(min = 46.dp).padding(horizontal = DEFAULT_PADDING), verticalAlignment = Alignment.CenterVertically) {
|
||||
Row(Modifier.fillMaxWidth().heightIn(min = DEFAULT_MIN_SECTION_ITEM_HEIGHT).padding(horizontal = DEFAULT_PADDING), verticalAlignment = Alignment.CenterVertically) {
|
||||
Box(Modifier.weight(1f).clickable {
|
||||
chatModel.markShowingInvitationUsed()
|
||||
clipboard.shareText(link)
|
||||
|
||||
@@ -23,9 +23,10 @@ import dev.icerock.moko.resources.StringResource
|
||||
|
||||
@Composable
|
||||
fun HowItWorks(user: User?, onboardingStage: SharedPreference<OnboardingStage>? = null) {
|
||||
ColumnWithScrollBar(Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(DEFAULT_PADDING),
|
||||
ColumnWithScrollBar(
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(DEFAULT_PADDING),
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.how_simplex_works), withPadding = false)
|
||||
ReadableText(MR.strings.many_people_asked_how_can_it_deliver)
|
||||
|
||||
@@ -446,7 +446,7 @@ fun IntSettingRow(title: String, selection: MutableState<Int>, values: List<Int>
|
||||
)
|
||||
Spacer(Modifier.size(4.dp))
|
||||
Icon(
|
||||
if (!expanded.value) painterResource(MR.images.ic_expand_more) else painterResource(MR.images.ic_expand_less),
|
||||
if (!expanded.value) painterResource(MR.images.ic_arrow_drop_down) else painterResource(MR.images.ic_arrow_drop_up),
|
||||
generalGetString(MR.strings.invite_to_group_button),
|
||||
modifier = Modifier.padding(start = 8.dp),
|
||||
tint = MaterialTheme.colors.secondary
|
||||
@@ -506,7 +506,7 @@ fun TimeoutSettingRow(title: String, selection: MutableState<Long>, values: List
|
||||
)
|
||||
Spacer(Modifier.size(4.dp))
|
||||
Icon(
|
||||
if (!expanded.value) painterResource(MR.images.ic_expand_more) else painterResource(MR.images.ic_expand_less),
|
||||
if (!expanded.value) painterResource(MR.images.ic_arrow_drop_down) else painterResource(MR.images.ic_arrow_drop_up),
|
||||
generalGetString(MR.strings.invite_to_group_button),
|
||||
modifier = Modifier.padding(start = 8.dp),
|
||||
tint = MaterialTheme.colors.secondary
|
||||
|
||||
@@ -549,13 +549,13 @@ object AppearanceScope {
|
||||
},
|
||||
)
|
||||
}
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionDividerSpaced()
|
||||
|
||||
CustomizeThemeColorsSection(currentTheme) { name ->
|
||||
editColor(name)
|
||||
}
|
||||
|
||||
SectionSpacer()
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
val currentOverrides = remember(currentTheme) { ThemeManager.defaultActiveTheme(appPrefs.themeOverrides.get()) }
|
||||
val canResetColors = currentTheme.base.hasChangedAnyColor(currentOverrides)
|
||||
@@ -889,7 +889,7 @@ object AppearanceScope {
|
||||
val hexTrimmed = currentColor.toReadableHex().replaceFirst("#ff", "#")
|
||||
val savedColor by remember(wallpaperType) { mutableStateOf(initialColor) }
|
||||
|
||||
Row(Modifier.padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF).height(46.dp)) {
|
||||
Row(Modifier.padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF).height(DEFAULT_MIN_SECTION_ITEM_HEIGHT)) {
|
||||
Box(Modifier.weight(1f).fillMaxHeight().background(savedColor).clickable {
|
||||
currentColor = savedColor
|
||||
onColorChange(currentColor)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package chat.simplex.common.views.usersettings
|
||||
|
||||
import SectionBottomSpacer
|
||||
import SectionDividerSpaced
|
||||
import SectionSpacer
|
||||
import SectionTextFooter
|
||||
import SectionView
|
||||
@@ -43,7 +44,7 @@ fun DeveloperView(
|
||||
)
|
||||
}
|
||||
if (devTools.value) {
|
||||
SectionSpacer()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionView(stringResource(MR.strings.developer_options_section).uppercase()) {
|
||||
SettingsPreferenceItem(painterResource(MR.images.ic_drive_folder_upload), stringResource(MR.strings.confirm_database_upgrades), m.controller.appPrefs.confirmDBUpgrades)
|
||||
if (appPlatform.isDesktop) {
|
||||
|
||||
@@ -3,6 +3,7 @@ package chat.simplex.common.views.usersettings
|
||||
import SectionBottomSpacer
|
||||
import SectionItemView
|
||||
import SectionItemViewSpaceBetween
|
||||
import SectionItemViewWithoutMinPadding
|
||||
import SectionSpacer
|
||||
import SectionTextFooter
|
||||
import SectionView
|
||||
@@ -74,10 +75,10 @@ private fun HiddenProfileLayout(
|
||||
val confirmValid by remember { derivedStateOf { confirmHidePassword.value == "" || hidePassword.value == confirmHidePassword.value } }
|
||||
val saveDisabled by remember { derivedStateOf { hidePassword.value == "" || !passwordValid || confirmHidePassword.value == "" || !confirmValid } }
|
||||
SectionView(stringResource(MR.strings.hidden_profile_password).uppercase()) {
|
||||
SectionItemView {
|
||||
SectionItemViewWithoutMinPadding {
|
||||
PassphraseField(hidePassword, generalGetString(MR.strings.password_to_show), isValid = { passwordValid }, showStrength = true)
|
||||
}
|
||||
SectionItemView {
|
||||
SectionItemViewWithoutMinPadding {
|
||||
PassphraseField(confirmHidePassword, stringResource(MR.strings.confirm_password), isValid = { confirmValid }, dependsOn = hidePassword)
|
||||
}
|
||||
SectionItemViewSpaceBetween({ saveProfilePassword(hidePassword.value) }, disabled = saveDisabled, minHeight = TextFieldDefaults.MinHeight) {
|
||||
|
||||
@@ -264,30 +264,26 @@ fun SocksProxySettings(
|
||||
.fillMaxWidth()
|
||||
) {
|
||||
AppBarTitle(generalGetString(MR.strings.network_socks_proxy_settings))
|
||||
SectionView {
|
||||
SectionItemView {
|
||||
DefaultConfigurableTextField(
|
||||
hostUnsaved,
|
||||
stringResource(MR.strings.host_verb),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
isValid = ::validHost,
|
||||
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
|
||||
keyboardType = KeyboardType.Text,
|
||||
)
|
||||
}
|
||||
SectionItemView {
|
||||
DefaultConfigurableTextField(
|
||||
portUnsaved,
|
||||
stringResource(MR.strings.port_verb),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
isValid = ::validPort,
|
||||
keyboardActions = KeyboardActions(onDone = { defaultKeyboardAction(ImeAction.Done); save() }),
|
||||
keyboardType = KeyboardType.Number,
|
||||
)
|
||||
}
|
||||
SectionView(padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
|
||||
DefaultConfigurableTextField(
|
||||
hostUnsaved,
|
||||
stringResource(MR.strings.host_verb),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
isValid = ::validHost,
|
||||
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
|
||||
keyboardType = KeyboardType.Text,
|
||||
)
|
||||
DefaultConfigurableTextField(
|
||||
portUnsaved,
|
||||
stringResource(MR.strings.port_verb),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
isValid = ::validPort,
|
||||
keyboardActions = KeyboardActions(onDone = { defaultKeyboardAction(ImeAction.Done); save() }),
|
||||
keyboardType = KeyboardType.Number,
|
||||
)
|
||||
}
|
||||
|
||||
Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 27.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp))
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
|
||||
SectionView {
|
||||
SectionItemView({
|
||||
|
||||
@@ -104,13 +104,13 @@ fun PrivacySettingsView(
|
||||
}
|
||||
SettingsPreferenceItem(painterResource(MR.images.ic_security), stringResource(MR.strings.protect_ip_address), chatModel.controller.appPrefs.privacyAskToApproveRelays)
|
||||
}
|
||||
SectionCustomFooter {
|
||||
SectionTextFooter(
|
||||
if (chatModel.controller.appPrefs.privacyAskToApproveRelays.state.value) {
|
||||
Text(stringResource(MR.strings.app_will_ask_to_confirm_unknown_file_servers))
|
||||
stringResource(MR.strings.app_will_ask_to_confirm_unknown_file_servers)
|
||||
} else {
|
||||
Text(stringResource(MR.strings.without_tor_or_vpn_ip_address_will_be_visible_to_file_servers))
|
||||
stringResource(MR.strings.without_tor_or_vpn_ip_address_will_be_visible_to_file_servers)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
val currentUser = chatModel.currentUser.value
|
||||
if (currentUser != null) {
|
||||
|
||||
@@ -110,7 +110,7 @@ private fun PresetServer(
|
||||
)
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionDividerSpaced()
|
||||
UseServerSection(true, testing, server, testServer, onUpdate, onDelete)
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ private fun CustomServer(
|
||||
}
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
UseServerSection(valid.value, testing, server, testServer, onUpdate, onDelete)
|
||||
|
||||
if (valid.value) {
|
||||
|
||||
@@ -73,33 +73,30 @@ private fun SetDeliveryReceiptsLayout(
|
||||
skip: () -> Unit,
|
||||
userCount: Int,
|
||||
) {
|
||||
// This view located in the left panel which means it has to have a padding from right side in order
|
||||
// to see scroll bar. And this padding should be applied to upper element, not scrollable column modifier
|
||||
val endPadding = if (appPlatform.isDesktop) 56.dp else 0.dp
|
||||
val (scrollBarAlpha, scrollModifier, scrollJob) = platform.desktopScrollBarComponents()
|
||||
val scrollState = rememberScrollState()
|
||||
Column(
|
||||
Modifier.fillMaxSize().verticalScroll(scrollState).then(if (appPlatform.isDesktop) scrollModifier else Modifier).padding(top = DEFAULT_PADDING, end = endPadding),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.delivery_receipts_title))
|
||||
Box(Modifier.padding(top = DEFAULT_PADDING, end = endPadding)) {
|
||||
ColumnWithScrollBar(
|
||||
Modifier.fillMaxSize(),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.delivery_receipts_title))
|
||||
|
||||
Spacer(Modifier.weight(1f))
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
EnableReceiptsButton(enableReceipts)
|
||||
if (userCount > 1) {
|
||||
TextBelowButton(stringResource(MR.strings.sending_delivery_receipts_will_be_enabled_all_profiles))
|
||||
} else {
|
||||
TextBelowButton(stringResource(MR.strings.sending_delivery_receipts_will_be_enabled))
|
||||
}
|
||||
EnableReceiptsButton(enableReceipts)
|
||||
if (userCount > 1) {
|
||||
TextBelowButton(stringResource(MR.strings.sending_delivery_receipts_will_be_enabled_all_profiles))
|
||||
} else {
|
||||
TextBelowButton(stringResource(MR.strings.sending_delivery_receipts_will_be_enabled))
|
||||
}
|
||||
|
||||
Spacer(Modifier.weight(1f))
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
SkipButton(skip)
|
||||
SkipButton(skip)
|
||||
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
if (appPlatform.isDesktop) {
|
||||
Box(Modifier.fillMaxSize().padding(end = endPadding)) {
|
||||
platform.desktopScrollBar(scrollState, Modifier.align(Alignment.CenterEnd).fillMaxHeight(), scrollBarAlpha, scrollJob, false)
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package chat.simplex.common.views.usersettings
|
||||
import SectionBottomSpacer
|
||||
import SectionDividerSpaced
|
||||
import SectionItemView
|
||||
import SectionItemViewWithIcon
|
||||
import SectionView
|
||||
import TextIconSpaced
|
||||
import androidx.compose.desktop.ui.tooling.preview.Preview
|
||||
@@ -111,85 +110,73 @@ fun SettingsLayout(
|
||||
}
|
||||
val theme = CurrentColors.collectAsState()
|
||||
val uriHandler = LocalUriHandler.current
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
ColumnWithScrollBar(
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
.themedBackground(theme.value.base)
|
||||
.padding(top = if (appPlatform.isAndroid) DEFAULT_PADDING else DEFAULT_PADDING * 2.8f)
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.your_settings))
|
||||
ColumnWithScrollBar(
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
.themedBackground(theme.value.base)
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.your_settings))
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_you)) {
|
||||
val profileHidden = rememberSaveable { mutableStateOf(false) }
|
||||
if (profile != null) {
|
||||
SectionItemView(showCustomModal { chatModel, close -> UserProfileView(chatModel, close) }, 80.dp, padding = PaddingValues(start = 16.dp, end = DEFAULT_PADDING), disabled = stopped) {
|
||||
ProfilePreview(profile, stopped = stopped)
|
||||
}
|
||||
SettingsActionItem(painterResource(MR.images.ic_manage_accounts), stringResource(MR.strings.your_chat_profiles), { withAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { showSettingsModalWithSearch { it, search -> UserProfilesView(it, search, profileHidden, drawerState) } } }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_qr_code), stringResource(MR.strings.your_simplex_contact_address), showCustomModal { it, close -> UserAddressView(it, shareViaProfile = it.currentUser.value!!.addressShared, close = close) }, disabled = stopped, extraPadding = true)
|
||||
ChatPreferencesItem(showCustomModal, stopped = stopped)
|
||||
} else if (chatModel.localUserCreated.value == false) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_manage_accounts), stringResource(MR.strings.create_chat_profile), { withAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { ModalManager.center.showModalCloseable { close ->
|
||||
LaunchedEffect(Unit) {
|
||||
closeSettings()
|
||||
SectionView(stringResource(MR.strings.settings_section_title_you)) {
|
||||
val profileHidden = rememberSaveable { mutableStateOf(false) }
|
||||
if (profile != null) {
|
||||
SectionItemView(showCustomModal { chatModel, close -> UserProfileView(chatModel, close) }, 80.dp, padding = PaddingValues(start = 16.dp, end = DEFAULT_PADDING), disabled = stopped) {
|
||||
ProfilePreview(profile, stopped = stopped)
|
||||
}
|
||||
SettingsActionItem(painterResource(MR.images.ic_manage_accounts), stringResource(MR.strings.your_chat_profiles), { withAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { showSettingsModalWithSearch { it, search -> UserProfilesView(it, search, profileHidden, drawerState) } } }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_qr_code), stringResource(MR.strings.your_simplex_contact_address), showCustomModal { it, close -> UserAddressView(it, shareViaProfile = it.currentUser.value!!.addressShared, close = close) }, disabled = stopped)
|
||||
ChatPreferencesItem(showCustomModal, stopped = stopped)
|
||||
} else if (chatModel.localUserCreated.value == false) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_manage_accounts), stringResource(MR.strings.create_chat_profile), {
|
||||
withAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) {
|
||||
ModalManager.center.showModalCloseable { close ->
|
||||
LaunchedEffect(Unit) {
|
||||
closeSettings()
|
||||
}
|
||||
CreateProfile(chatModel, close)
|
||||
}
|
||||
CreateProfile(chatModel, close)
|
||||
} } }, disabled = stopped, extraPadding = true)
|
||||
}
|
||||
if (appPlatform.isDesktop) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_smartphone), stringResource(if (remember { chatModel.remoteHosts }.isEmpty()) MR.strings.link_a_mobile else MR.strings.linked_mobiles), showModal { ConnectMobileView() }, disabled = stopped, extraPadding = true)
|
||||
} else {
|
||||
SettingsActionItem(painterResource(MR.images.ic_desktop), stringResource(MR.strings.settings_section_title_use_from_desktop), showCustomModal{ it, close -> ConnectDesktopView(close) }, disabled = stopped, extraPadding = true)
|
||||
}
|
||||
SettingsActionItem(painterResource(MR.images.ic_ios_share), stringResource(MR.strings.migrate_from_device_to_another_device), { withAuth(generalGetString(MR.strings.auth_open_migration_to_another_device), generalGetString(MR.strings.auth_log_in_using_credential)) { ModalManager.fullscreen.showCustomModal { close -> MigrateFromDeviceView(close) } }}, disabled = stopped, extraPadding = true)
|
||||
}
|
||||
}, disabled = stopped)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_settings)) {
|
||||
SettingsActionItem(painterResource(if (notificationsMode.value == NotificationsMode.OFF) MR.images.ic_bolt_off else MR.images.ic_bolt), stringResource(MR.strings.notifications), showSettingsModal { NotificationsSettingsView(it) }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_wifi_tethering), stringResource(MR.strings.network_and_servers), showSettingsModal { NetworkAndServersView() }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_videocam), stringResource(MR.strings.settings_audio_video_calls), showSettingsModal { CallSettingsView(it, showModal) }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_lock), stringResource(MR.strings.privacy_and_security), showSettingsModal { PrivacySettingsView(it, showSettingsModal, setPerformLA) }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_light_mode), stringResource(MR.strings.appearance_settings), showSettingsModal { AppearanceView(it) }, extraPadding = true)
|
||||
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView(it, showSettingsModal) }, stopped)
|
||||
if (appPlatform.isDesktop) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_smartphone), stringResource(if (remember { chatModel.remoteHosts }.isEmpty()) MR.strings.link_a_mobile else MR.strings.linked_mobiles), showModal { ConnectMobileView() }, disabled = stopped)
|
||||
} else {
|
||||
SettingsActionItem(painterResource(MR.images.ic_desktop), stringResource(MR.strings.settings_section_title_use_from_desktop), showCustomModal { it, close -> ConnectDesktopView(close) }, disabled = stopped)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_help)) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_help), stringResource(MR.strings.how_to_use_simplex_chat), showModal { HelpView(userDisplayName ?: "") }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_add), stringResource(MR.strings.whats_new), showCustomModal { _, close -> WhatsNewView(viaSettings = true, close) }, disabled = stopped, extraPadding = true)
|
||||
SettingsActionItem(painterResource(MR.images.ic_info), stringResource(MR.strings.about_simplex_chat), showModal { SimpleXInfo(it, onboarding = false) }, extraPadding = true)
|
||||
if (!chatModel.desktopNoUserNoRemote) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_tag), stringResource(MR.strings.chat_with_the_founder), { uriHandler.openVerifiedSimplexUri(simplexTeamUri) }, textColor = MaterialTheme.colors.primary, disabled = stopped, extraPadding = true)
|
||||
}
|
||||
SettingsActionItem(painterResource(MR.images.ic_mail), stringResource(MR.strings.send_us_an_email), { uriHandler.openUriCatching("mailto:chat@simplex.chat") }, textColor = MaterialTheme.colors.primary, extraPadding = true)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_support)) {
|
||||
ContributeItem(uriHandler)
|
||||
RateAppItem(uriHandler)
|
||||
StarOnGithubItem(uriHandler)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SettingsSectionApp(showSettingsModal, showCustomModal, showVersion, withAuth)
|
||||
SectionBottomSpacer()
|
||||
SettingsActionItem(painterResource(MR.images.ic_ios_share), stringResource(MR.strings.migrate_from_device_to_another_device), { withAuth(generalGetString(MR.strings.auth_open_migration_to_another_device), generalGetString(MR.strings.auth_log_in_using_credential)) { ModalManager.fullscreen.showCustomModal { close -> MigrateFromDeviceView(close) } } }, disabled = stopped)
|
||||
}
|
||||
if (appPlatform.isDesktop) {
|
||||
Box(
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.height(AppBarHeight * fontSizeSqrtMultiplier)
|
||||
.background(MaterialTheme.colors.background)
|
||||
.background(if (isInDarkTheme()) ToolbarDark else ToolbarLight)
|
||||
.padding(start = 4.dp),
|
||||
contentAlignment = Alignment.CenterStart
|
||||
) {
|
||||
NavigationButtonBack(closeSettings, height = 24.sp.toDp())
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_settings)) {
|
||||
SettingsActionItem(painterResource(if (notificationsMode.value == NotificationsMode.OFF) MR.images.ic_bolt_off else MR.images.ic_bolt), stringResource(MR.strings.notifications), showSettingsModal { NotificationsSettingsView(it) }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_wifi_tethering), stringResource(MR.strings.network_and_servers), showSettingsModal { NetworkAndServersView() }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_videocam), stringResource(MR.strings.settings_audio_video_calls), showSettingsModal { CallSettingsView(it, showModal) }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_lock), stringResource(MR.strings.privacy_and_security), showSettingsModal { PrivacySettingsView(it, showSettingsModal, setPerformLA) }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_light_mode), stringResource(MR.strings.appearance_settings), showSettingsModal { AppearanceView(it) })
|
||||
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView(it, showSettingsModal) }, stopped)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_help)) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_help), stringResource(MR.strings.how_to_use_simplex_chat), showModal { HelpView(userDisplayName ?: "") }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_add), stringResource(MR.strings.whats_new), showCustomModal { _, close -> WhatsNewView(viaSettings = true, close) }, disabled = stopped)
|
||||
SettingsActionItem(painterResource(MR.images.ic_info), stringResource(MR.strings.about_simplex_chat), showModal { SimpleXInfo(it, onboarding = false) })
|
||||
if (!chatModel.desktopNoUserNoRemote) {
|
||||
SettingsActionItem(painterResource(MR.images.ic_tag), stringResource(MR.strings.chat_with_the_founder), { uriHandler.openVerifiedSimplexUri(simplexTeamUri) }, textColor = MaterialTheme.colors.primary, disabled = stopped)
|
||||
}
|
||||
SettingsActionItem(painterResource(MR.images.ic_mail), stringResource(MR.strings.send_us_an_email), { uriHandler.openUriCatching("mailto:chat@simplex.chat") }, textColor = MaterialTheme.colors.primary)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_support)) {
|
||||
ContributeItem(uriHandler)
|
||||
RateAppItem(uriHandler)
|
||||
StarOnGithubItem(uriHandler)
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
SettingsSectionApp(showSettingsModal, showCustomModal, showVersion, withAuth)
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,18 +189,19 @@ expect fun SettingsSectionApp(
|
||||
)
|
||||
|
||||
@Composable private fun DatabaseItem(encrypted: Boolean, saved: Boolean, openDatabaseView: () -> Unit, stopped: Boolean) {
|
||||
SectionItemViewWithIcon(openDatabaseView) {
|
||||
SectionItemView(openDatabaseView) {
|
||||
Row(
|
||||
Modifier.fillMaxWidth(),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.SpaceBetween
|
||||
) {
|
||||
Row(Modifier.weight(1f)) {
|
||||
Row(Modifier.weight(1f), verticalAlignment = Alignment.CenterVertically) {
|
||||
Icon(
|
||||
painterResource(MR.images.ic_database),
|
||||
contentDescription = stringResource(MR.strings.database_passphrase_and_export),
|
||||
tint = if (encrypted && (appPlatform.isAndroid || !saved)) MaterialTheme.colors.secondary else WarningOrange,
|
||||
)
|
||||
TextIconSpaced(true)
|
||||
TextIconSpaced(false)
|
||||
Text(stringResource(MR.strings.database_passphrase_and_export))
|
||||
}
|
||||
if (stopped) {
|
||||
@@ -237,8 +225,7 @@ expect fun SettingsSectionApp(
|
||||
PreferencesView(m, m.currentUser.value ?: return@showCustomModal, close)
|
||||
}()
|
||||
}),
|
||||
disabled = stopped,
|
||||
extraPadding = true
|
||||
disabled = stopped
|
||||
)
|
||||
}
|
||||
|
||||
@@ -253,27 +240,26 @@ fun ChatLockItem(
|
||||
click = showSettingsModal { SimplexLockView(ChatModel, currentLAMode, setPerformLA) },
|
||||
icon = if (performLA.value) painterResource(MR.images.ic_lock_filled) else painterResource(MR.images.ic_lock),
|
||||
text = stringResource(MR.strings.chat_lock),
|
||||
iconColor = if (performLA.value) SimplexGreen else MaterialTheme.colors.secondary,
|
||||
extraPadding = false,
|
||||
iconColor = if (performLA.value) SimplexGreen else MaterialTheme.colors.secondary
|
||||
) {
|
||||
Text(if (performLA.value) remember { currentLAMode.state }.value.text else generalGetString(MR.strings.la_mode_off), color = MaterialTheme.colors.secondary)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable private fun ContributeItem(uriHandler: UriHandler) {
|
||||
SectionItemViewWithIcon({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat#contribute") }) {
|
||||
SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat#contribute") }) {
|
||||
Icon(
|
||||
painterResource(MR.images.ic_keyboard),
|
||||
contentDescription = "GitHub",
|
||||
tint = MaterialTheme.colors.secondary,
|
||||
)
|
||||
TextIconSpaced(extraPadding = true)
|
||||
TextIconSpaced()
|
||||
Text(generalGetString(MR.strings.contribute), color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable private fun RateAppItem(uriHandler: UriHandler) {
|
||||
SectionItemViewWithIcon({
|
||||
SectionItemView({
|
||||
runCatching { uriHandler.openUriCatching("market://details?id=chat.simplex.app") }
|
||||
.onFailure { uriHandler.openUriCatching("https://play.google.com/store/apps/details?id=chat.simplex.app") }
|
||||
}
|
||||
@@ -283,19 +269,19 @@ fun ChatLockItem(
|
||||
contentDescription = "Google Play",
|
||||
tint = MaterialTheme.colors.secondary,
|
||||
)
|
||||
TextIconSpaced(extraPadding = true)
|
||||
TextIconSpaced()
|
||||
Text(generalGetString(MR.strings.rate_the_app), color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable private fun StarOnGithubItem(uriHandler: UriHandler) {
|
||||
SectionItemViewWithIcon({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat") }) {
|
||||
SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat") }) {
|
||||
Icon(
|
||||
painter = painterResource(MR.images.ic_github),
|
||||
contentDescription = "GitHub",
|
||||
tint = MaterialTheme.colors.secondary,
|
||||
)
|
||||
TextIconSpaced(extraPadding = true)
|
||||
TextIconSpaced()
|
||||
Text(generalGetString(MR.strings.star_on_github), color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
@@ -313,7 +299,7 @@ fun ChatLockItem(
|
||||
}
|
||||
|
||||
@Composable fun TerminalAlwaysVisibleItem(pref: SharedPreference<Boolean>, onChange: (Boolean) -> Unit) {
|
||||
SettingsActionItemWithContent(painterResource(MR.images.ic_engineering), stringResource(MR.strings.terminal_always_visible), extraPadding = false) {
|
||||
SettingsActionItemWithContent(painterResource(MR.images.ic_engineering), stringResource(MR.strings.terminal_always_visible)) {
|
||||
DefaultSwitch(
|
||||
checked = remember { pref.state }.value,
|
||||
onCheckedChange = onChange,
|
||||
@@ -360,7 +346,7 @@ fun unchangedHintPreferences(): Boolean = appPreferences.hintPreferences.all { (
|
||||
|
||||
@Composable
|
||||
fun AppVersionItem(showVersion: () -> Unit) {
|
||||
SectionItemViewWithIcon(showVersion) { AppVersionText() }
|
||||
SectionItemView(showVersion) { AppVersionText() }
|
||||
}
|
||||
|
||||
@Composable fun AppVersionText() {
|
||||
@@ -451,7 +437,7 @@ fun PreferenceToggle(
|
||||
checked: Boolean,
|
||||
onChange: (Boolean) -> Unit = {},
|
||||
) {
|
||||
SettingsActionItemWithContent(null, text, disabled = disabled, extraPadding = true,) {
|
||||
SettingsActionItemWithContent(null, text, disabled = disabled) {
|
||||
DefaultSwitch(
|
||||
checked = checked,
|
||||
onCheckedChange = onChange,
|
||||
|
||||
@@ -13,11 +13,12 @@ import chat.simplex.res.MR
|
||||
|
||||
@Composable
|
||||
fun UserAddressLearnMore() {
|
||||
ColumnWithScrollBar(Modifier
|
||||
.fillMaxHeight()
|
||||
.padding(horizontal = DEFAULT_PADDING)
|
||||
ColumnWithScrollBar(
|
||||
Modifier
|
||||
.fillMaxHeight()
|
||||
.padding(horizontal = DEFAULT_PADDING)
|
||||
) {
|
||||
AppBarTitle(stringResource(MR.strings.simplex_address))
|
||||
AppBarTitle(stringResource(MR.strings.simplex_address), withPadding = false)
|
||||
ReadableText(MR.strings.you_can_share_your_address)
|
||||
ReadableText(MR.strings.you_wont_lose_your_contacts_if_delete_address)
|
||||
ReadableText(MR.strings.you_can_accept_or_reject_connection)
|
||||
|
||||
@@ -174,7 +174,7 @@ private fun UserAddressLayout(
|
||||
saveAas: (AutoAcceptState, MutableState<AutoAcceptState>) -> Unit,
|
||||
) {
|
||||
ColumnWithScrollBar {
|
||||
AppBarTitle(stringResource(MR.strings.simplex_address), hostDevice(user?.remoteHostId), withPadding = false)
|
||||
AppBarTitle(stringResource(MR.strings.simplex_address), hostDevice(user?.remoteHostId))
|
||||
Column(
|
||||
Modifier.fillMaxWidth().padding(bottom = DEFAULT_PADDING_HALF),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
@@ -185,7 +185,7 @@ private fun UserAddressLayout(
|
||||
CreateAddressButton(createAddress)
|
||||
SectionTextFooter(stringResource(MR.strings.create_address_and_let_people_connect))
|
||||
}
|
||||
SectionDividerSpaced(maxBottomPadding = false)
|
||||
SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false)
|
||||
SectionView {
|
||||
LearnMoreButton(learnMore)
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import SectionBottomSpacer
|
||||
import SectionDivider
|
||||
import SectionItemView
|
||||
import SectionItemViewSpaceBetween
|
||||
import SectionItemViewWithoutMinPadding
|
||||
import SectionSpacer
|
||||
import SectionTextFooter
|
||||
import SectionView
|
||||
@@ -277,7 +278,7 @@ private fun ProfileActionView(action: UserProfileAction, user: User, doAction: (
|
||||
|
||||
@Composable fun PasswordAndAction(label: StringResource, color: Color = MaterialTheme.colors.primary) {
|
||||
SectionView() {
|
||||
SectionItemView {
|
||||
SectionItemViewWithoutMinPadding {
|
||||
PassphraseField(actionPassword, generalGetString(MR.strings.profile_password), isValid = { passwordValid }, showStrength = true)
|
||||
}
|
||||
SectionItemViewSpaceBetween({ doAction(actionPassword.value) }, disabled = !actionEnabled, minHeight = TextFieldDefaults.MinHeight) {
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M182-218q59.315-55.57 134.804-89.785Q392.293-342 479.896-342q87.604 0 163.197 34.215Q718.685-273.57 778-218v-560H182v560Zm300.232-200.5q57.268 0 96.518-39.482Q618-497.465 618-554.732q0-57.268-39.482-96.518-39.483-39.25-96.75-39.25-57.268 0-96.518 39.482Q346-611.535 346-554.268q0 57.268 39.482 96.518 39.483 39.25 96.75 39.25ZM182-124.5q-22.969 0-40.234-17.266Q124.5-159.031 124.5-182v-596q0-22.969 17.266-40.234Q159.031-835.5 182-835.5h596q22.969 0 40.234 17.266Q835.5-800.969 835.5-778v596q0 22.969-17.266 40.234Q800.969-124.5 778-124.5H182Zm52.5-57.5h491v-9.111Q671.5-237.5 609.161-261 546.823-284.5 480-284.5q-67.177 0-129.339 23.5Q288.5-237.5 234.5-191.111V-182Zm247.441-294q-32.733 0-55.587-22.913-22.854-22.913-22.854-55.646 0-32.733 22.913-55.587Q449.326-633 482.059-633q32.733 0 55.587 22.913 22.854 22.913 22.854 55.646 0 32.733-22.913 55.587Q514.674-476 481.941-476ZM480-498.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M182-218q59.315-55.57 134.804-89.785Q392.293-342 479.896-342q87.604 0 163.197 34.215Q718.685-273.57 778-218v-560H182v560Zm300.232-200.5q57.268 0 96.518-39.482Q618-497.465 618-554.732q0-57.268-39.482-96.518-39.483-39.25-96.75-39.25-57.268 0-96.518 39.482Q346-611.535 346-554.268q0 57.268 39.482 96.518 39.483 39.25 96.75 39.25ZM182-124.5q-22.969 0-40.234-17.266Q124.5-159.031 124.5-182v-596q0-22.969 17.266-40.234Q159.031-835.5 182-835.5h596q22.969 0 40.234 17.266Q835.5-800.969 835.5-778v596q0 22.969-17.266 40.234Q800.969-124.5 778-124.5H182Zm52.5-57.5h491v-9.111Q671.5-237.5 609.161-261 546.823-284.5 480-284.5q-67.177 0-129.339 23.5Q288.5-237.5 234.5-191.111V-182Zm247.441-294q-32.733 0-55.587-22.913-22.854-22.913-22.854-55.646 0-32.733 22.913-55.587Q449.326-633 482.059-633q32.733 0 55.587 22.913 22.854 22.913 22.854 55.646 0 32.733-22.913 55.587Q514.674-476 481.941-476ZM480-498.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 994 B After Width: | Height: | Size: 994 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M224.89 800.5Q288 761 348.25 741T480 721q71.5 0 132 20t124.5 59.5Q781 746 799.25 691.351q18.25-54.648 18.25-115.25 0-144.101-96.75-240.851T480 238.5q-144 0-240.75 96.75T142.5 576.101q0 60.602 18.75 115.25Q180 746 224.89 800.5ZM479.869 605q-57.369 0-96.619-39.381-39.25-39.38-39.25-96.75 0-57.369 39.381-96.619 39.38-39.25 96.75-39.25 57.369 0 96.619 39.381 39.25 39.38 39.25 96.75 0 57.369-39.381 96.619-39.38 39.25-96.75 39.25Zm-.274 366q-81.553 0-154.09-31.263-72.538-31.263-125.772-85Q146.5 801 115.75 729.136 85 657.272 85 575.564q0-81.789 31.263-153.789 31.263-71.999 85-125.387Q255 243 326.864 212q71.864-31 153.572-31 81.789 0 153.795 31.132 72.005 31.131 125.387 84.5Q813 350 844 422.023q31 72.023 31 153.647 0 81.705-31.013 153.629-31.013 71.925-84.5 125.563Q706 908.5 633.827 939.75 561.655 971 479.595 971Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M224.89 800.5Q288 761 348.25 741T480 721q71.5 0 132 20t124.5 59.5Q781 746 799.25 691.351q18.25-54.648 18.25-115.25 0-144.101-96.75-240.851T480 238.5q-144 0-240.75 96.75T142.5 576.101q0 60.602 18.75 115.25Q180 746 224.89 800.5ZM479.869 605q-57.369 0-96.619-39.381-39.25-39.38-39.25-96.75 0-57.369 39.381-96.619 39.38-39.25 96.75-39.25 57.369 0 96.619 39.381 39.25 39.38 39.25 96.75 0 57.369-39.381 96.619-39.38 39.25-96.75 39.25Zm-.274 366q-81.553 0-154.09-31.263-72.538-31.263-125.772-85Q146.5 801 115.75 729.136 85 657.272 85 575.564q0-81.789 31.263-153.789 31.263-71.999 85-125.387Q255 243 326.864 212q71.864-31 153.572-31 81.789 0 153.795 31.132 72.005 31.131 125.387 84.5Q813 350 844 422.023q31 72.023 31 153.647 0 81.705-31.013 153.629-31.013 71.925-84.5 125.563Q706 908.5 633.827 939.75 561.655 971 479.595 971Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 921 B After Width: | Height: | Size: 921 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M479.825 852q-12.325 0-20.325-8.375t-8-20.625V604.5h-219q-12.25 0-20.375-8.535T204 575.575q0-11.856 8.125-20.216Q220.25 547 232.5 547h219V328q0-11.675 8.175-20.088 8.176-8.412 20.5-8.412 12.325 0 20.575 8.412Q509 316.325 509 328v219h218.5q12.25 0 20.625 8.463t8.375 20.212q0 12.325-8.375 20.575T727.5 604.5H509V823q0 12.25-8.425 20.625-8.426 8.375-20.75 8.375Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M479.825 852q-12.325 0-20.325-8.375t-8-20.625V604.5h-219q-12.25 0-20.375-8.535T204 575.575q0-11.856 8.125-20.216Q220.25 547 232.5 547h219V328q0-11.675 8.175-20.088 8.176-8.412 20.5-8.412 12.325 0 20.575 8.412Q509 316.325 509 328v219h218.5q12.25 0 20.625 8.463t8.375 20.212q0 12.325-8.375 20.575T727.5 604.5H509V823q0 12.25-8.425 20.625-8.426 8.375-20.75 8.375Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 464 B After Width: | Height: | Size: 464 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M281 773.5q-84 0-140.25-56.534-56.25-56.533-56.25-140Q84.5 493.5 140.75 437 197 380.5 281 380.5h139q12.25 0 20.625 8.463T449 409.175q0 12.325-8.375 20.575T420 438H281q-60 0-99.5 39.5T142 577q0 60 39.5 99.5T281 716h139q12.25 0 20.625 8.463T449 744.675q0 12.325-8.375 20.575T420 773.5H281Zm73.5-168q-12.25 0-20.375-8.535T326 576.575q0-11.856 8.125-20.216Q342.25 548 354.5 548h248q12.25 0 20.625 8.463t8.375 20.212q0 12.325-8.375 20.575T602.5 605.5h-248Zm520.5-29h-57.5q0-60-39.792-99.5-39.791-39.5-99.208-39.5H539q-12.25 0-20.375-8.535t-8.125-20.39q0-11.856 8.125-20.216Q526.75 380 539 380h139.5q83.453 0 139.976 56.524Q875 493.047 875 576.5ZM726.825 893q-12.325 0-20.325-8.375t-8-20.625v-90H608q-12.25 0-20.375-8.535t-8.125-20.39q0-11.856 8.125-20.216Q595.75 716.5 608 716.5h90.5V626q0-11.675 8.175-20.088 8.176-8.412 20.5-8.412 12.325 0 20.575 8.412Q756 614.325 756 626v90.5h90q12.25 0 20.625 8.463T875 745.175q0 12.325-8.375 20.575T846 774h-90v90q0 12.25-8.425 20.625-8.426 8.375-20.75 8.375Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M281 773.5q-84 0-140.25-56.534-56.25-56.533-56.25-140Q84.5 493.5 140.75 437 197 380.5 281 380.5h139q12.25 0 20.625 8.463T449 409.175q0 12.325-8.375 20.575T420 438H281q-60 0-99.5 39.5T142 577q0 60 39.5 99.5T281 716h139q12.25 0 20.625 8.463T449 744.675q0 12.325-8.375 20.575T420 773.5H281Zm73.5-168q-12.25 0-20.375-8.535T326 576.575q0-11.856 8.125-20.216Q342.25 548 354.5 548h248q12.25 0 20.625 8.463t8.375 20.212q0 12.325-8.375 20.575T602.5 605.5h-248Zm520.5-29h-57.5q0-60-39.792-99.5-39.791-39.5-99.208-39.5H539q-12.25 0-20.375-8.535t-8.125-20.39q0-11.856 8.125-20.216Q526.75 380 539 380h139.5q83.453 0 139.976 56.524Q875 493.047 875 576.5ZM726.825 893q-12.325 0-20.325-8.375t-8-20.625v-90H608q-12.25 0-20.375-8.535t-8.125-20.39q0-11.856 8.125-20.216Q595.75 716.5 608 716.5h90.5V626q0-11.675 8.175-20.088 8.176-8.412 20.5-8.412 12.325 0 20.575 8.412Q756 614.325 756 626v90.5h90q12.25 0 20.625 8.463T875 745.175q0 12.325-8.375 20.575T846 774h-90v90q0 12.25-8.425 20.625-8.426 8.375-20.75 8.375Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M181.5 931q-22.969 0-40.234-17.266Q124 896.469 124 873.5V278q0-22.969 17.266-40.234Q158.531 220.5 181.5 220.5H561q12.25 0 20.625 8.463T590 249.175q0 12.325-8.375 20.575T561 278H181.5v595.5H777V495q0-12.25 8.425-20.625 8.426-8.375 20.5-8.375 12.075 0 20.325 8.375T834.5 495v378.5q0 22.969-17.266 40.234Q799.969 931 777 931H181.5Zm546.325-493.5q-12.325 0-20.575-8.375T699 408.5V357h-51.5q-12.25 0-20.625-8.425-8.375-8.426-8.375-20.5 0-12.075 8.375-20.325t20.625-8.25H699v-52q0-11.675 8.425-20.088 8.426-8.412 20.5-8.412 12.075 0 20.325 8.412 8.25 8.413 8.25 20.088v52h52q11.675 0 20.088 8.463Q837 316.426 837 328.175q0 12.325-8.412 20.575Q820.175 357 808.5 357h-52v51.5q0 12.25-8.463 20.625t-20.212 8.375ZM273 772.5h413.175q9.825 0 13.825-7.75T698 749L585.578 599.603q-4.703-6.103-11.463-6.103-6.759 0-11.615 6L448 749.5l-81.462-106.388q-4.692-5.612-11.5-5.612-6.807 0-11.719 5.584L261.574 749.02q-5.074 7.98-.949 15.73T273 772.5ZM181.5 495v378.5V278v217Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M181.5 931q-22.969 0-40.234-17.266Q124 896.469 124 873.5V278q0-22.969 17.266-40.234Q158.531 220.5 181.5 220.5H561q12.25 0 20.625 8.463T590 249.175q0 12.325-8.375 20.575T561 278H181.5v595.5H777V495q0-12.25 8.425-20.625 8.426-8.375 20.5-8.375 12.075 0 20.325 8.375T834.5 495v378.5q0 22.969-17.266 40.234Q799.969 931 777 931H181.5Zm546.325-493.5q-12.325 0-20.575-8.375T699 408.5V357h-51.5q-12.25 0-20.625-8.425-8.375-8.426-8.375-20.5 0-12.075 8.375-20.325t20.625-8.25H699v-52q0-11.675 8.425-20.088 8.426-8.412 20.5-8.412 12.075 0 20.325 8.412 8.25 8.413 8.25 20.088v52h52q11.675 0 20.088 8.463Q837 316.426 837 328.175q0 12.325-8.412 20.575Q820.175 357 808.5 357h-52v51.5q0 12.25-8.463 20.625t-20.212 8.375ZM273 772.5h413.175q9.825 0 13.825-7.75T698 749L585.578 599.603q-4.703-6.103-11.463-6.103-6.759 0-11.615 6L448 749.5l-81.462-106.388q-4.692-5.612-11.5-5.612-6.807 0-11.719 5.584L261.574 749.02q-5.074 7.98-.949 15.73T273 772.5ZM181.5 495v378.5V278v217Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480.33-85q-81.704 0-153.629-31.263t-125.563-85Q147.5-255 116.25-326.789 85-398.579 85-480.202q0-81.705 31.363-153.863 31.362-72.159 84.769-125.547Q254.539-813 326.79-844q72.25-31 153.135-31 46.834 0 90.763 10.514Q614.617-853.973 654-835q-3.5 8.5-4.75 17.083Q648-809.333 648-800q0 7.897.75 14.949Q649.5-778 652-771q-38-22.5-81.071-34.5t-91.031-12q-140.21 0-238.804 98.25T142.5-480.486q0 140.515 98.736 239.25 98.735 98.736 239.25 98.736 140.514 0 238.764-98.594T817.5-480q0-38.526-8.25-75.013T786-624q10.963 7.759 24.931 11.88Q824.9-608 840-608h6.75q3.393 0 6.75-.5 10.5 30.5 16 62.433t5.5 65.888q0 81.086-31.013 153.475t-84.5 125.697Q706-147.699 633.977-116.349 561.954-85 480.33-85Zm144.123-448.5q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05Zm-289 0q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05ZM480-264q64.5 0 119.25-34.5t79.75-95H281q26 60.5 80.25 95T480-264Zm0-216Zm331.5-291.5H760q-12.25 0-20.375-8.175-8.125-8.176-8.125-20.5 0-12.325 8.125-20.575T760-829h51.5v-51q0-12.25 8.175-20.625 8.176-8.375 20.5-8.375 12.325 0 20.575 8.375T869-880v51h51q12.25 0 20.625 8.425 8.375 8.426 8.375 20.75 0 12.325-8.375 20.325t-20.625 8h-51v51.5q0 12.25-8.425 20.375-8.426 8.125-20.75 8.125-12.325 0-20.325-8.125t-8-20.375v-51.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M480.33-85q-81.704 0-153.629-31.263t-125.563-85Q147.5-255 116.25-326.789 85-398.579 85-480.202q0-81.705 31.363-153.863 31.362-72.159 84.769-125.547Q254.539-813 326.79-844q72.25-31 153.135-31 46.834 0 90.763 10.514Q614.617-853.973 654-835q-3.5 8.5-4.75 17.083Q648-809.333 648-800q0 7.897.75 14.949Q649.5-778 652-771q-38-22.5-81.071-34.5t-91.031-12q-140.21 0-238.804 98.25T142.5-480.486q0 140.515 98.736 239.25 98.735 98.736 239.25 98.736 140.514 0 238.764-98.594T817.5-480q0-38.526-8.25-75.013T786-624q10.963 7.759 24.931 11.88Q824.9-608 840-608h6.75q3.393 0 6.75-.5 10.5 30.5 16 62.433t5.5 65.888q0 81.086-31.013 153.475t-84.5 125.697Q706-147.699 633.977-116.349 561.954-85 480.33-85Zm144.123-448.5q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05Zm-289 0q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05ZM480-264q64.5 0 119.25-34.5t79.75-95H281q26 60.5 80.25 95T480-264Zm0-216Zm331.5-291.5H760q-12.25 0-20.375-8.175-8.125-8.176-8.125-20.5 0-12.325 8.125-20.575T760-829h51.5v-51q0-12.25 8.175-20.625 8.176-8.375 20.5-8.375 12.325 0 20.575 8.375T869-880v51h51q12.25 0 20.625 8.425 8.375 8.426 8.375 20.75 0 12.325-8.375 20.325t-20.625 8h-51v51.5q0 12.25-8.425 20.375-8.426 8.125-20.75 8.125-12.325 0-20.325-8.125t-8-20.375v-51.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M811.5-771.5H760q-11.5 0-20-8.175-8.5-8.176-8.5-20.5 0-12.325 8.125-20.575T760-829h51.5v-51q0-12.25 8.175-20.625 8.176-8.375 20.5-8.375 12.325 0 20.575 8.375T869-880v51h51q12.25 0 20.625 8.425 8.375 8.426 8.375 20.75 0 12.325-8.375 20.325t-20.625 8h-51v51.5q0 11.5-8.425 20-8.426 8.5-20.75 8.5-12.325 0-20.325-8.125t-8-20.375v-51.5ZM480.33-85q-81.704 0-153.629-31.263t-125.563-85Q147.5-255 116.25-326.789 85-398.579 85-480.202q0-81.705 31.363-153.863 31.362-72.159 84.769-125.547Q254.539-813 326.79-844q72.25-31 153.135-31 46.834 0 90.763 10.514Q614.617-853.973 654-835q-3.5 8.5-4.75 17.083-1.25 8.584-1.25 17.486 0 38.431 23.441 68.894 23.441 30.464 61.059 39.037 9.073 37.671 39.525 61.085Q802.477-608 840.275-608h6.475q3.393 0 6.75-.5 10.5 30.5 16 62.433t5.5 65.888q0 81.086-31.013 153.475t-84.5 125.697Q706-147.699 633.977-116.349 561.954-85 480.33-85Zm144.123-448.5q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05Zm-289 0q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05ZM480-264q64.5 0 119.25-34.5t79.75-95H281q26 60.5 80.25 95T480-264Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M811.5-771.5H760q-11.5 0-20-8.175-8.5-8.176-8.5-20.5 0-12.325 8.125-20.575T760-829h51.5v-51q0-12.25 8.175-20.625 8.176-8.375 20.5-8.375 12.325 0 20.575 8.375T869-880v51h51q12.25 0 20.625 8.425 8.375 8.426 8.375 20.75 0 12.325-8.375 20.325t-20.625 8h-51v51.5q0 11.5-8.425 20-8.426 8.5-20.75 8.5-12.325 0-20.325-8.125t-8-20.375v-51.5ZM480.33-85q-81.704 0-153.629-31.263t-125.563-85Q147.5-255 116.25-326.789 85-398.579 85-480.202q0-81.705 31.363-153.863 31.362-72.159 84.769-125.547Q254.539-813 326.79-844q72.25-31 153.135-31 46.834 0 90.763 10.514Q614.617-853.973 654-835q-3.5 8.5-4.75 17.083-1.25 8.584-1.25 17.486 0 38.431 23.441 68.894 23.441 30.464 61.059 39.037 9.073 37.671 39.525 61.085Q802.477-608 840.275-608h6.475q3.393 0 6.75-.5 10.5 30.5 16 62.433t5.5 65.888q0 81.086-31.013 153.475t-84.5 125.697Q706-147.699 633.977-116.349 561.954-85 480.33-85Zm144.123-448.5q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05Zm-289 0q22.947 0 37.997-15.003 15.05-15.004 15.05-37.95 0-22.947-15.003-37.997-15.004-15.05-37.95-15.05-22.947 0-37.997 15.003-15.05 15.004-15.05 37.95 0 22.947 15.003 37.997 15.004 15.05 37.95 15.05ZM480-264q64.5 0 119.25-34.5t79.75-95H281q26 60.5 80.25 95T480-264Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M214.099 793Q125.5 793 65.25 728.425 5 663.85 5 574.179q0-89.088 60.754-152.384Q126.51 358.5 214.07 358.5q36.078 0 69.254 11.63T342.5 407l94.5 90.5-40 40.5-90.5-88q-18.5-18.5-42.516-26.25T214 416q-64.207 0-107.854 46.5Q62.5 509 62.5 574.146q0 65.733 43.247 113.543Q148.994 735.5 213.998 735.5q25.002 0 48.752-8 23.75-8 42.75-25l313.441-295.434Q644.5 382 677.608 370.25q33.108-11.75 67.681-11.75 88.939 0 149.575 63.255Q955.5 485.009 955.5 573.532q0 89.941-60.755 154.705Q833.991 793 745.43 793q-35.078 0-68.754-11.13T618 745.5l-92-91 40-40 88 88q17.5 17.5 41.75 25.25t49.818 7.75q65.179 0 108.805-48Q898 639.5 898 573.341q0-64.745-44.348-111.043Q809.303 416 745.518 416q-24.919 0-48.719 8.75Q673 433.5 655 451L341.559 746.434Q315.5 770.5 282.018 781.75 248.536 793 214.099 793Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M214.099 793Q125.5 793 65.25 728.425 5 663.85 5 574.179q0-89.088 60.754-152.384Q126.51 358.5 214.07 358.5q36.078 0 69.254 11.63T342.5 407l94.5 90.5-40 40.5-90.5-88q-18.5-18.5-42.516-26.25T214 416q-64.207 0-107.854 46.5Q62.5 509 62.5 574.146q0 65.733 43.247 113.543Q148.994 735.5 213.998 735.5q25.002 0 48.752-8 23.75-8 42.75-25l313.441-295.434Q644.5 382 677.608 370.25q33.108-11.75 67.681-11.75 88.939 0 149.575 63.255Q955.5 485.009 955.5 573.532q0 89.941-60.755 154.705Q833.991 793 745.43 793q-35.078 0-68.754-11.13T618 745.5l-92-91 40-40 88 88q17.5 17.5 41.75 25.25t49.818 7.75q65.179 0 108.805-48Q898 639.5 898 573.341q0-64.745-44.348-111.043Q809.303 416 745.518 416q-24.919 0-48.719 8.75Q673 433.5 655 451L341.559 746.434Q315.5 770.5 282.018 781.75 248.536 793 214.099 793Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 881 B After Width: | Height: | Size: 881 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M626 944.5 277.5 596q-4.5-4.794-6.5-9.554-2-4.76-2-10.486 0-5.726 2-10.486 2-4.76 6.5-9.474l348.9-348.9q10.6-10.6 26.6-10.6t27 10.5q11 11.545 11 27.682 0 16.136-11.073 27.391L366 576l313.955 313.955Q692.5 902.5 691.5 917.75q-1 15.25-11.5 25.75-11.5 11.5-27.409 11.75-15.909.25-26.591-10.75Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M626 944.5 277.5 596q-4.5-4.794-6.5-9.554-2-4.76-2-10.486 0-5.726 2-10.486 2-4.76 6.5-9.474l348.9-348.9q10.6-10.6 26.6-10.6t27 10.5q11 11.545 11 27.682 0 16.136-11.073 27.391L366 576l313.955 313.955Q692.5 902.5 691.5 917.75q-1 15.25-11.5 25.75-11.5 11.5-27.409 11.75-15.909.25-26.591-10.75Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 394 B After Width: | Height: | Size: 394 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M479.96 881q-4.804 0-10.232-2.045Q464.3 876.909 460 872L184 596q-8.5-8.4-8.5-19.95 0-11.55 8.5-20.05t20.341-8.5q11.841 0 20.188 8.5L451.5 782.5v-494q0-12.013 8.463-20.506 8.463-8.494 20.212-8.494 12.325 0 20.575 8.375T509 288.5v494l227-227q8.182-8 19.841-8T776 555.842q8.5 8.342 8.5 20t-8.587 20.245L500 872q-4.58 5-9.499 7-4.919 2-10.541 2Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M479.96 881q-4.804 0-10.232-2.045Q464.3 876.909 460 872L184 596q-8.5-8.4-8.5-19.95 0-11.55 8.5-20.05t20.341-8.5q11.841 0 20.188 8.5L451.5 782.5v-494q0-12.013 8.463-20.506 8.463-8.494 20.212-8.494 12.325 0 20.575 8.375T509 288.5v494l227-227q8.182-8 19.841-8T776 555.842q8.5 8.342 8.5 20t-8.587 20.245L500 872q-4.58 5-9.499 7-4.919 2-10.541 2Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 445 B After Width: | Height: | Size: 445 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22px" viewBox="0 -960 960 960" width="22px" fill="#5f6368"><path d="M480-362 284-557.5h392L480-362Z"/></svg>
|
||||
|
After Width: | Height: | Size: 156 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22px" viewBox="0 -960 960 960" width="22px" fill="#5f6368"><path d="m284-402 196-197 196 197H284Z"/></svg>
|
||||
|
After Width: | Height: | Size: 154 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24" fill="#5f6368"><path d="M629-446.5H235.48q-13.79 0-23.64-9.79-9.84-9.79-9.84-23.5t9.84-23.71q9.85-10 23.64-10H629L455.79-686.71Q445.5-697 445.25-710.5t10.25-24.48q10.5-10.52 24-10.27t23.81 10.57L734.1-503.59q4.9 4.91 7.65 10.97 2.75 6.06 2.75 12.78 0 6.71-2.75 12.78Q739-461 734.5-456.5l-231 231q-11 11-23.75 10.5t-23.25-11.02Q446-237 446-250.42q0-13.41 10.5-23.58L629-446.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22" fill="#5f6368"><path d="M629-446.5H235.48q-13.79 0-23.64-9.79-9.84-9.79-9.84-23.5t9.84-23.71q9.85-10 23.64-10H629L455.79-686.71Q445.5-697 445.25-710.5t10.25-24.48q10.5-10.52 24-10.27t23.81 10.57L734.1-503.59q4.9 4.91 7.65 10.97 2.75 6.06 2.75 12.78 0 6.71-2.75 12.78Q739-461 734.5-456.5l-231 231q-11 11-23.75 10.5t-23.25-11.02Q446-237 446-250.42q0-13.41 10.5-23.58L629-446.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 472 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M278.5 941.451q-11-11.05-11.25-26.5Q267 899.5 278.5 888l314-314-314-314q-11-11-11.25-26.5t11.222-27q10.472-11.5 26.25-12t27.278 11L681 554q4.5 4.794 6.5 9.554 2 4.76 2 10.486 0 5.726-2 10.486-2 4.76-6.5 9.474L332 942.5q-11.009 11-26.755 10.75Q289.5 953 278.5 941.451Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M278.5 941.451q-11-11.05-11.25-26.5Q267 899.5 278.5 888l314-314-314-314q-11-11-11.25-26.5t11.222-27q10.472-11.5 26.25-12t27.278 11L681 554q4.5 4.794 6.5 9.554 2 4.76 2 10.486 0 5.726-2 10.486-2 4.76-6.5 9.474L332 942.5q-11.009 11-26.755 10.75Q289.5 953 278.5 941.451Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 371 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M479.825 892q-12.325 0-20.325-8.125t-8-20.375V369l-227 227q-8.833 9-20.417 9-11.583 0-20.083-8.853-8.5-8.853-8.5-20.414 0-11.562 8.5-20.233l275.956-275.956q4.427-4.68 9.891-6.612Q475.311 271 480.575 271q5.264 0 10.094 2 4.831 2 9.331 6.5l276 276q8.5 8.671 8.5 20.233 0 11.561-8.342 20.414-8.342 8.853-20 8.853T736 596L509 369v494.5q0 12.25-8.425 20.375-8.426 8.125-20.75 8.125Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M479.825 892q-12.325 0-20.325-8.125t-8-20.375V369l-227 227q-8.833 9-20.417 9-11.583 0-20.083-8.853-8.5-8.853-8.5-20.414 0-11.562 8.5-20.233l275.956-275.956q4.427-4.68 9.891-6.612Q475.311 271 480.575 271q5.264 0 10.094 2 4.831 2 9.331 6.5l276 276q8.5 8.671 8.5 20.233 0 11.561-8.342 20.414-8.342 8.853-20 8.853T736 596L509 369v494.5q0 12.25-8.425 20.375-8.426 8.125-20.75 8.125Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 481 B After Width: | Height: | Size: 481 B |
@@ -1,4 +1,4 @@
|
||||
<svg height="24" viewBox="0 -960 960 960" width="24" fill="#000000" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg height="22" viewBox="0 -960 960 960" width="22" fill="#000000" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M 831.5 -480 L 657 -656.5 C 651.667 -662.167 648.917 -668.833 648.75 -676.5 C 648.583 -684.167 651.333 -690.833 657 -696.5 C 662.667 -702.5 669.333 -705.5 677 -705.5 C 684.667 -705.5 691.5 -702.667 697.5 -697 L 894 -500.5 C 897 -497.167 899.25 -493.917 900.75 -490.75 C 902.25 -487.583 903 -484 903 -480 C 903 -476 902.25 -472.417 900.75 -469.25 C 899.25 -466.083 897 -463 894 -460 L 697.5 -263.5 C 691.5 -257.5 684.667 -254.583 677 -254.75 C 669.333 -254.917 662.667 -257.833 657 -263.5 C 651 -269.5 648.167 -276.25 648.5 -283.75 C 648.833 -291.25 651.667 -297.833 657 -303.5 L 831.5 -480 Z M 128.5 -480 L 303 -303.5 C 308.333 -297.833 311.083 -291.167 311.25 -283.5 C 311.417 -275.833 308.667 -269.167 303 -263.5 C 297.333 -257.5 290.667 -254.5 283 -254.5 C 275.333 -254.5 268.667 -257.5 263 -263.5 L 66.5 -460 C 63.167 -463 60.833 -466.083 59.5 -469.25 C 58.167 -472.417 57.5 -476 57.5 -480 C 57.5 -484 58.167 -487.583 59.5 -490.75 C 60.833 -493.917 63.167 -497.167 66.5 -500.5 L 263 -697 C 268.667 -702.667 275.333 -705.417 283 -705.25 C 290.667 -705.083 297.5 -702.167 303.5 -696.5 C 309.167 -690.5 311.833 -683.75 311.5 -676.25 C 311.167 -668.75 308.333 -662.167 303 -656.5 L 128.5 -480 Z" transform="matrix(0.9999999999999999, 0, 0, 0.9999999999999999, 0, 0)"/>
|
||||
<rect x="123" y="-514" width="711.266" height="68" style="stroke: rgb(0, 0, 0);" transform="matrix(0.9999999999999999, 0, 0, 0.9999999999999999, 0, 0)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M308.5 774H522q11.675 0 20.088-8.425 8.412-8.426 8.412-20.5 0-12.075-8.412-20.325-8.413-8.25-20.088-8.25H308.5q-12.25 0-20.625 8.463t-8.375 20.212q0 12.325 8.375 20.575T308.5 774Zm0-169.5H652q11.675 0 20.088-8.425 8.412-8.426 8.412-20.5 0-12.075-8.412-20.325Q663.675 547 652 547H308.5q-12.25 0-20.625 8.463t-8.375 20.212q0 12.325 8.375 20.575t20.625 8.25Zm0-169.5H652q11.675 0 20.088-8.425 8.412-8.426 8.412-20.5 0-12.075-8.412-20.325-8.413-8.25-20.088-8.25H308.5q-12.25 0-20.625 8.463t-8.375 20.212q0 12.325 8.375 20.575T308.5 435ZM182 931.5q-22.969 0-40.234-17.266Q124.5 896.969 124.5 874V278q0-22.969 17.266-40.234Q159.031 220.5 182 220.5h596q22.969 0 40.234 17.266Q835.5 255.031 835.5 278v596q0 22.969-17.266 40.234Q800.969 931.5 778 931.5H182Zm0-57.5h596V278H182v596Zm0 0V278v596Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M308.5 774H522q11.675 0 20.088-8.425 8.412-8.426 8.412-20.5 0-12.075-8.412-20.325-8.413-8.25-20.088-8.25H308.5q-12.25 0-20.625 8.463t-8.375 20.212q0 12.325 8.375 20.575T308.5 774Zm0-169.5H652q11.675 0 20.088-8.425 8.412-8.426 8.412-20.5 0-12.075-8.412-20.325Q663.675 547 652 547H308.5q-12.25 0-20.625 8.463t-8.375 20.212q0 12.325 8.375 20.575t20.625 8.25Zm0-169.5H652q11.675 0 20.088-8.425 8.412-8.426 8.412-20.5 0-12.075-8.412-20.325-8.413-8.25-20.088-8.25H308.5q-12.25 0-20.625 8.463t-8.375 20.212q0 12.325 8.375 20.575T308.5 435ZM182 931.5q-22.969 0-40.234-17.266Q124.5 896.969 124.5 874V278q0-22.969 17.266-40.234Q159.031 220.5 182 220.5h596q22.969 0 40.234 17.266Q835.5 255.031 835.5 278v596q0 22.969-17.266 40.234Q800.969 931.5 778 931.5H182Zm0-57.5h596V278H182v596Zm0 0V278v596Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 889 B After Width: | Height: | Size: 889 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M460.058 975.5q-90.558 0-154.808-62.418Q241 850.664 241 760.739v-431.91Q241 265 286.147 220.5 331.294 176 395.25 176q64.75 0 109.5 44.75t44.75 109.115v395.221q0 37.494-25.898 63.954t-63.75 26.46q-37.852 0-63.602-28.21T370.5 720V346q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T409 346v377.069q0 22.431 14.75 38.181Q438.5 777 460 777t36.25-15.25Q511 746.5 511 725.039V329.103q0-48.103-33.796-81.353-33.796-33.25-81.75-33.25T313.5 247.624q-34 33.123-34 81.303v433.791q0 73.282 53.312 123.782t127.25 50.5Q535 937 587.75 885.706t52.75-125.344V346q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T679 346v413.5q0 90.164-64.192 153.082-64.193 62.918-154.75 62.918Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M460.058 975.5q-90.558 0-154.808-62.418Q241 850.664 241 760.739v-431.91Q241 265 286.147 220.5 331.294 176 395.25 176q64.75 0 109.5 44.75t44.75 109.115v395.221q0 37.494-25.898 63.954t-63.75 26.46q-37.852 0-63.602-28.21T370.5 720V346q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T409 346v377.069q0 22.431 14.75 38.181Q438.5 777 460 777t36.25-15.25Q511 746.5 511 725.039V329.103q0-48.103-33.796-81.353-33.796-33.25-81.75-33.25T313.5 247.624q-34 33.123-34 81.303v433.791q0 73.282 53.312 123.782t127.25 50.5Q535 937 587.75 885.706t52.75-125.344V346q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T679 346v413.5q0 90.164-64.192 153.082-64.193 62.918-154.75 62.918Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 756 B After Width: | Height: | Size: 756 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M460.058-80.5q-90.558 0-154.808-62.418Q241-205.336 241-295.261v-431.91Q241-791 286.147-835.5 331.294-880 395.25-880q64.75 0 109.5 44.75t44.75 109.115v395.221q0 37.494-25.898 63.954t-63.75 26.46q-37.852 0-63.602-28.21T370.5-336v-374q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T409-710v377.069q0 22.431 14.75 38.181Q438.5-279 460-279t36.25-15.25Q511-309.5 511-330.961v-395.936q0-48.103-33.796-81.353-33.796-33.25-81.75-33.25T313.5-808.376q-34 33.123-34 81.303v433.791q0 73.282 53.312 123.782t127.25 50.5Q535-119 587.75-170.294q52.75-51.293 52.75-125.344V-710q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T679-710v413.5q0 90.164-64.192 153.082Q550.615-80.5 460.058-80.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M460.058-80.5q-90.558 0-154.808-62.418Q241-205.336 241-295.261v-431.91Q241-791 286.147-835.5 331.294-880 395.25-880q64.75 0 109.5 44.75t44.75 109.115v395.221q0 37.494-25.898 63.954t-63.75 26.46q-37.852 0-63.602-28.21T370.5-336v-374q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T409-710v377.069q0 22.431 14.75 38.181Q438.5-279 460-279t36.25-15.25Q511-309.5 511-330.961v-395.936q0-48.103-33.796-81.353-33.796-33.25-81.75-33.25T313.5-808.376q-34 33.123-34 81.303v433.791q0 73.282 53.312 123.782t127.25 50.5Q535-119 587.75-170.294q52.75-51.293 52.75-125.344V-710q0-7.5 5.75-13.25t13.5-5.75q7.75 0 13.5 5.75T679-710v413.5q0 90.164-64.192 153.082Q550.615-80.5 460.058-80.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 771 B After Width: | Height: | Size: 771 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M609.824-771.5q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm0 660q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm160-520q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm0 380q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm60-190q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25ZM480-81.5q-82.481 0-155.275-31.304-72.794-31.305-126.706-85.219-53.913-53.915-85.216-126.711Q81.5-397.531 81.5-480.016q0-82.484 31.303-155.273 31.303-72.79 85.216-126.699 53.912-53.909 126.706-85.461Q397.519-879 480-879v60q-141.5 0-240 98.562Q141.5-621.875 141.5-480t98.312 240.188Q338.125-141.5 480-141.5v60Zm-.111-330q-28.389 0-48.389-20.078-20-20.078-20-48.422 0-5.938.75-12.441.75-6.503 3.25-11.808L336-584l40-40.5 81.023 79.5q4.477-2 22.977-4 28.344 0 48.672 20.361Q549-508.279 549-479.889q0 28.389-20.361 48.389-20.36 20-48.75 20Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M609.824-771.5q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm0 660q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm160-520q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm0 380q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25Zm60-190q-15.824 0-27.074-11.426-11.25-11.426-11.25-27.25t11.426-27.324q11.426-11.5 27.25-11.5t27.324 11.676q11.5 11.676 11.5 27.5t-11.676 27.074q-11.676 11.25-27.5 11.25ZM480-81.5q-82.481 0-155.275-31.304-72.794-31.305-126.706-85.219-53.913-53.915-85.216-126.711Q81.5-397.531 81.5-480.016q0-82.484 31.303-155.273 31.303-72.79 85.216-126.699 53.912-53.909 126.706-85.461Q397.519-879 480-879v60q-141.5 0-240 98.562Q141.5-621.875 141.5-480t98.312 240.188Q338.125-141.5 480-141.5v60Zm-.111-330q-28.389 0-48.389-20.078-20-20.078-20-48.422 0-5.938.75-12.441.75-6.503 3.25-11.808L336-584l40-40.5 81.023 79.5q4.477-2 22.977-4 28.344 0 48.672 20.361Q549-508.279 549-479.889q0 28.389-20.361 48.389-20.36 20-48.75 20Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M504.5-45q-92 0-169.75-46T210-216.5l-147.5-247 19-19.5q15-15 36-16.5T156-489l129 93v-410.5q0-10.925 8.154-19.713 8.153-8.787 20.75-8.787 11.096 0 19.846 8.787 8.75 8.788 8.75 19.713v522l-185-134L258-250q37.5 68.5 103.318 108 65.817 39.5 143.182 39.5 112.792 0 192.896-78.104Q777.5-258.708 777.5-371v-395.688q0-10.812 8.154-19.562 8.153-8.75 20.75-8.75 11.096 0 19.846 8.787Q835-777.425 835-766.5V-371q0 136-96.832 231Q641.335-45 504.5-45Zm-55-446.5v-395q0-10.925 8.654-19.713 8.653-8.787 20.25-8.787 12.096 0 20.346 8.787Q507-897.425 507-886.5v395h-57.5Zm164.5 0v-355q0-10.925 8.154-19.713 8.153-8.787 20.75-8.787 11.096 0 19.846 8.787 8.75 8.788 8.75 19.713v355H614ZM468-297Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M504.5-45q-92 0-169.75-46T210-216.5l-147.5-247 19-19.5q15-15 36-16.5T156-489l129 93v-410.5q0-10.925 8.154-19.713 8.153-8.787 20.75-8.787 11.096 0 19.846 8.787 8.75 8.788 8.75 19.713v522l-185-134L258-250q37.5 68.5 103.318 108 65.817 39.5 143.182 39.5 112.792 0 192.896-78.104Q777.5-258.708 777.5-371v-395.688q0-10.812 8.154-19.562 8.153-8.75 20.75-8.75 11.096 0 19.846 8.787Q835-777.425 835-766.5V-371q0 136-96.832 231Q641.335-45 504.5-45Zm-55-446.5v-395q0-10.925 8.654-19.713 8.653-8.787 20.25-8.787 12.096 0 20.346 8.787Q507-897.425 507-886.5v395h-57.5Zm164.5 0v-355q0-10.925 8.154-19.713 8.153-8.787 20.75-8.787 11.096 0 19.846 8.787 8.75 8.788 8.75 19.713v355H614ZM468-297Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 782 B After Width: | Height: | Size: 782 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M428 706.25q9 8.75 20.75 8.75t20.718-8.937L559.25 616.5l90.782 90.563Q659 716 670.25 716t20.25-8.75q9-8.75 9-20.75t-8.937-20.937L600 576l89.563-90.063Q698.5 477.5 698.5 466q0-11.5-9-20.25T668.75 437q-11.75 0-20.687 8.437L559.5 535.5l-91.063-91.063Q459.5 436 448.25 436.5 437 437 428 445t-9 20.25q0 12.25 8.937 20.687L519 576l-91 89.563q-8 8.937-8 20.904 0 11.966 8 19.783ZM362.19 852q-22.19 0-40.31-11.5Q303.761 829 291.5 811L148.135 609.333Q137 595.5 137 576.634T148 542l143.5-201q12.333-18 30.386-29.5Q339.939 300 362 300h416q23.719 0 40.609 16.891Q835.5 333.781 835.5 357.5v437q0 23.719-16.891 40.609Q801.719 852 778 852H362.19ZM197 576l152.952 218.5H778v-437H350L197 576Zm581 0V357.5v437V576Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M428 706.25q9 8.75 20.75 8.75t20.718-8.937L559.25 616.5l90.782 90.563Q659 716 670.25 716t20.25-8.75q9-8.75 9-20.75t-8.937-20.937L600 576l89.563-90.063Q698.5 477.5 698.5 466q0-11.5-9-20.25T668.75 437q-11.75 0-20.687 8.437L559.5 535.5l-91.063-91.063Q459.5 436 448.25 436.5 437 437 428 445t-9 20.25q0 12.25 8.937 20.687L519 576l-91 89.563q-8 8.937-8 20.904 0 11.966 8 19.783ZM362.19 852q-22.19 0-40.31-11.5Q303.761 829 291.5 811L148.135 609.333Q137 595.5 137 576.634T148 542l143.5-201q12.333-18 30.386-29.5Q339.939 300 362 300h416q23.719 0 40.609 16.891Q835.5 333.781 835.5 357.5v437q0 23.719-16.891 40.609Q801.719 852 778 852H362.19ZM197 576l152.952 218.5H778v-437H350L197 576Zm581 0V357.5v437V576Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 800 B After Width: | Height: | Size: 800 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M251.5 891.5q-84.552 0-145.526-60.935Q45 769.63 45 684.253 45 608 94.25 549.5q49.25-58.5 126.25-70 18.824-95.893 92.113-156.947Q385.901 261.5 482 261.5q111.657 0 186.829 80.414Q744 422.329 744 534v26q71.5-3 121.25 44.75T915 725.392q0 67.795-49.125 116.951Q816.75 891.5 749.5 891.5H509q-22.969 0-40.234-17.266Q451.5 856.969 451.5 834V575.5l-63.5 63q-9 9-20.25 8.5T348 637.5q-9-8.5-9-20.25t9-20.75l111.973-112.473q4.607-4.527 9.6-6.777 4.994-2.25 10.7-2.25 5.707 0 10.467 2.25 4.76 2.25 9.285 6.775l113.43 113.43Q622 606 622 617.5q0 11.5-8.5 20-9.111 9-20.806 9-11.694 0-20.194-9l-63.5-62V834h240.5q43.87 0 75.935-31.645Q857.5 770.71 857.5 725.75q0-44.75-31.819-76.42-31.819-31.671-76.556-31.671H686.5V534.5q0-88.378-60.036-151.939Q566.428 319 478.087 319q-88.342 0-148.892 63.561-60.549 63.561-60.549 151.939h-19.018q-61.628 0-104.378 43T102.5 684q0 61.5 43.679 105.75Q189.857 834 251.5 834H365q12.25 0 20.625 8.463T394 862.675q0 12.325-8.375 20.575T365 891.5H251.5Zm228.5-287Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M251.5 891.5q-84.552 0-145.526-60.935Q45 769.63 45 684.253 45 608 94.25 549.5q49.25-58.5 126.25-70 18.824-95.893 92.113-156.947Q385.901 261.5 482 261.5q111.657 0 186.829 80.414Q744 422.329 744 534v26q71.5-3 121.25 44.75T915 725.392q0 67.795-49.125 116.951Q816.75 891.5 749.5 891.5H509q-22.969 0-40.234-17.266Q451.5 856.969 451.5 834V575.5l-63.5 63q-9 9-20.25 8.5T348 637.5q-9-8.5-9-20.25t9-20.75l111.973-112.473q4.607-4.527 9.6-6.777 4.994-2.25 10.7-2.25 5.707 0 10.467 2.25 4.76 2.25 9.285 6.775l113.43 113.43Q622 606 622 617.5q0 11.5-8.5 20-9.111 9-20.806 9-11.694 0-20.194-9l-63.5-62V834h240.5q43.87 0 75.935-31.645Q857.5 770.71 857.5 725.75q0-44.75-31.819-76.42-31.819-31.671-76.556-31.671H686.5V534.5q0-88.378-60.036-151.939Q566.428 319 478.087 319q-88.342 0-148.892 63.561-60.549 63.561-60.549 151.939h-19.018q-61.628 0-104.378 43T102.5 684q0 61.5 43.679 105.75Q189.857 834 251.5 834H365q12.25 0 20.625 8.463T394 862.675q0 12.325-8.375 20.575T365 891.5H251.5Zm228.5-287Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M313.5 964.5q-12.475 0-20.487-8.013Q285 948.475 285 936V279.5q0-12.475 8.013-20.487Q301.025 251 313.5 251H402v-35q0-12.475 8.013-20.487 8.012-8.013 20.487-8.013H530q11.975 0 20.237 8.013Q558.5 203.525 558.5 216v35H647q11.975 0 20.237 8.013 8.263 8.012 8.263 20.487V936q0 12.475-8.263 20.487Q658.975 964.5 647 964.5H313.5Zm29-228.5H618V308.5H342.5V736Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M313.5 964.5q-12.475 0-20.487-8.013Q285 948.475 285 936V279.5q0-12.475 8.013-20.487Q301.025 251 313.5 251H402v-35q0-12.475 8.013-20.487 8.012-8.013 20.487-8.013H530q11.975 0 20.237 8.013Q558.5 203.525 558.5 216v35H647q11.975 0 20.237 8.013 8.263 8.012 8.263 20.487V936q0 12.475-8.263 20.487Q658.975 964.5 647 964.5H313.5Zm29-228.5H618V308.5H342.5V736Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 455 B After Width: | Height: | Size: 455 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M313.5 964.5q-12.475 0-20.487-8.013Q285 948.475 285 936V279.5q0-12.475 8.013-20.487Q301.025 251 313.5 251H402v-35q0-12.475 8.013-20.487 8.012-8.013 20.487-8.013H530q11.975 0 20.237 8.013Q558.5 203.525 558.5 216v35H647q11.975 0 20.237 8.013 8.263 8.012 8.263 20.487V936q0 12.475-8.263 20.487Q658.975 964.5 647 964.5H313.5Zm29-314H618v-342H342.5v342Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M313.5 964.5q-12.475 0-20.487-8.013Q285 948.475 285 936V279.5q0-12.475 8.013-20.487Q301.025 251 313.5 251H402v-35q0-12.475 8.013-20.487 8.012-8.013 20.487-8.013H530q11.975 0 20.237 8.013Q558.5 203.525 558.5 216v35H647q11.975 0 20.237 8.013 8.263 8.012 8.263 20.487V936q0 12.475-8.263 20.487Q658.975 964.5 647 964.5H313.5Zm29-314H618v-342H342.5v342Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 452 B After Width: | Height: | Size: 452 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="48" viewBox="0 -960 960 960" width="48"><path d="M451-98v-313L257.5-217.5 217-258l222.5-222L217-702.5l40.5-40.5L451-549.5v-313h28.5L691-651 520-480.5l171 171L479.5-98H451Zm57.5-451.5 102-101.5-102-99.5v201Zm0 339.5 102-99.5-102-101.5v201Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M451-98v-313L257.5-217.5 217-258l222.5-222L217-702.5l40.5-40.5L451-549.5v-313h28.5L691-651 520-480.5l171 171L479.5-98H451Zm57.5-451.5 102-101.5-102-99.5v201Zm0 339.5 102-99.5-102-101.5v201Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 295 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#5f6368"><path d="M124-382q-9.5 0-15.25-6T103-403q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm0-155q-9.5 0-15.25-6T103-558q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm117.96 332.5q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77 10.59-10.89 26.5-10.89t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-161q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77 10.59-10.89 26.5-10.89t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-154.5q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77Q225.68-595 241.59-595t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77Q257.91-520 241.96-520Zm0-161q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77Q225.68-756 241.59-756t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77Q257.91-681 241.96-681Zm160.91 331q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44Q456-425.12 456-403.06q0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm0-154.5q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44Q456-579.62 456-557.56q0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm.09 300q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77 10.59-10.89 26.5-10.89t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-476.5q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77Q386.68-756 402.59-756t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77Q418.91-681 402.96-681Zm.04 578q-9.5 0-15.25-6T382-124q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm0-712.5q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6ZM557.37-350q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44 15.75 15.44 15.75 37.5 0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm0-154.5q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44 15.75 15.44 15.75 37.5 0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm.09 300q-15.96 0-26.71-10.74Q520-225.97 520-241.84q0-15.87 10.59-26.77 10.59-10.89 26.5-10.89T584-268.76q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-476.5q-15.96 0-26.71-10.74Q520-702.47 520-718.34q0-15.87 10.59-26.77Q541.18-756 557.09-756T584-745.26q11 10.73 11 26.6 0 15.87-10.79 26.77Q573.41-681 557.46-681ZM564-103q-9.5 0-15.25-6T543-124q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm-6-712.5q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm160.46 611q-15.96 0-26.71-10.74Q681-225.97 681-241.84q0-15.87 10.59-26.77 10.59-10.89 26.5-10.89T745-268.76q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-161q-15.96 0-26.71-10.74Q681-386.97 681-402.84q0-15.87 10.59-26.77 10.59-10.89 26.5-10.89T745-429.76q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-154.5q-15.96 0-26.71-10.74Q681-541.47 681-557.34q0-15.87 10.59-26.77Q702.18-595 718.09-595T745-584.26q11 10.73 11 26.6 0 15.87-10.79 26.77Q734.41-520 718.46-520Zm0-161q-15.96 0-26.71-10.74Q681-702.47 681-718.34q0-15.87 10.59-26.77Q702.18-756 718.09-756T745-745.26q11 10.73 11 26.6 0 15.87-10.79 26.77Q734.41-681 718.46-681ZM836.5-382q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm0-155q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22" fill="#5f6368"><path d="M124-382q-9.5 0-15.25-6T103-403q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm0-155q-9.5 0-15.25-6T103-558q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm117.96 332.5q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77 10.59-10.89 26.5-10.89t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-161q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77 10.59-10.89 26.5-10.89t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-154.5q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77Q225.68-595 241.59-595t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77Q257.91-520 241.96-520Zm0-161q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77Q225.68-756 241.59-756t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77Q257.91-681 241.96-681Zm160.91 331q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44Q456-425.12 456-403.06q0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm0-154.5q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44Q456-579.62 456-557.56q0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm.09 300q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77 10.59-10.89 26.5-10.89t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-476.5q-15.96 0-26.71-10.74-10.75-10.73-10.75-26.6 0-15.87 10.59-26.77Q386.68-756 402.59-756t26.91 10.74q11 10.73 11 26.6 0 15.87-10.79 26.77Q418.91-681 402.96-681Zm.04 578q-9.5 0-15.25-6T382-124q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm0-712.5q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6ZM557.37-350q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44 15.75 15.44 15.75 37.5 0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm0-154.5q-21.87 0-37.37-15.44-15.5-15.44-15.5-37.5 0-22.06 15.42-37.56 15.43-15.5 37.46-15.5 21.62 0 37.37 15.44 15.75 15.44 15.75 37.5 0 22.06-15.63 37.56-15.63 15.5-37.5 15.5Zm.09 300q-15.96 0-26.71-10.74Q520-225.97 520-241.84q0-15.87 10.59-26.77 10.59-10.89 26.5-10.89T584-268.76q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-476.5q-15.96 0-26.71-10.74Q520-702.47 520-718.34q0-15.87 10.59-26.77Q541.18-756 557.09-756T584-745.26q11 10.73 11 26.6 0 15.87-10.79 26.77Q573.41-681 557.46-681ZM564-103q-9.5 0-15.25-6T543-124q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm-6-712.5q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm160.46 611q-15.96 0-26.71-10.74Q681-225.97 681-241.84q0-15.87 10.59-26.77 10.59-10.89 26.5-10.89T745-268.76q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-161q-15.96 0-26.71-10.74Q681-386.97 681-402.84q0-15.87 10.59-26.77 10.59-10.89 26.5-10.89T745-429.76q11 10.73 11 26.6 0 15.87-10.79 26.77-10.8 10.89-26.75 10.89Zm0-154.5q-15.96 0-26.71-10.74Q681-541.47 681-557.34q0-15.87 10.59-26.77Q702.18-595 718.09-595T745-584.26q11 10.73 11 26.6 0 15.87-10.79 26.77Q734.41-520 718.46-520Zm0-161q-15.96 0-26.71-10.74Q681-702.47 681-718.34q0-15.87 10.59-26.77Q702.18-756 718.09-756T745-745.26q11 10.73 11 26.6 0 15.87-10.79 26.77Q734.41-681 718.46-681ZM836.5-382q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Zm0-155q-9.5 0-15.25-6t-5.75-15q0-9 5.75-15t15.25-6q9 0 15 6t6 15q0 9-6 15t-15 6Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M391.5-161 675-501.5H493.5L530-791 272.5-419h155l-36 258Zm-30-200.5H217q-17.372 0-25.186-15.25t2.686-29.75l338.5-489q7-10.5 18.75-14.25T575-909q11 5 17.75 15.92T598-870.5L558.5-559H736q18.362 0 25.931 16.25Q769.5-526.5 758-512L386.5-66q-8.442 9.905-19.971 12.702Q355-50.5 344-55.75q-11-4.75-16.75-15.375T323.5-94l38-267.5Zm112-114Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M391.5-161 675-501.5H493.5L530-791 272.5-419h155l-36 258Zm-30-200.5H217q-17.372 0-25.186-15.25t2.686-29.75l338.5-489q7-10.5 18.75-14.25T575-909q11 5 17.75 15.92T598-870.5L558.5-559H736q18.362 0 25.931 16.25Q769.5-526.5 758-512L386.5-66q-8.442 9.905-19.971 12.702Q355-50.5 344-55.75q-11-4.75-16.75-15.375T323.5-94l38-267.5Zm112-114Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 437 B After Width: | Height: | Size: 437 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M361.5 694.5H217q-17.5 0-25.25-15.25t2.75-29.75l338.5-489q7-10.5 18.75-14.25T575 147q11 5 17.75 15.75T598 185.5L558.5 497H736q18 0 25.75 16.25T758 544L386.5 990q-8 10-19.75 12.75T344 1000.5q-11-4.5-16.75-15.25T323.5 962l38-267.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M361.5 694.5H217q-17.5 0-25.25-15.25t2.75-29.75l338.5-489q7-10.5 18.75-14.25T575 147q11 5 17.75 15.75T598 185.5L558.5 497H736q18 0 25.75 16.25T758 544L386.5 990q-8 10-19.75 12.75T344 1000.5q-11-4.5-16.75-15.25T323.5 962l38-267.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 333 B After Width: | Height: | Size: 333 B |
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="24"
|
||||
height="22"
|
||||
viewBox="0 -960 960 960"
|
||||
width="24"
|
||||
width="22"
|
||||
version="1.1"
|
||||
id="svg864"
|
||||
sodipodi:docname="ic_bolt_off.svg"
|
||||
|
||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="48" viewBox="0 -960 960 960" width="48"><path d="M653-454.5V-512h142.5v57.5H653Zm32.5 290-117-86 32.5-45 117 86-32.5 45Zm-84.5-500-32.5-45 117-86 32.5 45-117 86ZM125-363v-234h157.5l196-196v626l-196-196H125Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M653-454.5V-512h142.5v57.5H653Zm32.5 290-117-86 32.5-45 117 86-32.5 45Zm-84.5-500-32.5-45 117-86 32.5 45-117 86ZM125-363v-234h157.5l196-196v626l-196-196H125Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M192 932q-13.15 0-21.075-7.888Q163 916.225 163 903.5v-50h-1q-16.5 0-27.5-11.25t-11-27.696V705.5q0-12.725 7.887-20.612Q139.275 677 152 677h51V367q0-63.175 46.376-105.588Q295.752 219 360.876 219 423 219 466 262.075q43 43.075 43 104.921V784q0 37.912 26.104 64.206 26.104 26.294 64.25 26.294 41.146 0 70.896-25.647T700 784V474.5h-51q-12.725 0-20.612-7.888Q620.5 458.725 620.5 446V337.246q0-17.246 11-28.246t28-11h.5v-50q0-12.725 7.888-20.612 7.887-7.888 20.612-7.888h80q12.575 0 20.787 7.888Q797.5 235.275 797.5 248v50h.5q16.5 0 27.75 11T837 337v109q0 12.725-8.069 20.612-8.069 7.888-20.431 7.888h-51V784q0 63.175-46.606 105.588Q664.288 932 599.164 932q-62.124 0-104.894-43.075T451.5 784.004V367q0-37.912-26.208-64.206-26.208-26.294-64.5-26.294-41.292 0-70.792 25.647T260.5 367v310h51q12.363 0 20.431 7.888Q340 692.775 340 705.5v108.808q0 16.692-11.138 27.942-11.137 11.25-27.849 11.25h-.513v50q0 12.725-8.213 20.612Q284.075 932 271.5 932H192Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M192 932q-13.15 0-21.075-7.888Q163 916.225 163 903.5v-50h-1q-16.5 0-27.5-11.25t-11-27.696V705.5q0-12.725 7.887-20.612Q139.275 677 152 677h51V367q0-63.175 46.376-105.588Q295.752 219 360.876 219 423 219 466 262.075q43 43.075 43 104.921V784q0 37.912 26.104 64.206 26.104 26.294 64.25 26.294 41.146 0 70.896-25.647T700 784V474.5h-51q-12.725 0-20.612-7.888Q620.5 458.725 620.5 446V337.246q0-17.246 11-28.246t28-11h.5v-50q0-12.725 7.888-20.612 7.887-7.888 20.612-7.888h80q12.575 0 20.787 7.888Q797.5 235.275 797.5 248v50h.5q16.5 0 27.75 11T837 337v109q0 12.725-8.069 20.612-8.069 7.888-20.431 7.888h-51V784q0 63.175-46.606 105.588Q664.288 932 599.164 932q-62.124 0-104.894-43.075T451.5 784.004V367q0-37.912-26.208-64.206-26.208-26.294-64.5-26.294-41.292 0-70.792 25.647T260.5 367v310h51q12.363 0 20.431 7.888Q340 692.775 340 705.5v108.808q0 16.692-11.138 27.942-11.137 11.25-27.849 11.25h-.513v50q0 12.725-8.213 20.612Q284.075 932 271.5 932H192Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M790.886 931Q671.5 931 552.5 871.75t-214-154.25q-95-95-154.5-213.965t-59.5-238.647q0-18.888 12.714-31.638Q149.929 220.5 169 220.5h136.5q13.611 0 24.056 9.25Q340 239 343 255l27 124q2 13.068-.75 24.534t-10.335 19.05L260.5 522.5q56 93 124.75 161.25T542.5 801l95.544-98q9.456-10.5 21.206-14.75T683 687l117.362 25.452q15.45 3.423 25.294 15.236Q835.5 739.5 835.5 755.5v131q0 19.071-12.747 31.786Q810.006 931 790.886 931ZM231.5 470l81-82L289 278H182.5q-.5 38.5 11.75 85.25T231.5 470ZM778 873.5v-107L676 745l-79.5 83.5q40 19 88.166 31t93.334 14Zm-182-45ZM231.5 470Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M790.886 931Q671.5 931 552.5 871.75t-214-154.25q-95-95-154.5-213.965t-59.5-238.647q0-18.888 12.714-31.638Q149.929 220.5 169 220.5h136.5q13.611 0 24.056 9.25Q340 239 343 255l27 124q2 13.068-.75 24.534t-10.335 19.05L260.5 522.5q56 93 124.75 161.25T542.5 801l95.544-98q9.456-10.5 21.206-14.75T683 687l117.362 25.452q15.45 3.423 25.294 15.236Q835.5 739.5 835.5 755.5v131q0 19.071-12.747 31.786Q810.006 931 790.886 931ZM231.5 470l81-82L289 278H182.5q-.5 38.5 11.75 85.25T231.5 470ZM778 873.5v-107L676 745l-79.5 83.5q40 19 88.166 31t93.334 14Zm-182-45ZM231.5 470Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 661 B After Width: | Height: | Size: 661 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M791.125-119.5q-120.582 0-240.627-59.741-120.045-59.741-216.032-155.565Q238.478-430.63 178.5-550.791q-59.978-120.161-59.978-240.8 0-21.21 14.422-35.668 14.422-14.459 35.817-14.459h136.5q17.676 0 30.273 10.805 12.597 10.804 16.553 30.391l27 120.174q2.718 16.176-.818 29.586-3.536 13.409-13.136 22.368l-99.372 98.481q54.565 89.652 120.581 155.159Q452.358-309.247 537-262.174l96.739-98.717q11.37-12.174 24.913-16.903 13.544-4.728 28.413-1.011l112.34 24.974q19.277 4.619 30.675 18.344 11.398 13.726 11.398 33.313v132.196q0 21.633-14.455 36.056-14.455 14.422-35.898 14.422ZM232.696-589.109l80.761-80.326-23.261-106.652H185.13q-.978 37.312 10.903 82.849 11.881 45.536 36.663 104.129Zm542.913 403.5v-106.043l-98.413-21.261-79.022 82.783q38.804 18.76 85.894 30.521t91.541 14Zm-178.174-44.282ZM232.696-589.109Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M791.125-119.5q-120.582 0-240.627-59.741-120.045-59.741-216.032-155.565Q238.478-430.63 178.5-550.791q-59.978-120.161-59.978-240.8 0-21.21 14.422-35.668 14.422-14.459 35.817-14.459h136.5q17.676 0 30.273 10.805 12.597 10.804 16.553 30.391l27 120.174q2.718 16.176-.818 29.586-3.536 13.409-13.136 22.368l-99.372 98.481q54.565 89.652 120.581 155.159Q452.358-309.247 537-262.174l96.739-98.717q11.37-12.174 24.913-16.903 13.544-4.728 28.413-1.011l112.34 24.974q19.277 4.619 30.675 18.344 11.398 13.726 11.398 33.313v132.196q0 21.633-14.455 36.056-14.455 14.422-35.898 14.422ZM232.696-589.109l80.761-80.326-23.261-106.652H185.13q-.978 37.312 10.903 82.849 11.881 45.536 36.663 104.129Zm542.913 403.5v-106.043l-98.413-21.261-79.022 82.783q38.804 18.76 85.894 30.521t91.541 14Zm-178.174-44.282ZM232.696-589.109Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 907 B After Width: | Height: | Size: 907 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M480 418q125 0 238.75 50.25T914 613.5q8 9.5 8.25 21t-8.365 20.059L821 748q-8 8-22.5 8.75t-23.094-5.843L662.5 666.5q-5.75-4.5-8.625-10.25T651 643.5V504.407q-41.839-15.957-85.419-22.432Q522 475.5 480.744 475.5q-42.256 0-85.75 6.5T309.5 504.5v139q0 6.385-2.75 12.442Q304 662 298 666.5l-113.453 84.454Q173 759.5 161 758.5q-12-1-21.5-10.5l-93.442-93.441Q37.5 646 37.75 634.5 38 623 46 613.5q81.5-95 195.25-145.25T480 418ZM247 528.5q-39.5 19-74.5 46t-67 57l58 60L247 630V528.5Zm461.5-4V624l87.5 66.5 59-59q-32-33.5-68.75-59t-77.75-48Zm-461.5 4Zm461.5-4Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M480 418q125 0 238.75 50.25T914 613.5q8 9.5 8.25 21t-8.365 20.059L821 748q-8 8-22.5 8.75t-23.094-5.843L662.5 666.5q-5.75-4.5-8.625-10.25T651 643.5V504.407q-41.839-15.957-85.419-22.432Q522 475.5 480.744 475.5q-42.256 0-85.75 6.5T309.5 504.5v139q0 6.385-2.75 12.442Q304 662 298 666.5l-113.453 84.454Q173 759.5 161 758.5q-12-1-21.5-10.5l-93.442-93.441Q37.5 646 37.75 634.5 38 623 46 613.5q81.5-95 195.25-145.25T480 418ZM247 528.5q-39.5 19-74.5 46t-67 57l58 60L247 630V528.5Zm461.5-4V624l87.5 66.5 59-59q-32-33.5-68.75-59t-77.75-48Zm-461.5 4Zm461.5-4Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 651 B After Width: | Height: | Size: 651 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M480 418q125 0 238.75 50.25T914 613.5q8 9.5 8.25 21t-8.25 20L821 748q-8 8-22.5 8.75t-23-5.75l-113-84.5q-6-4.5-8.75-10.25T651 643.5v-139q-42-16-85.5-22.5t-85-6.5q-42 0-85.5 6.5t-85.5 22.5v139q0 6.5-2.75 12.5T298 666.5L184.5 751q-11.5 8.5-23.5 7.5T139.5 748L46 654.5q-8.5-8.5-8.25-20t8.25-21q81.5-95 195.25-145.25T480 418Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M480 418q125 0 238.75 50.25T914 613.5q8 9.5 8.25 21t-8.25 20L821 748q-8 8-22.5 8.75t-23-5.75l-113-84.5q-6-4.5-8.75-10.25T651 643.5v-139q-42-16-85.5-22.5t-85-6.5q-42 0-85.5 6.5t-85.5 22.5v139q0 6.5-2.75 12.5T298 666.5L184.5 751q-11.5 8.5-23.5 7.5T139.5 748L46 654.5q-8.5-8.5-8.25-20t8.25-21q81.5-95 195.25-145.25T480 418Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 424 B After Width: | Height: | Size: 424 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M791 931q-119.5 0-238.5-59.25t-214-154.25q-95-95-154.5-214T124.5 265q0-18.5 13-31.5t31.5-13h136.5q14 0 24.25 9.25T343 255l27 124q2 13-.75 24.5t-10.25 19l-99 100q56 93 125 161.25T542.5 801l95.5-98q9.5-10.5 21.25-14.75T683 687l117.5 25.5q15 3 25 15t10 28v131q0 18.5-13 31.5T791 931Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M791 931q-119.5 0-238.5-59.25t-214-154.25q-95-95-154.5-214T124.5 265q0-18.5 13-31.5t31.5-13h136.5q14 0 24.25 9.25T343 255l27 124q2 13-.75 24.5t-10.25 19l-99 100q56 93 125 161.25T542.5 801l95.5-98q9.5-10.5 21.25-14.75T683 687l117.5 25.5q15 3 25 15t10 28v131q0 18.5-13 31.5T791 931Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 384 B After Width: | Height: | Size: 384 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M480.029 793Q551 793 602.75 741.941t51.75-122.5Q654.5 548 602.721 496q-51.78-52-122.75-52Q408 444 356.75 496.059t-51.25 123.5Q305.5 691 356.779 742q51.28 51 123.25 51ZM435.5 578.5l31-71.418Q470 498.5 480 499t13.5 9.082l30.159 70.418 65.923 27.581q9.418 4.161 9.418 13.79t-9.418 13.048L523.5 660l-30 69.918Q490 739 480 739.5t-13.5-8.582L435.5 660l-65.582-27.081Q360 629.5 360 619.871t9.918-13.79L435.5 578.5Zm-293 353q-22.969 0-40.234-17.266Q85 896.969 85 874V364.5q0-21.969 17.266-39.734Q119.531 307 142.5 307h147l54.91-66.5q7.59-10 19.106-15 11.515-5 24.984-5h183q13.469 0 24.984 5 11.516 5 19.516 15l54.5 66.5h147q21.969 0 39.734 17.766Q875 342.531 875 364.5V874q0 22.969-17.766 40.234Q839.469 931.5 817.5 931.5h-675Zm675-57.5V364.5h-675V874h675ZM480 618.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M480.029 793Q551 793 602.75 741.941t51.75-122.5Q654.5 548 602.721 496q-51.78-52-122.75-52Q408 444 356.75 496.059t-51.25 123.5Q305.5 691 356.779 742q51.28 51 123.25 51ZM435.5 578.5l31-71.418Q470 498.5 480 499t13.5 9.082l30.159 70.418 65.923 27.581q9.418 4.161 9.418 13.79t-9.418 13.048L523.5 660l-30 69.918Q490 739 480 739.5t-13.5-8.582L435.5 660l-65.582-27.081Q360 629.5 360 619.871t9.918-13.79L435.5 578.5Zm-293 353q-22.969 0-40.234-17.266Q85 896.969 85 874V364.5q0-21.969 17.266-39.734Q119.531 307 142.5 307h147l54.91-66.5q7.59-10 19.106-15 11.515-5 24.984-5h183q13.469 0 24.984 5 11.516 5 19.516 15l54.5 66.5h147q21.969 0 39.734 17.766Q875 342.531 875 364.5V874q0 22.969-17.766 40.234Q839.469 931.5 817.5 931.5h-675Zm675-57.5V364.5h-675V874h675ZM480 618.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 863 B After Width: | Height: | Size: 863 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="m480 616 129 129q8.5 8.5 20 8.5t20-8.5q8.5-8.5 8.5-20t-8.5-20L520 576l129-129q8.5-8.5 8.5-20t-8.5-20q-8.5-8.5-20-8.5t-20 8.5L480 536 351 407q-8.5-8.5-20-8.5t-20 8.5q-8.5 8.5-8.5 20t8.5 20l129 129-129 129q-8.5 8.5-8.5 20t8.5 20q8.5 8.5 20 8.5t20-8.5l129-129Zm.064 355q-80.971 0-153.129-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.977 85 656.953 85 576.064q0-81.971 31.263-154.129 31.263-72.159 85-125.547Q255 243 327.023 212q72.023-31 152.913-31 81.971 0 154.135 31.132 72.165 31.131 125.547 84.5Q813 350 844 422.023q31 72.023 31 153.913 0 80.97-31.013 153.129-31.013 72.159-84.5 125.797Q706 908.5 633.977 939.75 561.954 971 480.064 971Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="m480 616 129 129q8.5 8.5 20 8.5t20-8.5q8.5-8.5 8.5-20t-8.5-20L520 576l129-129q8.5-8.5 8.5-20t-8.5-20q-8.5-8.5-20-8.5t-20 8.5L480 536 351 407q-8.5-8.5-20-8.5t-20 8.5q-8.5 8.5-8.5 20t8.5 20l129 129-129 129q-8.5 8.5-8.5 20t8.5 20q8.5 8.5 20 8.5t20-8.5l129-129Zm.064 355q-80.971 0-153.129-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.977 85 656.953 85 576.064q0-81.971 31.263-154.129 31.263-72.159 85-125.547Q255 243 327.023 212q72.023-31 152.913-31 81.971 0 154.135 31.132 72.165 31.131 125.547 84.5Q813 350 844 422.023q31 72.023 31 153.913 0 80.97-31.013 153.129-31.013 72.159-84.5 125.797Q706 908.5 633.977 939.75 561.954 971 480.064 971Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 749 B After Width: | Height: | Size: 749 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M272 654.5h252q10.936 0 19.218-8.36t8.282-20.719q0-11.921-8.412-20.171Q534.675 597 523 597H271q-11.5 0-19.75 8.457-8.25 8.456-8.25 20.218 0 12.325 8.375 20.575T272 654.5Zm0-129h417.5q10.936 0 19.218-8.36T717 496.421q0-11.921-8.412-20.171Q700.175 468 688.5 468H271q-11.5 0-19.75 8.457-8.25 8.456-8.25 20.218 0 12.325 8.375 20.575T272 525.5Zm0-129h417.5q10.936 0 19.218-8.36T717 367.421q0-11.921-8.412-20.171Q700.175 339 688.5 339H271q-11.5 0-19.75 8.457-8.25 8.456-8.25 20.218 0 12.325 8.375 20.575T272 396.5ZM85 900V238q0-21.969 17.266-39.734Q119.531 180.5 142.5 180.5h675q21.969 0 39.734 17.766Q875 216.031 875 238v516q0 21.969-17.766 39.734Q839.469 811.5 817.5 811.5H242.206L133.5 920q-13.5 13.5-31 6.172T85 900Zm57.5-70.5L218 754h599.5V238h-675v591.5Zm0-591.5v591.5V238Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M272 654.5h252q10.936 0 19.218-8.36t8.282-20.719q0-11.921-8.412-20.171Q534.675 597 523 597H271q-11.5 0-19.75 8.457-8.25 8.456-8.25 20.218 0 12.325 8.375 20.575T272 654.5Zm0-129h417.5q10.936 0 19.218-8.36T717 496.421q0-11.921-8.412-20.171Q700.175 468 688.5 468H271q-11.5 0-19.75 8.457-8.25 8.456-8.25 20.218 0 12.325 8.375 20.575T272 525.5Zm0-129h417.5q10.936 0 19.218-8.36T717 367.421q0-11.921-8.412-20.171Q700.175 339 688.5 339H271q-11.5 0-19.75 8.457-8.25 8.456-8.25 20.218 0 12.325 8.375 20.575T272 396.5ZM85 900V238q0-21.969 17.266-39.734Q119.531 180.5 142.5 180.5h675q21.969 0 39.734 17.766Q875 216.031 875 238v516q0 21.969-17.766 39.734Q839.469 811.5 817.5 811.5H242.206L133.5 920q-13.5 13.5-31 6.172T85 900Zm57.5-70.5L218 754h599.5V238h-675v591.5Zm0-591.5v591.5V238Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 877 B After Width: | Height: | Size: 877 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M241.776-244.5 134-136.5q-13.5 13.5-31.25 6.359Q85-137.281 85-156.5V-818q0-22.969 17.266-40.234Q119.531-875.5 142.5-875.5h675q22.969 0 40.234 17.266Q875-840.969 875-818v516q0 22.969-17.266 40.234Q840.469-244.5 817.5-244.5H241.776ZM142.5-302h675v-516h-675v516Zm0 0v-516 516Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="M241.776-244.5 134-136.5q-13.5 13.5-31.25 6.359Q85-137.281 85-156.5V-818q0-22.969 17.266-40.234Q119.531-875.5 142.5-875.5h675q22.969 0 40.234 17.266Q875-840.969 875-818v516q0 22.969-17.266 40.234Q840.469-244.5 817.5-244.5H241.776ZM142.5-302h675v-516h-675v516Zm0 0v-516 516Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 379 B After Width: | Height: | Size: 379 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M378.46 795.5q-5.726 0-10.486-2-4.76-2-9.474-6.5L179.09 607.59q-8.59-8.59-8.59-21.09t8.411-21q8.41-8.5 20.25-8.5 11.839 0 20.41 8.571L378.5 724.5l360.937-360.937Q747.783 355 759.902 355q12.12 0 21.098 8.5 8.5 8.5 8.5 20.609 0 12.108-8.587 20.478L398.5 787q-4.794 4.5-9.554 6.5-4.76 2-10.486 2Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M378.46 795.5q-5.726 0-10.486-2-4.76-2-9.474-6.5L179.09 607.59q-8.59-8.59-8.59-21.09t8.411-21q8.41-8.5 20.25-8.5 11.839 0 20.41 8.571L378.5 724.5l360.937-360.937Q747.783 355 759.902 355q12.12 0 21.098 8.5 8.5 8.5 8.5 20.609 0 12.108-8.587 20.478L398.5 787q-4.794 4.5-9.554 6.5-4.76 2-10.486 2Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 397 B After Width: | Height: | Size: 397 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#5f6368"><path d="M421.5-300.5 701-580l-44.5-43.5-235 235-119-119L259-464l162.5 163.5ZM480.06-85q-80.97 0-153.13-31.26-72.15-31.27-125.79-85Q147.5-255 116.25-327.02 85-399.05 85-479.94q0-81.97 31.26-154.13 31.27-72.15 85-125.54Q255-813 327.02-844q72.03-31 152.92-31 81.97 0 154.13 31.13 72.17 31.13 125.55 84.5Q813-706 844-633.98q31 72.03 31 153.92 0 80.97-31.01 153.13-31.02 72.15-84.5 125.79Q706-147.5 633.98-116.25 561.95-85 480.06-85Zm-.09-57.5q140.53 0 239.03-98.97 98.5-98.96 98.5-238.5 0-140.53-98.47-239.03-98.46-98.5-239-98.5-139.53 0-238.53 98.47-99 98.46-99 239 0 139.53 98.97 238.53 98.96 99 238.5 99ZM480-480Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22" fill="#5f6368"><path d="M421.5-300.5 701-580l-44.5-43.5-235 235-119-119L259-464l162.5 163.5ZM480.06-85q-80.97 0-153.13-31.26-72.15-31.27-125.79-85Q147.5-255 116.25-327.02 85-399.05 85-479.94q0-81.97 31.26-154.13 31.27-72.15 85-125.54Q255-813 327.02-844q72.03-31 152.92-31 81.97 0 154.13 31.13 72.17 31.13 125.55 84.5Q813-706 844-633.98q31 72.03 31 153.92 0 80.97-31.01 153.13-31.02 72.15-84.5 125.79Q706-147.5 633.98-116.25 561.95-85 480.06-85Zm-.09-57.5q140.53 0 239.03-98.97 98.5-98.96 98.5-238.5 0-140.53-98.47-239.03-98.46-98.5-239-98.5-139.53 0-238.53 98.47-99 98.46-99 239 0 139.53 98.97 238.53 98.96 99 238.5 99ZM480-480Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 729 B After Width: | Height: | Size: 725 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="m421.5 667.5-97.557-98.057Q315 561 302.5 561q-12.5 0-22 9.5-9 9-9 21.5t8.824 20.824L401.5 735q8.318 9 19.909 9T442 735l237-237q9.5-9.5 9.5-22t-9.5-22.5q-10-8.5-23-8t-21.368 8.868L421.5 667.5ZM480 971q-80.907 0-153.065-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.913 85 656.825 85 576q0-81.907 31.263-154.065 31.263-72.159 85-125.547Q255 243 327.087 212 399.175 181 480 181q81.907 0 154.065 31.013 72.159 31.013 125.547 84.5Q813 350 844 422.087 875 494.175 875 576q0 80.906-31.013 153.065-31.013 72.159-84.5 125.797Q706 908.5 633.913 939.75 561.825 971 480 971Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="m421.5 667.5-97.557-98.057Q315 561 302.5 561q-12.5 0-22 9.5-9 9-9 21.5t8.824 20.824L401.5 735q8.318 9 19.909 9T442 735l237-237q9.5-9.5 9.5-22t-9.5-22.5q-10-8.5-23-8t-21.368 8.868L421.5 667.5ZM480 971q-80.907 0-153.065-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.913 85 656.825 85 576q0-81.907 31.263-154.065 31.263-72.159 85-125.547Q255 243 327.087 212 399.175 181 480 181q81.907 0 154.065 31.013 72.159 31.013 125.547 84.5Q813 350 844 422.087 875 494.175 875 576q0 80.906-31.013 153.065-31.013 72.159-84.5 125.797Q706 908.5 633.913 939.75 561.825 971 480 971Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 673 B After Width: | Height: | Size: 673 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M378.46 795.5q-5.726 0-10.486-2-4.76-2-9.474-6.5L179.09 607.59q-8.59-8.59-8.59-21.09t8.411-21q8.41-8.5 20.25-8.5 11.839 0 20.41 8.571L378.5 724.5l360.937-360.937Q747.783 355 759.902 355q12.12 0 21.098 8.5 8.5 8.5 8.5 20.609 0 12.108-8.587 20.478L398.5 787q-4.794 4.5-9.554 6.5-4.76 2-10.486 2Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M378.46 795.5q-5.726 0-10.486-2-4.76-2-9.474-6.5L179.09 607.59q-8.59-8.59-8.59-21.09t8.411-21q8.41-8.5 20.25-8.5 11.839 0 20.41 8.571L378.5 724.5l360.937-360.937Q747.783 355 759.902 355q12.12 0 21.098 8.5 8.5 8.5 8.5 20.609 0 12.108-8.587 20.478L398.5 787q-4.794 4.5-9.554 6.5-4.76 2-10.486 2Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 397 B After Width: | Height: | Size: 397 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M355.5 791.5q-8-9.5-8.5-20.75t8.434-20.184L531 575 354.434 398.434Q346.5 390.5 347 377.75t8.5-20.75q9.5-9.5 20.5-9t19.859 8.859L593.5 555q4.5 4.58 6.75 9.34t2.25 10.7q0 5.94-2.25 10.7-2.25 4.76-6.75 9.26L396.859 791.641Q388 800.5 376.5 800q-11.5-.5-21-8.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M355.5 791.5q-8-9.5-8.5-20.75t8.434-20.184L531 575 354.434 398.434Q346.5 390.5 347 377.75t8.5-20.75q9.5-9.5 20.5-9t19.859 8.859L593.5 555q4.5 4.58 6.75 9.34t2.25 10.7q0 5.94-2.25 10.7-2.25 4.76-6.75 9.26L396.859 791.641Q388 800.5 376.5 800q-11.5-.5-21-8.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 360 B After Width: | Height: | Size: 360 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M480.064 971q-80.971 0-153.129-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.977 85 656.953 85 576.064q0-81.971 31.263-154.129 31.263-72.159 85-125.547Q255 243 327.023 212q72.023-31 152.913-31 81.971 0 154.135 31.132 72.165 31.131 125.547 84.5Q813 350 844 422.023q31 72.023 31 153.913 0 80.97-31.013 153.129-31.013 72.159-84.5 125.797Q706 908.5 633.977 939.75 561.954 971 480.064 971Zm-.097-57.5Q620.5 913.5 719 814.533t98.5-238.5Q817.5 435.5 719.033 337t-239-98.5q-139.533 0-238.533 98.467t-99 239q0 139.533 98.967 238.533t238.5 99ZM480 576Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M480.064 971q-80.971 0-153.129-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.977 85 656.953 85 576.064q0-81.971 31.263-154.129 31.263-72.159 85-125.547Q255 243 327.023 212q72.023-31 152.913-31 81.971 0 154.135 31.132 72.165 31.131 125.547 84.5Q813 350 844 422.023q31 72.023 31 153.913 0 80.97-31.013 153.129-31.013 72.159-84.5 125.797Q706 908.5 633.977 939.75 561.954 971 480.064 971Zm-.097-57.5Q620.5 913.5 719 814.533t98.5-238.5Q817.5 435.5 719.033 337t-239-98.5q-139.533 0-238.533 98.467t-99 239q0 139.533 98.967 238.533t238.5 99ZM480 576Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 653 B After Width: | Height: | Size: 653 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M480.064 971q-80.971 0-153.129-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.977 85 656.953 85 576.064q0-81.971 31.263-154.129 31.263-72.159 85-125.547Q255 243 327.023 212q72.023-31 152.913-31 81.971 0 154.135 31.132 72.165 31.131 125.547 84.5Q813 350 844 422.023q31 72.023 31 153.913 0 80.97-31.013 153.129-31.013 72.159-84.5 125.797Q706 908.5 633.977 939.75 561.954 971 480.064 971Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M480.064 971q-80.971 0-153.129-31.263-72.159-31.263-125.797-85Q147.5 801 116.25 728.977 85 656.953 85 576.064q0-81.971 31.263-154.129 31.263-72.159 85-125.547Q255 243 327.023 212q72.023-31 152.913-31 81.971 0 154.135 31.132 72.165 31.131 125.547 84.5Q813 350 844 422.023q31 72.023 31 153.913 0 80.97-31.013 153.129-31.013 72.159-84.5 125.797Q706 908.5 633.977 939.75 561.954 971 480.064 971Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 495 B After Width: | Height: | Size: 495 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="m480 616.5-209 209q-9 9-20.25 9t-20.25-9q-9-9-9-20.25t9-20.25L440 575.5 230.5 366q-9-8.5-9-19.75t9-20.25q9-9 20.25-9t20.25 9l209 209.5 209-209q9-9 20.25-9t20.25 9q9 9 9 20.25t-9 20.25l-209 209L730 785.5q8.5 9 8.5 20.25T730 825.5q-9 9-20.25 9t-20.25-9L480 616.5Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="m480 616.5-209 209q-9 9-20.25 9t-20.25-9q-9-9-9-20.25t9-20.25L440 575.5 230.5 366q-9-8.5-9-19.75t9-20.25q9-9 20.25-9t20.25 9l209 209.5 209-209q9-9 20.25-9t20.25 9q9 9 9 20.25t-9 20.25l-209 209L730 785.5q8.5 9 8.5 20.25T730 825.5q-9 9-20.25 9t-20.25-9L480 616.5Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 365 B After Width: | Height: | Size: 365 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 96 960 960" width="24"><path d="M657.5 792.5q-9 9-20.5 8.5t-20-9.5q-9-8.5-9-20.5t9-21l176-176-175-175.5q-9-8.5-8.5-20.5t9.5-21q8.5-8.5 20.25-8.5T660 357l196 197q8 8.5 8 20.25T856 594L657.5 792.5Zm-356-3-197-196q-8.5-8-8.5-19.75t8.5-20.25L303 355q8.5-8.5 20.5-8.5t21 8.5q8.5 9 8.5 21t-8.5 20.5L167 574l175.5 175q8.5 9 8.5 20.5t-8.5 20q-9 9-20.75 9t-20.25-9Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 96 960 960" width="22"><path d="M657.5 792.5q-9 9-20.5 8.5t-20-9.5q-9-8.5-9-20.5t9-21l176-176-175-175.5q-9-8.5-8.5-20.5t9.5-21q8.5-8.5 20.25-8.5T660 357l196 197q8 8.5 8 20.25T856 594L657.5 792.5Zm-356-3-197-196q-8.5-8-8.5-19.75t8.5-20.25L303 355q8.5-8.5 20.5-8.5t21 8.5q8.5 9 8.5 21t-8.5 20.5L167 574l175.5 175q8.5 9 8.5 20.5t-8.5 20q-9 9-20.75 9t-20.25-9Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 428 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m291.5-89.5-40.5-40 229-229 229 229-40.5 40L480-278 291.5-89.5Zm188.5-513-229-229 40.5-40.5L480-683.5 668.5-872l40.5 40.5-229 229Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22"><path d="m291.5-89.5-40.5-40 229-229 229 229-40.5 40L480-278 291.5-89.5Zm188.5-513-229-229 40.5-40.5L480-683.5 668.5-872l40.5 40.5-229 229Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 236 B |