git.iko.soy/opencode-android
on e66c7ed help sign in
40 lines 1.5 kB history raw
1package soy.iko.opencode.ui.components
3import androidx.compose.foundation.layout.size
4import androidx.compose.material3.CircularProgressIndicator
5import androidx.compose.material3.MaterialTheme
6import androidx.compose.runtime.Composable
7import androidx.compose.ui.Modifier
8import androidx.compose.ui.graphics.Color
9import androidx.compose.ui.semantics.contentDescription
10import androidx.compose.ui.semantics.semantics
11import androidx.compose.ui.unit.dp
12import androidx.compose.ui.res.stringResource
13import soy.iko.opencode.R
15/**
16 * The single source of truth for indeterminate loading spinners across the app. Always sets a
17 * [contentDescription] so TalkBack announces progress (a bare [CircularProgressIndicator] is
18 * announced only inconsistently, especially when inlined inside a Button or replacing an icon),
19 * and uses a small set of canonical size/stroke combinations from [LoadingSize].
20 */
21@Composable
22fun LoadingSpinner(
23 size: LoadingSize = LoadingSize.Medium,
24 modifier: Modifier = Modifier,
25 color: Color = CircularProgressIndicatorDefaults.color,
26) {
27 val label = stringResource(R.string.loading)
28 CircularProgressIndicator(
29 modifier = modifier
30 .size(size.sizeDp.dp)
31 .semantics { contentDescription = label },
32 strokeWidth = size.strokeDp.dp,
33 color = color,
34 )
37private object CircularProgressIndicatorDefaults {
38 val color: Color
39 @Composable get() = MaterialTheme.colorScheme.primary