Make the whole items in advanced settings screen clickable, standarize paddings (#2314)

* Make sure the whole item in advanced settings screen triggers the toggle action

* Fix UI changes when setting `onChecked` actions to null.

* Fix padding in invite member list items

* Remove redundant `CheckableUserRow` alternatives.

* Use 4dp for padding instead

---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
This commit is contained in:
Jorge Martin Espinosa 2024-01-30 12:39:04 +01:00 committed by GitHub
parent 38fdef0388
commit 7686fbbd07
68 changed files with 230 additions and 305 deletions

View file

@ -23,10 +23,11 @@ import androidx.compose.ui.tooling.preview.Preview
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
import io.element.android.libraries.matrix.ui.components.CheckableMatrixUserRow import io.element.android.libraries.matrix.ui.components.CheckableUserRow
import io.element.android.libraries.matrix.ui.components.CheckableUnresolvedUserRow import io.element.android.libraries.matrix.ui.components.CheckableUserRowData
import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.getBestName
import io.element.android.libraries.usersearch.api.UserSearchResult import io.element.android.libraries.usersearch.api.UserSearchResult
@Composable @Composable
@ -36,23 +37,24 @@ fun SearchMultipleUsersResultItem(
onCheckedChange: (Boolean) -> Unit, onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
if (searchResult.isUnresolved) { val data = if (searchResult.isUnresolved) {
CheckableUnresolvedUserRow( CheckableUserRowData.Unresolved(
checked = isUserSelected,
modifier = modifier,
avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.UserListItem), avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.UserListItem),
id = searchResult.matrixUser.userId.value, id = searchResult.matrixUser.userId.value,
onCheckedChange = onCheckedChange,
) )
} else { } else {
CheckableMatrixUserRow( CheckableUserRowData.Resolved(
checked = isUserSelected, name = searchResult.matrixUser.getBestName(),
modifier = modifier, subtext = if (searchResult.matrixUser.displayName.isNullOrEmpty()) null else searchResult.matrixUser.userId.value,
matrixUser = searchResult.matrixUser, avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.UserListItem),
avatarSize = AvatarSize.UserListItem,
onCheckedChange = onCheckedChange,
) )
} }
CheckableUserRow(
checked = isUserSelected,
modifier = modifier,
data = data,
onCheckedChange = onCheckedChange,
)
} }
@Preview @Preview

View file

@ -66,8 +66,8 @@ fun AdvancedSettingsView(
}, },
trailingContent = ListItemContent.Switch( trailingContent = ListItemContent.Switch(
checked = state.isRichTextEditorEnabled, checked = state.isRichTextEditorEnabled,
onChange = { state.eventSink(AdvancedSettingsEvents.SetRichTextEditorEnabled(it)) },
), ),
onClick = { state.eventSink(AdvancedSettingsEvents.SetRichTextEditorEnabled(!state.isRichTextEditorEnabled)) }
) )
ListItem( ListItem(
headlineContent = { headlineContent = {
@ -78,8 +78,8 @@ fun AdvancedSettingsView(
}, },
trailingContent = ListItemContent.Switch( trailingContent = ListItemContent.Switch(
checked = state.isDeveloperModeEnabled, checked = state.isDeveloperModeEnabled,
onChange = { state.eventSink(AdvancedSettingsEvents.SetDeveloperModeEnabled(it)) },
), ),
onClick = { state.eventSink(AdvancedSettingsEvents.SetDeveloperModeEnabled(!state.isDeveloperModeEnabled)) }
) )
ListItem( ListItem(
headlineContent = { headlineContent = {
@ -90,8 +90,8 @@ fun AdvancedSettingsView(
}, },
trailingContent = ListItemContent.Switch( trailingContent = ListItemContent.Switch(
checked = state.isSendPublicReadReceiptsEnabled, checked = state.isSendPublicReadReceiptsEnabled,
onChange = { state.eventSink(AdvancedSettingsEvents.SetSendPublicReadReceiptsEnabled(it)) },
), ),
onClick = { state.eventSink(AdvancedSettingsEvents.SetSendPublicReadReceiptsEnabled(!state.isSendPublicReadReceiptsEnabled)) }
) )
} }

