Skip to content

Commit 5ff30ed

Browse files
authored
Merge pull request #522 from kiwicom/text-field-label-alignment-line
introduce LabelLastBaseLine for field vertical aligment
2 parents 8621c82 + 44f5e03 commit 5ff30ed

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

catalog/src/main/java/kiwi/orbit/compose/catalog/screens/TextFieldScreen.kt

+18-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import kiwi.orbit.compose.ui.controls.Scaffold
4242
import kiwi.orbit.compose.ui.controls.Text
4343
import kiwi.orbit.compose.ui.controls.TextField
4444
import kiwi.orbit.compose.ui.controls.TopAppBar
45+
import kiwi.orbit.compose.ui.controls.field.LabelLastBaseLine
4546

4647
@Composable
4748
internal fun TextFieldScreen(onNavigateUp: () -> Unit) {
@@ -226,10 +227,25 @@ private fun TextFieldScreenInner() {
226227

227228
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
228229
var v1 by rememberSaveable { mutableStateOf("") }
229-
TextField(v1, { v1 = it }, label = { Text("A") }, modifier = Modifier.weight(1f))
230+
TextField(
231+
value = v1,
232+
onValueChange = { v1 = it },
233+
label = { Text("Very long label with many many words") },
234+
modifier = Modifier
235+
.weight(1f)
236+
.alignBy(LabelLastBaseLine),
237+
)
230238

231239
var v2 by rememberSaveable { mutableStateOf("") }
232-
TextField(v2, { v2 = it }, label = { Text("B") }, modifier = Modifier.weight(1f))
240+
TextField(
241+
value = v2,
242+
onValueChange = { v2 = it },
243+
label = { Text("B") },
244+
error = { Text("Error") },
245+
modifier = Modifier
246+
.weight(1f)
247+
.alignBy(LabelLastBaseLine),
248+
)
233249
}
234250

235251
Spacer(Modifier.height(8.dp))

docs/03-components/05-input/inputfield.mdx

+14
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,20 @@ fun Example() {
7676
}
7777
```
7878

79+
Utilize `LabelLastBaseLine` alignment line to vertically align multiple text fields.
80+
81+
```kotlin
82+
@Composable
83+
import kiwi.orbit.compose.ui.controls.field.LabelLastBaseLine
84+
85+
fun Example() {
86+
Row {
87+
TextField(Modifier.alignBy(LabelLastBaseLine), ...)
88+
TextField(Modifier.alignBy(LabelLastBaseLine), ...)
89+
}
90+
}
91+
```
92+
7993
## UI testing
8094

8195
Slotting API allows you to add testTag to particular component parts.

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/TextField.kt

+7
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,19 @@ import kiwi.orbit.compose.ui.R
3131
import kiwi.orbit.compose.ui.controls.field.FieldContent
3232
import kiwi.orbit.compose.ui.controls.field.FieldLabel
3333
import kiwi.orbit.compose.ui.controls.field.FieldMessage
34+
import kiwi.orbit.compose.ui.controls.field.LabelLastBaseLine
3435
import kiwi.orbit.compose.ui.controls.internal.ColumnWithMinConstraints
3536
import kiwi.orbit.compose.ui.controls.internal.OrbitPreviews
3637
import kiwi.orbit.compose.ui.controls.internal.Preview
3738
import kiwi.orbit.compose.ui.foundation.LocalTextStyle
3839
import kiwi.orbit.compose.ui.foundation.ProvideMergedTextStyle
3940

41+
/**
42+
* TextFiled control allowing a text single-line or multi-line input.
43+
*
44+
* To align multiple text fields vertically next to each other, utilize
45+
* [LabelLastBaseLine] alignment line.
46+
*/
4047
@Composable
4148
public fun TextField(
4249
value: String,

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/field/FieldLabel.kt

+27-1
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,42 @@ import androidx.compose.foundation.layout.Box
44
import androidx.compose.foundation.layout.padding
55
import androidx.compose.runtime.Composable
66
import androidx.compose.ui.Modifier
7+
import androidx.compose.ui.layout.HorizontalAlignmentLine
8+
import androidx.compose.ui.layout.LastBaseline
9+
import androidx.compose.ui.layout.layout
710
import androidx.compose.ui.unit.dp
811
import kiwi.orbit.compose.ui.OrbitTheme
912
import kiwi.orbit.compose.ui.foundation.ProvideMergedTextStyle
13+
import kotlin.math.max
14+
15+
/**
16+
* Alignment line holding a value of label's last baseline.
17+
*
18+
* With this line, you have vertically align multiple text fields
19+
* to have their "input boxes" aligned.
20+
*/
21+
public val LabelLastBaseLine: HorizontalAlignmentLine =
22+
HorizontalAlignmentLine(::max)
1023

1124
@Composable
1225
internal fun FieldLabel(
1326
content: @Composable () -> Unit,
1427
) {
1528
ProvideMergedTextStyle(OrbitTheme.typography.bodyNormalMedium) {
16-
Box(Modifier.padding(bottom = 4.dp)) {
29+
Box(
30+
Modifier
31+
.padding(bottom = 4.dp)
32+
.layout { measurable, constraints ->
33+
val placeable = measurable.measure(constraints)
34+
layout(
35+
placeable.width,
36+
placeable.height,
37+
mapOf(LabelLastBaseLine to placeable[LastBaseline]),
38+
) {
39+
placeable.place(0, 0)
40+
}
41+
},
42+
) {
1743
content()
1844
}
1945
}

0 commit comments

Comments
 (0)