Update dependency androidx.compose:compose-bom to v2024.09.00 (#3399)

* Update dependency androidx.compose:compose-bom to v2024.09.00

* Adapt code for changes.

* Workaround crash when closing the RTE

* Fix broken bottom sheet colors and shape

* Fix tons of warnings and deprecations

* Fix lint issues

* Fix more M3 update changes

* Update screenshots

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: ElementBot <benoitm+elementbot@element.io>
Co-authored-by: ganfra <francoisg@matrix.org>
Co-authored-by: ElementBot <android@element.io>
This commit is contained in:
renovate[bot] 2024-09-26 09:30:20 +02:00 committed by GitHub
parent 65fd0f59da
commit 0dac449fec
536 changed files with 1187 additions and 1148 deletions

View file

@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -36,6 +35,7 @@ import io.element.android.libraries.designsystem.atomic.organisms.InfoListOrgani
import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage
import io.element.android.libraries.designsystem.background.OnboardingBackground import io.element.android.libraries.designsystem.background.OnboardingBackground
import io.element.android.libraries.designsystem.components.BigIcon import io.element.android.libraries.designsystem.components.BigIcon
import io.element.android.libraries.designsystem.components.ClickableLinkText
import io.element.android.libraries.designsystem.components.PageTitle import io.element.android.libraries.designsystem.components.PageTitle
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@ -104,14 +104,9 @@ private fun AnalyticsOptInHeader(
bold = true, bold = true,
tagAndLink = LINK_TAG to AnalyticsConfig.POLICY_LINK, tagAndLink = LINK_TAG to AnalyticsConfig.POLICY_LINK,
) )
ClickableText( ClickableLinkText(
text = text, annotatedString = text,
onClick = { onClick = { onClickTerms() },
text
.getStringAnnotations(LINK_TAG, it, it)
.firstOrNull()
?.let { _ -> onClickTerms() }
},
modifier = Modifier modifier = Modifier
.padding(8.dp), .padding(8.dp),
style = ElementTheme.typography.fontBodyMdRegular style = ElementTheme.typography.fontBodyMdRegular

View file

@ -18,10 +18,10 @@ import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.squareup.anvil.annotations.ContributesBinding import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.lockscreen.impl.LockScreenConfig import io.element.android.features.lockscreen.impl.LockScreenConfig
import io.element.android.features.lockscreen.impl.R import io.element.android.features.lockscreen.impl.R

View file

@ -25,11 +25,11 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.ListItemDefaults
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -356,7 +356,7 @@ private fun EmojiReactionsRow(
.clickable( .clickable(
enabled = true, enabled = true,
onClick = onCustomReactionClick, onClick = onCustomReactionClick,
indication = rememberRipple(bounded = false, radius = emojiRippleRadius), indication = ripple(bounded = false, radius = emojiRippleRadius),
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() }
) )
) )
@ -433,7 +433,7 @@ private fun EmojiButton(
.clickable( .clickable(
enabled = true, enabled = true,
onClick = { onClick(emoji) }, onClick = { onClick(emoji) },
indication = rememberRipple(bounded = false, radius = emojiRippleRadius), indication = ripple(bounded = false, radius = emojiRippleRadius),
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() }
) )
) )

View file