View file

@ -46,8 +46,8 @@ import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.CheckableUnresolvedUserRow
import io.element.android.libraries.matrix.ui.components.CheckableUserRow import io.element.android.libraries.matrix.ui.components.CheckableUserRow
import io.element.android.libraries.matrix.ui.components.CheckableUserRowData
import io.element.android.libraries.matrix.ui.components.SelectedUsersList import io.element.android.libraries.matrix.ui.components.SelectedUsersList
import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.getBestName import io.element.android.libraries.matrix.ui.model.getBestName
@ -186,18 +186,16 @@ private fun RoomInviteMembersSearchBar(
LazyColumn { LazyColumn {
itemsIndexed(results) { index, invitableUser -> itemsIndexed(results) { index, invitableUser ->
if (invitableUser.isUnresolved && !invitableUser.isAlreadyInvited && !invitableUser.isAlreadyJoined) { val notInvitedOrJoined = !(invitableUser.isAlreadyInvited || invitableUser.isAlreadyJoined)
CheckableUnresolvedUserRow( val isUnresolved = invitableUser.isUnresolved && notInvitedOrJoined
checked = invitableUser.isSelected, val enabled = isUnresolved || notInvitedOrJoined
val data = if (isUnresolved) {
CheckableUserRowData.Unresolved(
avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem),
id = invitableUser.matrixUser.userId.value, id = invitableUser.matrixUser.userId.value,
onCheckedChange = { onUserToggled(invitableUser.matrixUser) },
modifier = Modifier.fillMaxWidth()
) )
} else { } else {
CheckableUserRow( CheckableUserRowData.Resolved(
checked = invitableUser.isSelected,
enabled = !invitableUser.isAlreadyInvited && !invitableUser.isAlreadyJoined,
avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem),
name = invitableUser.matrixUser.getBestName(), name = invitableUser.matrixUser.getBestName(),
subtext = when { subtext = when {
@ -207,11 +205,16 @@ private fun RoomInviteMembersSearchBar(
// Otherwise show the ID, unless that's already used for their name // Otherwise show the ID, unless that's already used for their name
invitableUser.matrixUser.displayName.isNullOrEmpty().not() -> invitableUser.matrixUser.userId.value invitableUser.matrixUser.displayName.isNullOrEmpty().not() -> invitableUser.matrixUser.userId.value
else -> null else -> null
}, }
onCheckedChange = { onUserToggled(invitableUser.matrixUser) },
modifier = Modifier.fillMaxWidth()
) )
} }
CheckableUserRow(
checked = invitableUser.isSelected,
enabled = enabled,
data = data,
onCheckedChange = { onUserToggled(invitableUser.matrixUser) },
modifier = Modifier.fillMaxWidth()
)
if (index < results.lastIndex) { if (index < results.lastIndex) {
HorizontalDivider() HorizontalDivider()

View file

@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.material3.CheckboxColors import androidx.compose.material3.CheckboxColors
import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -57,7 +58,7 @@ fun Checkbox(
onCheckedChange(!checked) onCheckedChange(!checked)
} }
}, },
modifier = modifier, modifier = modifier.minimumInteractiveComponentSize(),
enabled = enabled, enabled = enabled,
colors = colors, colors = colors,
interactionSource = interactionSource, interactionSource = interactionSource,

View file

@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.material3.RadioButtonColors import androidx.compose.material3.RadioButtonColors
import androidx.compose.material3.RadioButtonDefaults import androidx.compose.material3.RadioButtonDefaults
import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -48,7 +49,7 @@ fun RadioButton(
androidx.compose.material3.RadioButton( androidx.compose.material3.RadioButton(
selected = selected, selected = selected,
onClick = onClick, onClick = onClick,
modifier = modifier, modifier = modifier.minimumInteractiveComponentSize(),
enabled = enabled, enabled = enabled,
colors = colors, colors = colors,
interactionSource = interactionSource, interactionSource = interactionSource,

View file

@ -23,6 +23,7 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.SwitchColors import androidx.compose.material3.SwitchColors
import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.SwitchDefaults
import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -52,7 +53,7 @@ fun Switch(
Material3Switch( Material3Switch(
checked = checked, checked = checked,
onCheckedChange = onCheckedChange, onCheckedChange = onCheckedChange,
modifier = modifier, modifier = modifier.minimumInteractiveComponentSize(),
enabled = enabled, enabled = enabled,
colors = colors, colors = colors,
interactionSource = interactionSource, interactionSource = interactionSource,

View file

@ -1,75 +0,0 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.matrix.ui.components
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.getBestName
@Composable
fun CheckableMatrixUserRow(
checked: Boolean,
matrixUser: MatrixUser,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier,
avatarSize: AvatarSize = AvatarSize.UserListItem,
enabled: Boolean = true,
) = CheckableUserRow(
checked = checked,
avatarData = matrixUser.getAvatarData(avatarSize),
name = matrixUser.getBestName(),
subtext = if (matrixUser.displayName.isNullOrEmpty()) null else matrixUser.userId.value,
modifier = modifier,
onCheckedChange = onCheckedChange,
enabled = enabled,
)
@PreviewsDayNight
@Composable
internal fun CheckableMatrixUserRowPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) = ElementPreview {
Column {
CheckableMatrixUserRow(
checked = true,
onCheckedChange = { },
matrixUser = matrixUser,
)
CheckableMatrixUserRow(
checked = false,
onCheckedChange = { },
matrixUser = matrixUser,
)
CheckableMatrixUserRow(
checked = true,
onCheckedChange = { },
matrixUser = matrixUser,
enabled = false,
)
CheckableMatrixUserRow(
checked = false,
onCheckedChange = { },
matrixUser = matrixUser,
enabled = false,
)
}
}

View file

@ -1,104 +0,0 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.matrix.ui.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.theme.components.Checkbox
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
import io.element.android.libraries.matrix.ui.model.getAvatarData
@Composable
fun CheckableUnresolvedUserRow(
checked: Boolean,
onCheckedChange: (Boolean) -> Unit,
avatarData: AvatarData,
id: String,
modifier: Modifier = Modifier,
enabled: Boolean = true,
) {
Row(
modifier = modifier
.fillMaxWidth()
.clickable(role = Role.Checkbox, enabled = enabled) {
onCheckedChange(!checked)
},
verticalAlignment = Alignment.CenterVertically,
) {
UnresolvedUserRow(
modifier = Modifier.weight(1f),
avatarData = avatarData,
id = id,
)
Checkbox(
modifier = Modifier.padding(end = 16.dp),
checked = checked,
onCheckedChange = null,
enabled = enabled,
)
}
}
@Preview
@Composable
internal fun CheckableUnresolvedUserRowPreview() = ElementThemedPreview {
val matrixUser = aMatrixUser()
Column {
CheckableUnresolvedUserRow(
checked = false,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
)
HorizontalDivider()
CheckableUnresolvedUserRow(
checked = true,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
)
HorizontalDivider()
CheckableUnresolvedUserRow(
checked = false,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
enabled = false,
)
HorizontalDivider()
CheckableUnresolvedUserRow(
checked = true,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
enabled = false,
)
}
}

View file

@ -17,24 +17,29 @@
package io.element.android.libraries.matrix.ui.components package io.element.android.libraries.matrix.ui.components
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.theme.components.Checkbox import io.element.android.libraries.designsystem.theme.components.Checkbox
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
import io.element.android.libraries.matrix.ui.model.getAvatarData
@Composable @Composable
fun CheckableUserRow( fun CheckableUserRow(
checked: Boolean, checked: Boolean,
onCheckedChange: (Boolean) -> Unit, onCheckedChange: (Boolean) -> Unit,
avatarData: AvatarData, data: CheckableUserRowData,
name: String,
subtext: String?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
enabled: Boolean = true, enabled: Boolean = true,
) { ) {
@ -46,19 +51,119 @@ fun CheckableUserRow(
}, },
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
UserRow( val rowModifier = Modifier.weight(1f)
modifier = Modifier.weight(1f), when (data) {
avatarData = avatarData, is CheckableUserRowData.Resolved -> {
name = name, UserRow(
subtext = subtext, modifier = rowModifier,
) avatarData = data.avatarData,
name = data.name,
subtext = data.subtext,
)
}
is CheckableUserRowData.Unresolved -> {
UnresolvedUserRow(
modifier = rowModifier,
avatarData = data.avatarData,
id = data.id,
)
}
}
Checkbox( Checkbox(
modifier = Modifier modifier = Modifier.padding(end = 4.dp),
.padding(end = 16.dp),
checked = checked, checked = checked,
onCheckedChange = null, onCheckedChange = null,
enabled = enabled, enabled = enabled,
) )
} }
} }
@Immutable
sealed interface CheckableUserRowData {
data class Resolved(
val avatarData: AvatarData,
val name: String,
val subtext: String?,
) : CheckableUserRowData
data class Unresolved(
val avatarData: AvatarData,
val id: String,
) : CheckableUserRowData
}
@Preview
@Composable
internal fun CheckableResolvedUserRowPreview() = ElementThemedPreview {
val matrixUser = aMatrixUser()
val data = CheckableUserRowData.Resolved(
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
name = matrixUser.displayName.orEmpty(),
subtext = matrixUser.userId.value,
)
Column {
CheckableUserRow(
checked = false,
onCheckedChange = { },
data = data,
)
HorizontalDivider()
CheckableUserRow(
checked = true,
onCheckedChange = { },
data = data,
)
HorizontalDivider()
CheckableUserRow(
checked = false,
onCheckedChange = { },
data = data,
enabled = false,
)
HorizontalDivider()
CheckableUserRow(
checked = true,
onCheckedChange = { },
data = data,
enabled = false,
)
}
}
@Preview
@Composable
internal fun CheckableUnresolvedUserRowPreview() = ElementThemedPreview {
val matrixUser = aMatrixUser()
val data = CheckableUserRowData.Unresolved(
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
)
Column {
CheckableUserRow(
checked = false,
onCheckedChange = { },
data = data,
)
HorizontalDivider()
CheckableUserRow(
checked = true,
onCheckedChange = { },
data = data,
)
HorizontalDivider()
CheckableUserRow(
checked = false,
onCheckedChange = { },
data = data,
enabled = false,
)
HorizontalDivider()
CheckableUserRow(
checked = true,
onCheckedChange = { },
data = data,
enabled = false,
)
}
}

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:6638cb923a57c8ee4a577626bef41c87da3ad5081a6bda6b4a303f094be30bfd oid sha256:6e66e3395d8ce9b9b98ba21c99a82111f3e007e31d5845524f3c19284f478a8c
size 23181 size 23232

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4ffb2f6bd00607dd9f84d9b9dd4014f4389d0a3dd73fea8881a867680c0aa47b oid sha256:9e0fee8d19a8522b34ec4ec3bbf8473284a01ec827aeb520f58b8df67079df53
size 22301 size 22367

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:748900111b5b9cb1235f979d889098366ed66a88e8078224ec2780feac47a2e8 oid sha256:0334ad25584ed508739fefb75a44d419d3904620e957c9ffa125985532d0bc10
size 86365 size 86328

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2fc96ed56a48c2feaaa712ce57253678d0d79f834423aa5b41315df9213b4da9 oid sha256:c3128ee234cf48f37fa0432f904d2e791614d20c82c16dc639edb849b42c4fe4
size 26277 size 26348

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a09f0d8c68fb4af7dcd239f342ec2d68b3d3af4720e27277d4bfd6e37c15541e oid sha256:4ceb2fe1dd526d36f90efe2bdcc4e4c5d407709fee053937ff8e53b760f85e0a
size 25141 size 25186

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f38cda30a54ee8b4c4f95e6303c9cca43b06fa0ce4c2d690c992b2037537453f oid sha256:1e55a3501da2a4217a245b7e6a9527ab5963a018dfc70aa2bce62c558f88f75b
size 35986 size 36138

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:41896059efcfa8b424cd80cf93f233a263498222a8a555b6eb8cfa9a5f62d941 oid sha256:4c5baa96c59c7e61f84be5e730c56a6f18b0f180fa4c2c7b9bd64e53b20d52b5
size 33347 size 33392

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1aaf3d3282191d2e775ef8c8184ed7c56fdc34f8649e1ff8e7ad9da8b8cb4a9d oid sha256:d659a2a7be6a053aa8c4468f2e833687de20248a6b2fd9dcd4a5d47ea54df20c
size 35806 size 35913

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7076ab247512b4b0c0e631d060e193af0f4d741e5819dcf891368b2b1f3cd890 oid sha256:4ddd2c2a6bec2701d8ca8ae755d31713d5dbfcbbe30642f636f0a8ce22712996
size 35739 size 35843

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:5168d33c67566213cab7f71ee0fc71f151172dc8c5065e302249c6bd01cb751c oid sha256:6cacbc497b8211b3c18cec602e24ecca799c07790c1c6766b91c2c84556161f5
size 33507 size 32322

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c264a1541965790ed5661a3a319e6d6a87e48cc85a95a3590d9595ad39deb760 oid sha256:b8cee12ff95d1ccfce0f4445a8e32cea154d8f956cf05888129c23f3d9fe43d5
size 36654 size 36865

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f65c369e8f8c9526910f375b1d4b7166d1025a143400c6d53f61f3ce6537d67f oid sha256:e08c52be5c9c77c5d3743522f4b2ac4d5dad5cebbaba11245202a9f0e2ca1ccb
size 49858 size 50275

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e89d557862545f7468cefd88593d0995c813dc8871a92c94552ce26f9ae4651b oid sha256:c54ea0c5ffdb094bea1fe07208a5ed9683f7104ca9d7c85a452c5f0983aeff47
size 33066 size 33119

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d0fa8bac7f79b1a4feb4b7e808afae0c6b897867539c234daa9faea1bf6daf6e oid sha256:bf6f825427bab3e344617e78971521a1cbbd2daaaf132334b8bd32335111c605
size 33021 size 33075

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c8f2cc0a8cf7303aef994db2d23efb83b7a8a1c74af39dcef61ae3cfd3277c65 oid sha256:144fe1c105acf228ddf28d29f141cff5eca275529e11e38877bdfc8c5a37065f
size 30350 size 29042

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:5dfc5747625a6743966a518dd693cd8c55899ca241005df8179167b1728c2589 oid sha256:e7e8b50a6e456b812b0ae5a58442361d85051951979634f89148e09812c0bada
size 32274 size 32312

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:19e89d8cab891198e62951c0b08ed1318a14347795a35b5e8d94f6358c9f1964 oid sha256:3105639c450f6f867cf5592c2cc5c029f20d01c31273ac2eb7680d8d9548f1c0
size 47052 size 47447

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:44096d9f97614b5e84cf5dd0d966f674b47b50da065daaaa4a70476b3ecdcf91 oid sha256:8cea32585e950298058338f5a195ac4a4699f04aa60adb5d794da26dbe43a64f
size 33908 size 33848

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:605ab2a5cc9b2b10c09908a2f9dd3629f1731742909936ae180c74855e32eed8 oid sha256:96db0b988e47a0e3cbaae3982561053f4c7a68a3d0f475c2723619cfce8f891a
size 37695 size 37959

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ccab888ebe0e5ed94f2cb00117e3d69a888ad656b985768dc08e7fddacdceee7 oid sha256:c4b244008a0a0946605641e26ac1ee2b2ed0d689af8e45223458cd06d54970cf
size 34011 size 33905

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1510614f000837b743b847e616f7e40e86a259846058c1c0ea7a41233392117b oid sha256:60dbf7ac48dc77b79f80c15ea811381ee5885e2c5f702e522e789f16672c694b
size 41239 size 41164

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ccab888ebe0e5ed94f2cb00117e3d69a888ad656b985768dc08e7fddacdceee7 oid sha256:c4b244008a0a0946605641e26ac1ee2b2ed0d689af8e45223458cd06d54970cf
size 34011 size 33905

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1510614f000837b743b847e616f7e40e86a259846058c1c0ea7a41233392117b oid sha256:60dbf7ac48dc77b79f80c15ea811381ee5885e2c5f702e522e789f16672c694b
size 41239 size 41164

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:44096d9f97614b5e84cf5dd0d966f674b47b50da065daaaa4a70476b3ecdcf91 oid sha256:8cea32585e950298058338f5a195ac4a4699f04aa60adb5d794da26dbe43a64f
size 33908 size 33848

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ef6d0fe324b2f622732cfbda77b55bd5debaf058eadd278f820a23de7c164103 oid sha256:ab4197e309e72fb1e486210ef92655b18814eb1f21e9cbcb1e6e60ec7fc8627a
size 31553 size 31463

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4af656ee89190d8b818e2dfa1c260afca60c4b5f3e24ec6f4d30fe0cd2ed267d oid sha256:103e9412a0a04a5c98290ef51670fbcfaf64b6d76e62fcecf486cb777c4373fa
size 34758 size 35088

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fddde23759a830f0e0ed9bab9d1754970ce2b2e8ffa78c02c458b090dbbb76aa oid sha256:41b7d2e99dc922af5990a87bea479cefa1da0a274e373d88b3505df0b13ff05a
size 30719 size 30622

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c78c34bc3f0df68b9130263ac5d35ac1c8b6f98a0e9aa0316461b473653dedc5 oid sha256:052a42e15095538d05231b73fd7f5259bd3782d1b280ef0726a0445a9dd719ad
size 36730 size 36640

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fddde23759a830f0e0ed9bab9d1754970ce2b2e8ffa78c02c458b090dbbb76aa oid sha256:41b7d2e99dc922af5990a87bea479cefa1da0a274e373d88b3505df0b13ff05a
size 30719 size 30622

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c78c34bc3f0df68b9130263ac5d35ac1c8b6f98a0e9aa0316461b473653dedc5 oid sha256:052a42e15095538d05231b73fd7f5259bd3782d1b280ef0726a0445a9dd719ad
size 36730 size 36640

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ef6d0fe324b2f622732cfbda77b55bd5debaf058eadd278f820a23de7c164103 oid sha256:ab4197e309e72fb1e486210ef92655b18814eb1f21e9cbcb1e6e60ec7fc8627a
size 31553 size 31463

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3a3cb6371045e712f494857cd35268724936558550e7dc41344581fd2a1936c3 oid sha256:1ed4d3d6c3148ea14e1680c9f7c3af86bc5158a3ffa8ce3f2b62283983bc91f4
size 31012 size 31166

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ee41b24ea7b2ca8b7c9fa568c0a66537ec9d39c7fc80bf99bfda1592156ec174 oid sha256:1a5a64aab614f944cef77887b0c9e848e4273d8e2acf0561aafd28a064767937
size 29041 size 29319

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ffb71a4dbd1324963ead4b188986a6c90dc6755a5d49e520c5aa74d3cce00384 oid sha256:ca0abf8c339aeb7ccaf6e6dd4482288bae180319dbf9f5c25b5ec65011c6838b
size 24290 size 24211

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:132d77ede5c96774b958b79ec3143c99a66734b04659796351a7b127ab3e2243 oid sha256:aa8dfdcdacf72109ab7b0944e3af0f7cbdd6ae2ad42429128f0885483baed011
size 22852 size 22630

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2d91c6228c80d1d38217e557552e18e64494a94d284de8702d07cc3793150406
size 29177

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eeb5b50675e186318458d0900b2d3872ec52710df8e25ba7b633a4be7e13c8da
size 28196

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:35d63106802f7bce6ddc7ae56a2b206120e9eba1459169480a10bcc5a0d3f9e3
size 29334

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e4c742ac4907f79f5830f2fed5fbacc4ae352e24fcf7e15b75f3f3d8ce85ab2
size 27151

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9ffaad9291e2a8bb3168b08365faac8417a77dbe1e39e94cd4f1d7dfb12ef7e4
size 54838

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3dd3995ea7bdf218f55d2883fade50c29558d2ed2faca318c8d18a0eb7f06a34 oid sha256:85ead49e9a818ddc9b337e8386b78d80dcb1723e8f77cb8fe4ce5278680eb6a9
size 116197 size 116251