@ -145,6 +145,7 @@ fun TimelineView(
key = { timelineItem -> timelineItem.identifier() }, key = { timelineItem -> timelineItem.identifier() },
) { timelineItem -> ) { timelineItem ->
TimelineItemRow( TimelineItemRow(
modifier = Modifier.animateItem(),
timelineItem = timelineItem, timelineItem = timelineItem,
timelineRoomInfo = state.timelineRoomInfo, timelineRoomInfo = state.timelineRoomInfo,
renderReadReceipts = state.renderReadReceipts, renderReadReceipts = state.renderReadReceipts,

View file

@ -16,7 +16,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -135,7 +135,7 @@ fun MessageEventBubble(
.combinedClickable( .combinedClickable(
onClick = onClick, onClick = onClick,
onLongClick = onLongClick, onLongClick = onLongClick,
indication = rememberRipple(), indication = ripple(),
interactionSource = interactionSource interactionSource = interactionSource
), ),
color = backgroundBubbleColor, color = backgroundBubbleColor,

View file

@ -15,7 +15,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -48,7 +48,7 @@ fun MessageStateEventContainer(
.combinedClickable( .combinedClickable(
onClick = onClick, onClick = onClick,
onLongClick = onLongClick, onLongClick = onLongClick,
indication = rememberRipple(), indication = ripple(),
interactionSource = interactionSource interactionSource = interactionSource
), ),
color = backgroundColor, color = backgroundColor,

View file

@ -15,8 +15,8 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -61,7 +61,7 @@ fun EmojiItem(
.clickable( .clickable(
enabled = true, enabled = true,
onClick = { onSelectEmoji(item) }, onClick = { onSelectEmoji(item) },
indication = rememberRipple(bounded = false, radius = emojiSize.toDp() / 2 + 10.dp), indication = ripple(bounded = false, radius = emojiSize.toDp() / 2 + 10.dp),
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() }
) )
.clearAndSetSemantics { .clearAndSetSemantics {

View file

@ -114,7 +114,7 @@ private fun ElementCallCategory(
validation = callUrlState.validator, validation = callUrlState.validator,
onValidationErrorMessage = stringResource(R.string.screen_advanced_settings_element_call_base_url_validation_error), onValidationErrorMessage = stringResource(R.string.screen_advanced_settings_element_call_base_url_validation_error),
displayValue = { value -> !isUsingDefaultUrl(value) }, displayValue = { value -> !isUsingDefaultUrl(value) },
keyboardOptions = KeyboardOptions.Default.copy(autoCorrect = false, keyboardType = KeyboardType.Uri), keyboardOptions = KeyboardOptions.Default.copy(autoCorrectEnabled = false, keyboardType = KeyboardType.Uri),
onChange = { state.eventSink(DeveloperSettingsEvents.SetCustomElementCallBaseUrl(it)) } onChange = { state.eventSink(DeveloperSettingsEvents.SetCustomElementCallBaseUrl(it)) }
) )
} }

View file

@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.consumeWindowInsets
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.foundation.text.ClickableText
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -24,6 +23,7 @@ import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.features.roomdetails.impl.R import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.core.bool.orTrue import io.element.android.libraries.core.bool.orTrue
import io.element.android.libraries.designsystem.components.ClickableLinkText
import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
@ -102,8 +102,8 @@ private fun RoomSpecificNotificationSettingsView(
underline = false, underline = false,
bold = true, bold = true,
) )
ClickableText( ClickableLinkText(
text = text, annotatedString = text,
onClick = { onClick = {
onShowGlobalNotifications() onShowGlobalNotifications()
}, },

View file

@ -23,8 +23,8 @@ import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -137,7 +137,7 @@ private fun RoomSummaryScaffoldRow(
val clickModifier = Modifier.combinedClickable( val clickModifier = Modifier.combinedClickable(
onClick = { onClick(room) }, onClick = { onClick(room) },
onLongClick = { onLongClick(room) }, onLongClick = { onLongClick(room) },
indication = rememberRipple(), indication = ripple(),
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() }
) )

View file

@ -116,7 +116,7 @@ fun RoomListFiltersView(
val zIndex = (if (previousFilters.value.contains(filterWithSelection.filter)) state.filterSelectionStates.size else 0) - i.toFloat() val zIndex = (if (previousFilters.value.contains(filterWithSelection.filter)) state.filterSelectionStates.size else 0) - i.toFloat()
RoomListFilterView( RoomListFilterView(
modifier = Modifier modifier = Modifier
.animateItemPlacement() .animateItem()
.zIndex(zIndex), .zIndex(zIndex),
roomListFilter = filterWithSelection.filter, roomListFilter = filterWithSelection.filter,
selected = filterWithSelection.isSelected, selected = filterWithSelection.isSelected,

View file

@ -24,7 +24,7 @@ media3 = "1.4.1"
camera = "1.3.4" camera = "1.3.4"
# Compose # Compose
compose_bom = "2024.08.00" compose_bom = "2024.09.00"
composecompiler = "1.5.15" composecompiler = "1.5.15"
# Coroutines # Coroutines

View file

@ -86,13 +86,13 @@ fun ElementLogoAtom(
.size(size.logoSize) .size(size.logoSize)
// Do the same double shadow than on Figma... // Do the same double shadow than on Figma...
.shadow( .shadow(
elevation = 25.dp, elevation = 35.dp,
clip = false, clip = false,
shape = CircleShape, shape = CircleShape,
ambientColor = logoShadowColor, ambientColor = logoShadowColor,
) )
.shadow( .shadow(
elevation = 25.dp, elevation = 35.dp,
clip = false, clip = false,
shape = CircleShape, shape = CircleShape,
ambientColor = Color(0x80000000), ambientColor = Color(0x80000000),

View file

@ -23,7 +23,7 @@ import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.ExperimentalTextApi import androidx.compose.ui.text.LinkAnnotation
import androidx.compose.ui.text.ParagraphStyle import androidx.compose.ui.text.ParagraphStyle
import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.TextLayoutResult
@ -37,6 +37,7 @@ import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.persistentMapOf
import timber.log.Timber
const val LINK_TAG = "URL" const val LINK_TAG = "URL"
@ -65,7 +66,6 @@ fun ClickableLinkText(
) )
} }
@OptIn(ExperimentalTextApi::class)
@Composable @Composable
fun ClickableLinkText( fun ClickableLinkText(
annotatedString: AnnotatedString, annotatedString: AnnotatedString,
@ -106,14 +106,18 @@ fun ClickableLinkText(
) { offset -> ) { offset ->
layoutResult.value?.let { layoutResult -> layoutResult.value?.let { layoutResult ->
val position = layoutResult.getOffsetForPosition(offset) val position = layoutResult.getOffsetForPosition(offset)
val linkUrlAnnotations = annotatedString.getUrlAnnotations(position, position) val linkUrlAnnotations = annotatedString.getLinkAnnotations(position, position)
.map { AnnotatedString.Range(it.item.url, it.start, it.end, linkAnnotationTag) } .map { AnnotatedString.Range(it.item, it.start, it.end, linkAnnotationTag) }
val linkStringAnnotations = linkUrlAnnotations + val linkStringAnnotations = linkUrlAnnotations +
annotatedString.getStringAnnotations(linkAnnotationTag, position, position) annotatedString.getStringAnnotations(linkAnnotationTag, position, position)
if (linkStringAnnotations.isEmpty()) { if (linkStringAnnotations.isEmpty()) {
onClick() onClick()
} else { } else {
uriHandler.openUri(linkStringAnnotations.first().item) when (val annotation = linkStringAnnotations.first().item) {
is LinkAnnotation.Url -> uriHandler.openUri(annotation.url)
is String -> uriHandler.openUri(annotation)
else -> Timber.e("Unknown link annotation: $annotation")
}
} }
} }
} }
@ -129,7 +133,6 @@ fun ClickableLinkText(
) )
} }
@OptIn(ExperimentalTextApi::class)
fun AnnotatedString.linkify(linkStyle: SpanStyle): AnnotatedString { fun AnnotatedString.linkify(linkStyle: SpanStyle): AnnotatedString {
val original = this val original = this
val spannable = SpannableString(this.text) val spannable = SpannableString(this.text)
@ -141,7 +144,7 @@ fun AnnotatedString.linkify(linkStyle: SpanStyle): AnnotatedString {
for (span in spans) { for (span in spans) {
val start = spannable.getSpanStart(span) val start = spannable.getSpanStart(span)
val end = spannable.getSpanEnd(span) val end = spannable.getSpanEnd(span)
if (original.getUrlAnnotations(start, end).isEmpty() && original.getStringAnnotations("URL", start, end).isEmpty()) { if (original.getLinkAnnotations(start, end).isEmpty() && original.getStringAnnotations("URL", start, end).isEmpty()) {
// Prevent linkifying domains in user or room handles (@user:domain.com, #room:domain.com) // Prevent linkifying domains in user or room handles (@user:domain.com, #room:domain.com)
if (start > 0 && !spannable[start - 1].isWhitespace()) continue if (start > 0 && !spannable[start - 1].isWhitespace()) continue
addStyle( addStyle(

View file

@ -14,9 +14,9 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -92,7 +92,7 @@ fun GradientFloatingActionButton(
enabled = true, enabled = true,
onClick = onClick, onClick = onClick,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(color = Color.White) indication = ripple(color = Color.White)
), ),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {

View file

@ -16,9 +16,9 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -45,7 +45,7 @@ fun MainActionButton(
enabled: Boolean = true, enabled: Boolean = true,
contentDescription: String = title, contentDescription: String = title,
) { ) {
val ripple = rememberRipple(bounded = false) val ripple = ripple(bounded = false)
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
Column( Column(
modifier modifier

View file

@ -16,11 +16,11 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -111,7 +111,7 @@ fun SuperButton(
enabled = enabled, enabled = enabled,
onClick = onClick, onClick = onClick,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple() indication = ripple()
) )
.padding(contentPadding), .padding(contentPadding),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center

View file

@ -13,8 +13,8 @@ import androidx.compose.foundation.layout.isImeVisible
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LocalLifecycleOwner
/** /**
* Inspired from https://stackoverflow.com/questions/68847559/how-can-i-detect-keyboard-opening-and-closing-in-jetpack-compose * Inspired from https://stackoverflow.com/questions/68847559/how-can-i-detect-keyboard-opening-and-closing-in-jetpack-compose

View file

@ -7,9 +7,9 @@
package io.element.android.libraries.designsystem.components.tooltip package io.element.android.libraries.designsystem.components.tooltip
import androidx.compose.material3.CaretScope
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.TooltipScope
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -19,7 +19,7 @@ import androidx.compose.material3.PlainTooltip as M3PlainTooltip
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun CaretScope.PlainTooltip( fun TooltipScope.PlainTooltip(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
contentColor: Color = ElementTheme.colors.textOnSolidPrimary, contentColor: Color = ElementTheme.colors.textOnSolidPrimary,
containerColor: Color = ElementTheme.colors.bgActionPrimaryRest, containerColor: Color = ElementTheme.colors.bgActionPrimaryRest,

View file

@ -7,8 +7,8 @@
package io.element.android.libraries.designsystem.components.tooltip package io.element.android.libraries.designsystem.components.tooltip
import androidx.compose.material3.CaretScope
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TooltipScope
import androidx.compose.material3.TooltipState import androidx.compose.material3.TooltipState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -19,7 +19,7 @@ import androidx.compose.material3.TooltipBox as M3TooltipBox
@Composable @Composable
fun TooltipBox( fun TooltipBox(
positionProvider: PopupPositionProvider, positionProvider: PopupPositionProvider,
tooltip: @Composable CaretScope.() -> Unit, tooltip: @Composable TooltipScope.() -> Unit,
state: TooltipState, state: TooltipState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
focusable: Boolean = true, focusable: Boolean = true,

View file

@ -8,8 +8,6 @@
package io.element.android.libraries.designsystem.modifiers package io.element.android.libraries.designsystem.modifiers
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.debugInspectorInfo
import androidx.compose.ui.platform.inspectable
/** /**
* Applies the [ifTrue] modifier when the [condition] is true, [ifFalse] otherwise. * Applies the [ifTrue] modifier when the [condition] is true, [ifFalse] otherwise.
@ -18,15 +16,8 @@ fun Modifier.applyIf(
condition: Boolean, condition: Boolean,
ifTrue: Modifier.() -> Modifier, ifTrue: Modifier.() -> Modifier,
ifFalse: (Modifier.() -> Modifier)? = null ifFalse: (Modifier.() -> Modifier)? = null
): Modifier = this then inspectable( ): Modifier = this then when {
inspectorInfo = debugInspectorInfo { condition -> ifTrue(Modifier)
name = "applyIf" ifFalse != null -> ifFalse(Modifier)
value = condition else -> Modifier
}
) {
this then when {
condition -> ifTrue(Modifier)
ifFalse != null -> ifFalse(Modifier)
else -> Modifier
}
} }

View file

@ -48,8 +48,7 @@ fun Modifier.blurredShapeShadow(
offsetX: Dp = 0.dp, offsetX: Dp = 0.dp,
offsetY: Dp = 0.dp, offsetY: Dp = 0.dp,
blurRadius: Dp = 0.dp, blurRadius: Dp = 0.dp,
) = then( ) = drawBehind {
drawBehind {
drawIntoCanvas { canvas -> drawIntoCanvas { canvas ->
val path = Path().apply { val path = Path().apply {
addRoundRect(RoundRect(Rect(Offset.Zero, size), CornerRadius(cornerRadius.toPx()))) addRoundRect(RoundRect(Rect(Offset.Zero, size), CornerRadius(cornerRadius.toPx())))
@ -78,8 +77,7 @@ fun Modifier.blurredShapeShadow(
) )
} }
} }
} }
)
fun Modifier.blurCompat( fun Modifier.blurCompat(
radius: Dp, radius: Dp,

View file

@ -12,10 +12,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
fun Modifier.clearFocusOnTap(focusManager: FocusManager): Modifier = then( fun Modifier.clearFocusOnTap(focusManager: FocusManager): Modifier = pointerInput(Unit) {
pointerInput(Unit) { detectTapGestures(onTap = {
detectTapGestures(onTap = { focusManager.clearFocus()
focusManager.clearFocus() })
}) }
}
)

View file

@ -45,8 +45,8 @@ fun BottomSheetDragHandle(
.fillMaxWidth() .fillMaxWidth()
.requiredHeight(72.dp) .requiredHeight(72.dp)
.offset(y = 18.dp) .offset(y = 18.dp)
.clip(MaterialTheme.shapes.extraLarge) .clip(MaterialTheme.shapes.large)
.background(MaterialTheme.colorScheme.background) .background(MaterialTheme.colorScheme.surface)
.border(0.5.dp, ElementTheme.colors.borderDisabled, MaterialTheme.shapes.extraLarge) .border(0.5.dp, ElementTheme.colors.borderDisabled, MaterialTheme.shapes.extraLarge)
) )

View file

@ -32,7 +32,7 @@ fun BottomSheetScaffold(
scaffoldState: BottomSheetScaffoldState = rememberBottomSheetScaffoldState(), scaffoldState: BottomSheetScaffoldState = rememberBottomSheetScaffoldState(),
sheetPeekHeight: Dp = BottomSheetDefaults.SheetPeekHeight, sheetPeekHeight: Dp = BottomSheetDefaults.SheetPeekHeight,
sheetShape: Shape = BottomSheetDefaults.ExpandedShape, sheetShape: Shape = BottomSheetDefaults.ExpandedShape,
sheetContainerColor: Color = BottomSheetDefaults.ContainerColor, sheetContainerColor: Color = MaterialTheme.colorScheme.surface,
sheetContentColor: Color = contentColorFor(sheetContainerColor), sheetContentColor: Color = contentColorFor(sheetContainerColor),
sheetTonalElevation: Dp = BottomSheetDefaults.Elevation, sheetTonalElevation: Dp = BottomSheetDefaults.Elevation,
sheetShadowElevation: Dp = BottomSheetDefaults.Elevation, sheetShadowElevation: Dp = BottomSheetDefaults.Elevation,

View file

@ -9,8 +9,10 @@ package io.element.android.libraries.designsystem.theme.components
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ProgressIndicatorDefaults import androidx.compose.material3.ProgressIndicatorDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
@ -25,12 +27,14 @@ fun CircularProgressIndicator(
progress: () -> Float, progress: () -> Float,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
color: Color = ProgressIndicatorDefaults.circularColor, color: Color = ProgressIndicatorDefaults.circularColor,
trackColor: Color = ProgressIndicatorDefaults.circularDeterminateTrackColor,
strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth
) { ) {
androidx.compose.material3.CircularProgressIndicator( androidx.compose.material3.CircularProgressIndicator(
modifier = modifier, modifier = modifier,
progress = progress, progress = progress,
color = color, color = color,
trackColor = trackColor,
strokeWidth = strokeWidth, strokeWidth = strokeWidth,
) )
} }
@ -39,6 +43,7 @@ fun CircularProgressIndicator(
fun CircularProgressIndicator( fun CircularProgressIndicator(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
color: Color = ProgressIndicatorDefaults.circularColor, color: Color = ProgressIndicatorDefaults.circularColor,
trackColor: Color = ProgressIndicatorDefaults.circularIndeterminateTrackColor,
strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth, strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth,
) { ) {
if (LocalInspectionMode.current) { if (LocalInspectionMode.current) {
@ -47,12 +52,14 @@ fun CircularProgressIndicator(
modifier = modifier, modifier = modifier,
progress = { 0.75F }, progress = { 0.75F },
color = color, color = color,
trackColor = trackColor,
strokeWidth = strokeWidth, strokeWidth = strokeWidth,
) )
} else { } else {
androidx.compose.material3.CircularProgressIndicator( androidx.compose.material3.CircularProgressIndicator(
modifier = modifier, modifier = modifier,
color = color, color = color,
trackColor = trackColor,
strokeWidth = strokeWidth, strokeWidth = strokeWidth,
) )
} }
@ -61,12 +68,18 @@ fun CircularProgressIndicator(
@Preview(group = PreviewGroup.Progress) @Preview(group = PreviewGroup.Progress)
@Composable @Composable
internal fun CircularProgressIndicatorPreview() = ElementThemedPreview(vertical = false) { internal fun CircularProgressIndicatorPreview() = ElementThemedPreview(vertical = false) {
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Column(
modifier = Modifier.padding(6.dp),
verticalArrangement = Arrangement.spacedBy(4.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// Indeterminate progress // Indeterminate progress
Text("Indeterminate")
CircularProgressIndicator() CircularProgressIndicator()
// Fixed progress // Fixed progress
Text("Fixed progress")
CircularProgressIndicator( CircularProgressIndicator(
progress = { 0.90F } progress = { 0.50F }
) )
} }
} }

View file

@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.BottomSheetDefaults
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SheetState import androidx.compose.material3.SheetState
import androidx.compose.material3.contentColorFor import androidx.compose.material3.contentColorFor
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
@ -42,12 +43,12 @@ fun ModalBottomSheet(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
sheetState: SheetState = rememberModalBottomSheetState(), sheetState: SheetState = rememberModalBottomSheetState(),
shape: Shape = BottomSheetDefaults.ExpandedShape, shape: Shape = BottomSheetDefaults.ExpandedShape,
containerColor: Color = BottomSheetDefaults.ContainerColor, containerColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(containerColor), contentColor: Color = contentColorFor(containerColor),
tonalElevation: Dp = if (ElementTheme.isLightTheme) 0.dp else BottomSheetDefaults.Elevation, tonalElevation: Dp = if (ElementTheme.isLightTheme) 0.dp else BottomSheetDefaults.Elevation,
scrimColor: Color = BottomSheetDefaults.ScrimColor, scrimColor: Color = BottomSheetDefaults.ScrimColor,
dragHandle: @Composable (() -> Unit)? = { BottomSheetDefaults.DragHandle() }, dragHandle: @Composable (() -> Unit)? = { BottomSheetDefaults.DragHandle() },
windowInsets: WindowInsets = BottomSheetDefaults.windowInsets, contentWindowInsets: @Composable () -> WindowInsets = { BottomSheetDefaults.windowInsets },
content: @Composable ColumnScope.() -> Unit, content: @Composable ColumnScope.() -> Unit,
) { ) {
val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState
@ -61,7 +62,7 @@ fun ModalBottomSheet(
tonalElevation = tonalElevation, tonalElevation = tonalElevation,
scrimColor = scrimColor, scrimColor = scrimColor,
dragHandle = dragHandle, dragHandle = dragHandle,
windowInsets = windowInsets, contentWindowInsets = contentWindowInsets,
content = content, content = content,
) )
} }

View file

@ -16,9 +16,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SearchBar
import androidx.compose.material3.SearchBarColors import androidx.compose.material3.SearchBarColors
import androidx.compose.material3.SearchBarDefaults import androidx.compose.material3.SearchBarDefaults
import androidx.compose.material3.TextFieldColors
import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
@ -56,8 +57,10 @@ fun <T> SearchBar(
tonalElevation: Dp = SearchBarDefaults.TonalElevation, tonalElevation: Dp = SearchBarDefaults.TonalElevation,
windowInsets: WindowInsets = SearchBarDefaults.windowInsets, windowInsets: WindowInsets = SearchBarDefaults.windowInsets,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
inactiveColors: SearchBarColors = ElementSearchBarDefaults.inactiveColors(), inactiveBarColors: SearchBarColors = ElementSearchBarDefaults.inactiveColors(),
activeColors: SearchBarColors = ElementSearchBarDefaults.activeColors(), activeBarColors: SearchBarColors = ElementSearchBarDefaults.activeColors(),
inactiveTextInputColors: TextFieldColors = ElementSearchBarDefaults.inactiveInputFieldColors(),
activeTextInputColors: TextFieldColors = ElementSearchBarDefaults.activeInputFieldColors(),
contentPrefix: @Composable ColumnScope.() -> Unit = {}, contentPrefix: @Composable ColumnScope.() -> Unit = {},
contentSuffix: @Composable ColumnScope.() -> Unit = {}, contentSuffix: @Composable ColumnScope.() -> Unit = {},
resultHandler: @Composable ColumnScope.(T) -> Unit = {}, resultHandler: @Composable ColumnScope.(T) -> Unit = {},
@ -69,51 +72,58 @@ fun <T> SearchBar(
focusManager.clearFocus() focusManager.clearFocus()
} }
androidx.compose.material3.SearchBar( SearchBar(
query = query, inputField = {
onQueryChange = onQueryChange, SearchBarDefaults.InputField(
onSearch = { focusManager.clearFocus() }, query = query,
active = active, onQueryChange = onQueryChange,
onActiveChange = onActiveChange, onSearch = { focusManager.clearFocus() },
modifier = modifier.padding(horizontal = if (!active) 16.dp else 0.dp), expanded = active,
enabled = enabled, onExpandedChange = onActiveChange,
placeholder = { enabled = enabled,
Text(text = placeHolderTitle) placeholder = {
}, Text(text = placeHolderTitle)
leadingIcon = if (showBackButton && active) { },
{ BackButton(onClick = { onActiveChange(false) }) } leadingIcon = if (showBackButton && active) {
} else { { BackButton(onClick = { onActiveChange(false) }) }
null } else {
}, null
trailingIcon = when { },
active && query.isNotEmpty() -> { trailingIcon = when {
{ active && query.isNotEmpty() -> {
IconButton(onClick = { onQueryChange("") }) { {
Icon( IconButton(onClick = { onQueryChange("") }) {
imageVector = CompoundIcons.Close(), Icon(
contentDescription = stringResource(CommonStrings.action_clear), imageVector = CompoundIcons.Close(),
) contentDescription = stringResource(CommonStrings.action_clear),
)
}
}
} }
}
}
!active -> { !active -> {
{ {
Icon( Icon(
imageVector = CompoundIcons.Search(), imageVector = CompoundIcons.Search(),
contentDescription = stringResource(CommonStrings.action_search), contentDescription = stringResource(CommonStrings.action_search),
tint = MaterialTheme.colorScheme.tertiary, tint = ElementTheme.materialColors.tertiary,
) )
} }
} }
else -> null else -> null
},
interactionSource = interactionSource,
colors = if (active) activeTextInputColors else inactiveTextInputColors,
)
}, },
expanded = active,
onExpandedChange = onActiveChange,
modifier = modifier.padding(horizontal = if (!active) 16.dp else 0.dp),
shape = shape, shape = shape,
colors = if (active) activeColors else inactiveColors, colors = if (active) activeBarColors else inactiveBarColors,
tonalElevation = tonalElevation, tonalElevation = tonalElevation,
windowInsets = windowInsets, windowInsets = windowInsets,
interactionSource = interactionSource,
content = { content = {
contentPrefix() contentPrefix()
when (resultState) { when (resultState) {
@ -128,7 +138,7 @@ fun <T> SearchBar(
Text( Text(
text = stringResource(CommonStrings.common_no_results), text = stringResource(CommonStrings.common_no_results),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.tertiary, color = ElementTheme.materialColors.tertiary,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
} }
@ -147,28 +157,34 @@ object ElementSearchBarDefaults {
@Composable @Composable
fun inactiveColors() = SearchBarDefaults.colors( fun inactiveColors() = SearchBarDefaults.colors(
containerColor = ElementTheme.materialColors.surfaceVariant, containerColor = ElementTheme.materialColors.surfaceVariant,
inputFieldColors = TextFieldDefaults.colors( dividerColor = ElementTheme.materialColors.outline,
unfocusedPlaceholderColor = ElementTheme.colors.textDisabled, )
focusedPlaceholderColor = ElementTheme.colors.textDisabled,
unfocusedLeadingIconColor = MaterialTheme.colorScheme.primary, @Composable
focusedLeadingIconColor = MaterialTheme.colorScheme.primary, fun inactiveInputFieldColors() = TextFieldDefaults.colors(
unfocusedTrailingIconColor = MaterialTheme.colorScheme.primary, unfocusedPlaceholderColor = ElementTheme.colors.textDisabled,
focusedTrailingIconColor = MaterialTheme.colorScheme.primary, focusedPlaceholderColor = ElementTheme.colors.textDisabled,
) unfocusedLeadingIconColor = ElementTheme.materialColors.primary,
focusedLeadingIconColor = ElementTheme.materialColors.primary,
unfocusedTrailingIconColor = ElementTheme.materialColors.primary,
focusedTrailingIconColor = ElementTheme.materialColors.primary,
) )
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun activeColors() = SearchBarDefaults.colors( fun activeColors() = SearchBarDefaults.colors(
containerColor = Color.Transparent, containerColor = Color.Transparent,
inputFieldColors = TextFieldDefaults.colors( dividerColor = ElementTheme.materialColors.outline,
unfocusedPlaceholderColor = ElementTheme.colors.textDisabled, )
focusedPlaceholderColor = ElementTheme.colors.textDisabled,
unfocusedLeadingIconColor = MaterialTheme.colorScheme.primary, @Composable
focusedLeadingIconColor = MaterialTheme.colorScheme.primary, fun activeInputFieldColors() = TextFieldDefaults.colors(
unfocusedTrailingIconColor = MaterialTheme.colorScheme.primary, unfocusedPlaceholderColor = ElementTheme.colors.textDisabled,
focusedTrailingIconColor = MaterialTheme.colorScheme.primary, focusedPlaceholderColor = ElementTheme.colors.textDisabled,
) unfocusedLeadingIconColor = ElementTheme.materialColors.primary,
focusedLeadingIconColor = ElementTheme.materialColors.primary,
unfocusedTrailingIconColor = ElementTheme.materialColors.primary,
focusedTrailingIconColor = ElementTheme.materialColors.primary,
) )
} }

View file

@ -36,6 +36,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.preview.ElementPreviewLight
@ -64,7 +65,12 @@ fun TextField(
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
shape: Shape = TextFieldDefaults.shape, shape: Shape = TextFieldDefaults.shape,
colors: TextFieldColors = TextFieldDefaults.colors() colors: TextFieldColors = TextFieldDefaults.colors(
unfocusedContainerColor = ElementTheme.colors.bgSubtleSecondary,
focusedContainerColor = ElementTheme.colors.bgSubtleSecondary,
disabledContainerColor = ElementTheme.colors.bgSubtleSecondary,
errorContainerColor = ElementTheme.colors.bgSubtleSecondary,
)
) { ) {
androidx.compose.material3.TextField( androidx.compose.material3.TextField(
value = value, value = value,

View file

@ -70,7 +70,7 @@ fun CustomBottomSheetScaffold(
sheetPeekHeight: Dp = BottomSheetDefaults.SheetPeekHeight, sheetPeekHeight: Dp = BottomSheetDefaults.SheetPeekHeight,
sheetMaxWidth: Dp = BottomSheetDefaults.SheetMaxWidth, sheetMaxWidth: Dp = BottomSheetDefaults.SheetMaxWidth,
sheetShape: Shape = BottomSheetDefaults.ExpandedShape, sheetShape: Shape = BottomSheetDefaults.ExpandedShape,
sheetContainerColor: Color = BottomSheetDefaults.ContainerColor, sheetContainerColor: Color = Color.White,
sheetContentColor: Color = contentColorFor(sheetContainerColor), sheetContentColor: Color = contentColorFor(sheetContainerColor),
sheetTonalElevation: Dp = BottomSheetDefaults.Elevation, sheetTonalElevation: Dp = BottomSheetDefaults.Elevation,
sheetShadowElevation: Dp = BottomSheetDefaults.Elevation, sheetShadowElevation: Dp = BottomSheetDefaults.Elevation,
@ -367,6 +367,12 @@ private class MapDraggableAnchors<T>(private val anchors: Map<T, Float>) : Dragg
return anchors == other.anchors return anchors == other.anchors
} }
override fun forEach(block: (anchor: T, position: Float) -> Unit) {
for (anchor in anchors) {
block(anchor.key, anchor.value)
}
}
override fun hashCode() = 31 * anchors.hashCode() override fun hashCode() = 31 * anchors.hashCode()
override fun toString() = "MapDraggableAnchors($anchors)" override fun toString() = "MapDraggableAnchors($anchors)"
@ -381,7 +387,7 @@ internal fun ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
): NestedScrollConnection = object : NestedScrollConnection { ): NestedScrollConnection = object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val delta = available.toFloat() val delta = available.toFloat()
return if (delta < 0 && source == NestedScrollSource.Drag) { return if (delta < 0 && source == NestedScrollSource.UserInput) {
sheetState.anchoredDraggableState.dispatchRawDelta(delta).toOffset() sheetState.anchoredDraggableState.dispatchRawDelta(delta).toOffset()
} else { } else {
Offset.Zero Offset.Zero
@ -393,7 +399,7 @@ internal fun ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
available: Offset, available: Offset,
source: NestedScrollSource source: NestedScrollSource
): Offset { ): Offset {
return if (source == NestedScrollSource.Drag) { return if (source == NestedScrollSource.UserInput) {
sheetState.anchoredDraggableState.dispatchRawDelta(available.toFloat()).toOffset() sheetState.anchoredDraggableState.dispatchRawDelta(available.toFloat()).toOffset()
} else { } else {
Offset.Zero Offset.Zero

View file

@ -7,7 +7,9 @@
package io.element.android.libraries.designsystem.theme.components.bottomsheet package io.element.android.libraries.designsystem.theme.components.bottomsheet
import androidx.compose.animation.core.DecayAnimationSpec
import androidx.compose.animation.core.SpringSpec import androidx.compose.animation.core.SpringSpec
import androidx.compose.animation.core.exponentialDecay
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.gestures.animateTo import androidx.compose.foundation.gestures.animateTo
import androidx.compose.foundation.gestures.snapTo import androidx.compose.foundation.gestures.snapTo
@ -201,14 +203,12 @@ constructor(
* gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call. * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
* *
* @param targetValue The target value of the animation * @param targetValue The target value of the animation
* @param velocity The velocity of the animation
*/ */
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
internal suspend fun animateTo( internal suspend fun animateTo(
targetValue: SheetValue, targetValue: SheetValue,
velocity: Float = anchoredDraggableState.lastVelocity
) { ) {
anchoredDraggableState.animateTo(targetValue, velocity) anchoredDraggableState.animateTo(targetValue)
} }
/** /**
@ -235,7 +235,8 @@ constructor(
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
internal var anchoredDraggableState = androidx.compose.foundation.gestures.AnchoredDraggableState( internal var anchoredDraggableState = androidx.compose.foundation.gestures.AnchoredDraggableState(
initialValue = initialValue, initialValue = initialValue,
animationSpec = AnchoredDraggableDefaults.AnimationSpec, snapAnimationSpec = AnchoredDraggableDefaults.SnapAnimationSpec,
decayAnimationSpec = AnchoredDraggableDefaults.DecayAnimationSpec,
confirmValueChange = confirmValueChange, confirmValueChange = confirmValueChange,
positionalThreshold = { with(requireDensity()) { 56.dp.toPx() } }, positionalThreshold = { with(requireDensity()) { 56.dp.toPx() } },
velocityThreshold = { with(requireDensity()) { 125.dp.toPx() } } velocityThreshold = { with(requireDensity()) { 125.dp.toPx() } }
@ -298,5 +299,10 @@ internal object AnchoredDraggableDefaults {
@get:ExperimentalMaterial3Api @get:ExperimentalMaterial3Api
@Suppress("OPT_IN_MARKER_ON_WRONG_TARGET") @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@ExperimentalMaterial3Api @ExperimentalMaterial3Api
val AnimationSpec = SpringSpec<Float>() val SnapAnimationSpec = SpringSpec<Float>()
@get:ExperimentalMaterial3Api
@Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@ExperimentalMaterial3Api
val DecayAnimationSpec = exponentialDecay<Float>()
} }

View file

@ -10,10 +10,10 @@ package io.element.android.libraries.designsystem.utils
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.LocalLifecycleOwner
@Composable @Composable
fun OnLifecycleEvent(onEvent: (owner: LifecycleOwner, event: Lifecycle.Event) -> Unit) { fun OnLifecycleEvent(onEvent: (owner: LifecycleOwner, event: Lifecycle.Event) -> Unit) {

View file

@ -32,10 +32,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.persistentMapOf
import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.awaitCancellation

View file

@ -17,8 +17,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -56,7 +56,7 @@ fun EditableAvatarView(
.clickable( .clickable(
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = onAvatarClick, onClick = onAvatarClick,
indication = rememberRipple(bounded = false), indication = ripple(bounded = false),
) )
.testTag(TestTags.editAvatar) .testTag(TestTags.editAvatar)
) { ) {

View file

@ -15,8 +15,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -73,7 +73,7 @@ fun SelectedRoom(
.size(20.dp) .size(20.dp)
.align(Alignment.TopEnd) .align(Alignment.TopEnd)
.clickable( .clickable(
indication = rememberRipple(), indication = ripple(),
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = { onRemoveRoom(roomSummary) } onClick = { onRemoveRoom(roomSummary) }
), ),

View file

@ -15,7 +15,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -72,7 +72,7 @@ fun SelectedUser(
.size(20.dp) .size(20.dp)
.align(Alignment.TopEnd) .align(Alignment.TopEnd)
.clickable( .clickable(
indication = rememberRipple(), indication = ripple(),
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = { onUserRemove(matrixUser) } onClick = { onUserRemove(matrixUser) }
), ),

View file

@ -30,9 +30,9 @@ import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.compose.LocalLifecycleOwner
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import kotlinx.coroutines.delay import kotlinx.coroutines.delay

View file

@ -16,8 +16,8 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -94,7 +94,7 @@ private fun EditingModeView(
enabled = true, enabled = true,
onClick = onResetComposerMode, onClick = onResetComposerMode,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(bounded = false) indication = ripple(bounded = false)
), ),
) )
} }
@ -124,7 +124,7 @@ private fun ReplyToModeView(
enabled = true, enabled = true,
onClick = onResetComposerMode, onClick = onResetComposerMode,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(bounded = false) indication = ripple(bounded = false)
), ),
) )
} }

View file

@ -14,7 +14,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -53,7 +53,7 @@ internal fun FormattingOption(
.clickable( .clickable(
onClick = onClick, onClick = onClick,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple( indication = ripple(
bounded = false, bounded = false,
radius = 20.dp, radius = 20.dp,
), ),

View file

@ -8,6 +8,7 @@
package io.element.android.libraries.textcomposer.components.markdown package io.element.android.libraries.textcomposer.components.markdown
import android.content.Context import android.content.Context
import android.view.View
import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatEditText
internal class MarkdownEditText( internal class MarkdownEditText(
@ -36,4 +37,8 @@ internal class MarkdownEditText(
onSelectionChangeListener?.invoke(selStart, selEnd) onSelectionChangeListener?.invoke(selStart, selEnd)
} }
} }
override fun focusSearch(direction: Int): View? {
return null
}
} }

View file

@ -15,10 +15,10 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.compose.LocalLifecycleOwner
@Stable @Stable
@Composable @Composable

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:25428c6db7cc00dc9ac1133d56e4f30f6970a1a0f0e14a551a44eff1f6afde5f oid sha256:d8321503209048b152d1ed52cf2339c8c96276b4f40d71660a92b9a8b919efcf
size 8336 size 8386

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:69649cb5813f8fccdb60c72d2c5df002419a6bc45cab754f2a300fe907b7cf93 oid sha256:3fcde8c552b5080a87e1339d6f23fd9f0b291161525563197bffbdca2e6802e0
size 6969 size 6994

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:beefa333127ea567719bcdc1d8ebe03e67c933e866a1696e520d04ff10ad416d oid sha256:e88a14813e0923365b98dc046479b4625b732bef2befe4bd1ddddacc8598aaf7
size 8355 size 8389

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f57ef9707cdd88e1f77d27a185800ef14f11e7749368ff0cbad61d21e082fda6 oid sha256:092a39015ccb36d09f65ed18760eb1e36dcab1e0809d404bfd9f4aed9961eca4
size 7083 size 7110

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:aa07d35d6967771dde192bfc08eec5e208f0edbf05955bba9f82e23efcabf3ca oid sha256:30efa4ef62ce38f3599c1a6f2a99c9a36e5704a70c99d83670b5f2169a8648f3
size 8281 size 8378

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3e32f2e9ac5e091361650ed29b9a47dbf35196f872f7ef8ed89240fbc836beb4 oid sha256:a1a5ca1ae30e3b1c4c2b242b3527a3c09b09acb415ad11333ad4b1f07182cbed
size 7906 size 8005

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c976f3c1d4809c28cb865b0dfe7ce1eed5fe2c9959a80da8efab5d3594e38e41 oid sha256:925dc31415feddb28616043aaeadc5e18ad5b329ad7414ca5da69c772dd34e5b
size 14427 size 14528

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d6acbdb4ea1e66fa4638fc9b454566968081c511e0dcfde3f1e57fd9725a1edb oid sha256:546837f4f7021f4e05d3d10e953ef09a9fb7f7dc136a8d48dae24690a6877e4a
size 13263 size 13366

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a5442a44fa31fbd78eb58be78ea485c919380d83a6fde0cad9e6a97b0a59a491 oid sha256:7297bdfeec3c126f0ab3f78a58ff6f3ed513199457ca627c189169c88f288fb5
size 19876 size 19976

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:91bfca2a62a5745472ad34070e24111bc81632c5053d4aae284f9db3acf0cef4 oid sha256:70d89e441fa190cee145e56d9d62f2cda663d9054d038d9402464ced33f46917
size 18578 size 18675

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:418e64406425c9519e55ea94b1a5a5af8178bfe8ff97e154a21419d052f9966c oid sha256:3540f43d9c2b446ddf110e88661334f9b25dc15b200ab3841fd7588aed662a73
size 68219 size 68250

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:25f23f41ab4f151a9240be2e7771c0f2ea0f6c8fb7eacf75549ff26e25b5c202 oid sha256:a07ef1ecaa31561bdeb34160f89fa9d81ff8736e1680f6594aafbc263f1f2178
size 59537 size 59543

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:23312c1f451cf556fff753206848e9d6c3359df4c703ff0f2d58190b43dc7859 oid sha256:3e2e62c68474d9f814e35c03ba1458a4e4d62f7bc4239f9f719d305e986cd66b
size 266126 size 260887

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f7ae6f66e7fbf8cb8338f3368f3e70cec59d417e278424981a159b8f062143da oid sha256:3f7f9ec486a3bdb3a6c27ebfe391577cbf59051870a0161db9bd6f3a62abf042
size 345550 size 341417

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:33d39c0a6e9c514a44182b5da0f8e5725b6649ab4b0533eaf895797dc970999a oid sha256:1ee71bc4af44aed32f1603111ff2680c440319c1dd691c6c1774f04c859c2e3a
size 10179 size 10274

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c30a73e033ca799a38942d23893eb7a3e3e4f09aa473d07cc03fa2f1a7ac22e3 oid sha256:5183f090192627b3b11f80c344381ba65c2977cc781cd59674003168bcea7e74
size 9034 size 9131

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:563d5fb3d177add8f3234d1cd07b8320e3cf36599234181d765e6263f2a8b401 oid sha256:c4c96790d61f5ae03c3b32d5ea85d2b1efddc84f248f2373290f28c15ced4dc0
size 11353 size 11443

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9c3e295887c5cb8cf98f24a7de9418f1a28349df90117587404f830e9e44f261 oid sha256:da6d82da577060eafd43bd4c13867cac99143fb8bc877f7149db4c3f4aa6e81a
size 10998 size 11088

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9c55c8c263d07bb171879860f3c4e276a810393bc55281cb52e8b98c0850380a oid sha256:aad48b326c07ed1eda341817b9a30cc74ef6cc83dd80406dd26aed858112eda8
size 252852 size 252914

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fb0c9428c27cb820994130093f0a21bb910da67c2461fecaf3fbcd38c0e58d7d oid sha256:e63a6eaedca373d7154c66d7f9fc5f52e4999dbfaafe00bb06cf94a86e2fb762
size 105481 size 105538

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9c55c8c263d07bb171879860f3c4e276a810393bc55281cb52e8b98c0850380a oid sha256:aad48b326c07ed1eda341817b9a30cc74ef6cc83dd80406dd26aed858112eda8
size 252852 size 252914

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fb0c9428c27cb820994130093f0a21bb910da67c2461fecaf3fbcd38c0e58d7d oid sha256:e63a6eaedca373d7154c66d7f9fc5f52e4999dbfaafe00bb06cf94a86e2fb762
size 105481 size 105538

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:db6ddcf3641db14b5b272320bef39f90677e9303cb86debc052781a36044f6ce oid sha256:ebb977417d40a4846b9f6e22f05c95853fecc52cadda31c3a46dadaf970acf9d
size 20166 size 20088

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d82d9fce7b91fa9b0ac6a845fc23cda41db2d3b452040700db786784c5cbe83a oid sha256:d443be13466d7114b4bb373669a09031e805ed5b8c6a86c61ee4f171cd7b9d9c
size 35352 size 35291

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:80acc542f7e99ceb08933fe5f8046f7e643391a8130a21b4322ef2756a088a80 oid sha256:0f2ab79facdd2d9d04823bce914119eef9309e7d3c7792b0b47299e598a5729f
size 33631 size 33569

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:db6ddcf3641db14b5b272320bef39f90677e9303cb86debc052781a36044f6ce oid sha256:ebb977417d40a4846b9f6e22f05c95853fecc52cadda31c3a46dadaf970acf9d
size 20166 size 20088

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f2d1a51e21540cb7ea217ff23e72036225b112dc7714d92f516d7aa35469d5a3 oid sha256:fad76d0fe41bb115470e9c1e52600e2a8353e4bbe793bec08379d146c8413f07
size 20248 size 20168

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:425e7e477c1c58265b40f5d64e52352e82b0e6ee9a9c0e0942b8fddd0ebf8304 oid sha256:a859ab843e16b205378cc720053ea5430bf180474261b7b8b1b3b8661e3f6ff2
size 19520 size 19494

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:99ed428ef3e9d2975a806fbd8af4c6257b6766b67bf436cb50f912c0cc57e67a oid sha256:f0b4861dc1df6fbb2b89886c36e9cc92a5d2d147d0ef07ab5b3d6eb9a47b37a4
size 33213 size 33149

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ff775fab9516b0d3fb1a2df9ede2ec9eecbadc959bb53d6b082d9be5b373a7b4 oid sha256:58c7bfac89b9d0989443c0298638cb3dcf690b9f07ba133d5b45f5f2541f2454
size 31819 size 31755

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:425e7e477c1c58265b40f5d64e52352e82b0e6ee9a9c0e0942b8fddd0ebf8304 oid sha256:a859ab843e16b205378cc720053ea5430bf180474261b7b8b1b3b8661e3f6ff2
size 19520 size 19494

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7b34e829e4c3b755bd17d50419ec9f21c6d28c42f807cddcad7716a9871bf285 oid sha256:dc06fd37d4bcb88021bfe1db06131b77a0ed1569395851167ebc765d26245f41
size 19754 size 19702

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2f5f9afdf10404a81be8c8c52b6010edd97d99693491d11f0fe0bcc4fe16c7ae oid sha256:fbffe7e34ac02d5329ac0d83bcb55108e374050deef36e43cc8d93ade25ed5be
size 12045 size 11980

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1e9190242b873ef054be387b41603a738a68c836732d7d72902b744c230793d6 oid sha256:4e51c776dd39f7671b8df3be8b364986a521cbf004a4f89e20dde5d45e24a618
size 30033 size 29980

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:b9350a2fbbd4c8f530b4bb5778cb1d4461a2437222339d1aba0cab555634c9c2 oid sha256:bcb36100bd15cbd4df401cb17abf7a9ef19cc0e142b0d55de2e68bfd344cf6f3
size 28368 size 28316

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2f5f9afdf10404a81be8c8c52b6010edd97d99693491d11f0fe0bcc4fe16c7ae oid sha256:fbffe7e34ac02d5329ac0d83bcb55108e374050deef36e43cc8d93ade25ed5be
size 12045 size 11980

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:68b91dd3884b78567f2d07a0c95eed16dfba6ed995fb1b32af0d2249f16a1eb7 oid sha256:8a99b54873f8d8441f2884f7de01dede84452d5bd55e7ce2b3d3846e87f4cb81
size 12243 size 12169

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3e22f506097d964b21a66508219644f8f4b989ec7bf8ae22aa4f5c44ec337818 oid sha256:e3f9d62e5987a04e440c22833d5a3d74bf0e4366ebe46c41c04ce81d0f29d8a8
size 15815 size 15755

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2867b178672ad79489cbc97977aeffc5ff1575bbf41f42d5b9183abd871df737 oid sha256:428e58eca464163f8ffe2a238816c15321d35ee7bb81cbdf0610e5e828abf289
size 24412 size 24348

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:937198fe6c7e90e5b55c449eca3d020358c02bc658ae9541702ea4b41e589448 oid sha256:8d44c6221d1222119ee2ebdd103f1936cc82c539f508cc6ed818a74e56da2f10
size 26772 size 26709

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e7468007bd3ae791b1d440040ee4479cc9af4377275c115f8f8d78b74eaf62d4 oid sha256:db633069997ba5f56ff75a483cdd778f3c6c39c1df994ee407567c6a0adfc097
size 11524 size 11480

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3d8aab7ba291a4af5c1aabe620f56ba0c1d39e15c2b181bf35f287faae921327 oid sha256:3964999f7960ea2275435606661d8d3b84f3a1894f77f7457b327989e6c4ff0a
size 28114 size 28087

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e46b01fd5b5378aa9b01992fb966c0e10bf7089a8fc2555b996aba3144783d3e oid sha256:b149dfe07fc7fdb260f7e3cca19bc80d3c53c666ef849d43ba274f472fd768c2
size 26728 size 26701

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e7468007bd3ae791b1d440040ee4479cc9af4377275c115f8f8d78b74eaf62d4 oid sha256:db633069997ba5f56ff75a483cdd778f3c6c39c1df994ee407567c6a0adfc097
size 11524 size 11480

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1c3e3e4eba5dc82e22908640e400c57c0a2d01b8adb007ee2aaee4fec175ee1f oid sha256:807eb444f3594f8590287d176c1f05cb7a296e9475ae273df77b4f91bd123959
size 11706 size 11668

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ae22df52afd433d81c2e146cef6b455630de4e1d76eb2b30628ec9b8f87a2522 oid sha256:531dc0c74b9ab506c173ed2ad309910feb1201b77271063aee8682c0a3d6be5f
size 15011 size 14964

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:6663d8bafc3176cfe83d486821ec91ab3204043ee468e689e159ff0af9e9fa5d oid sha256:d2b9390804bdc98113ee8de5e7863e3238e1bfaf1fca0cb3a9a22bd8419ae839
size 23411 size 23367

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e763e8bc81c459b36caeb1b8a74ba262109e3c0ee1bbcf8436d944a1737c8601 oid sha256:4e9ea055dfcdc87173c592d595a0694ac8217c0279db26c14a53d4272052163d
size 25920 size 25885

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:56b12e5828048f6a2a31b634166b2532e79ce07a127576c1315179ebdf6f41a3 oid sha256:c31d0c13cef9e3f9df414353f34b4d327df888703bfa0b5d571ce5e75126d108
size 22390 size 22487

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:aec15e950694f615b669d0293239b95ba5bf196ab8b4e21850b90100e20104c4 oid sha256:1296a63b38a5af029f218dad65c13123a3e0cbe45d1fb812f3a3004d611c279d
size 20962 size 21062

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7fc0cfe3ba0162172f4ea54d465058c466f56506bd062915493d8dd1bf5f31c1 oid sha256:dcae7f1c17aadee8dac1f4ade0eef9d18392e35ea3182e48473413b0035fdbcb
size 30175 size 30276

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:73ec67d63e906aa0963de41487b77558d700b1c9dab96536be4720a9c311dda8 oid sha256:f9ef27a7f39821bde064f87ad6cc46da671b7570e53aa1fbabbd5efa220a45d6
size 27525 size 27620

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:81ffabdfbd54f0e2ab398cc8030160b9725a8b26c216a9cd11f7b45158ada49c oid sha256:bc7f78c0ce55c6e1b0759576f80511d7718291e5903cd0a7cbb19c46bfbec686
size 17696 size 17684

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:15365c9b1adbc40c50db03a3845c941de1ea9fd8425c48e217449de1e016a8bd oid sha256:1bfc723cc3cadef302fae4db56142e7a4ecdec4c43593e0d1122a8b3bb8d4770
size 7620 size 7616

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:aaf41349a72f2c99dcc44021f5e27caa30f4cc577b6f21c30221843a361e8bfc oid sha256:5395f34b153a3c453c95970f326e701e7e5619b53b9bf38dd6a9cff107e28407
size 8456 size 8460

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:14a7181c7aacb760dc0cb07c8896f6822701d000615ad5f86e70b28ad6207129 oid sha256:5fb195657c1ac0379839bba6acc0935f6b1b946714ba252d5797fd4bc0c514db
size 6756 size 6753

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:cfafaac57839be7ec6238647711c6f750a8ad11dda8ab8a85e6132dcfef8014b oid sha256:18e3bb4c57bddd1422c68ddf3a02be0d948e21c55857efb33f71fd4f0039d37c
size 17401 size 17408

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:09fbcc14bc3b1d54bc5c202f369b6e234b2ac8deabeb6db96b31564b6d53a2e4 oid sha256:6c100f4c1d3d7c33085b76306823c4050121534ff096a9d73124683ff8db6090
size 7525 size 7541

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a501e70ad9f6d15e0d99c542ec606f1a2cf444d6934f41425e9bcb5dd2244b69 oid sha256:daed25bb59f0cca8d4bdb5139a177904a407b7d42f9e2d7053fd6f7362c141bf
size 8365 size 8372

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