@@ -3,14 +3,15 @@ package soy.iko.opencode.ui.components
33import androidx.compose.foundation.background
44import androidx.compose.foundation.horizontalScroll
55import androidx.compose.foundation.layout.Arrangement
6−import androidx.compose.foundation.layout.Column
76import androidx.compose.foundation.layout.Row
7+import androidx.compose.foundation.layout.Spacer
88import androidx.compose.foundation.layout.fillMaxWidth
99import androidx.compose.foundation.layout.padding
1010import androidx.compose.foundation.layout.width
11+import androidx.compose.foundation.lazy.LazyColumn
12+import androidx.compose.foundation.lazy.itemsIndexed
1113import androidx.compose.foundation.rememberScrollState
1214import androidx.compose.foundation.shape.RoundedCornerShape
13−import androidx.compose.foundation.verticalScroll
1415import androidx.compose.material.icons.Icons
1516import androidx.compose.material.icons.filled.ContentCopy
1617import androidx.compose.material3.Icon
@@ -82,28 +83,24 @@ fun DiffView(diff: String, modifier: Modifier = Modifier) {
8283 val addText = MaterialTheme.colorScheme.primary
8384 val removeText = MaterialTheme.colorScheme.error
8485 val context = LocalContext.current
86+ val hScrollState = rememberScrollState()
8587
86− Column(
88+ LazyColumn(
8789 modifier = modifier
8890 .fillMaxWidth()
8991 .padding(vertical = 4.dp)
9092 .clip(RoundedCornerShape(8.dp))
91− .background(MaterialTheme.colorScheme.surfaceVariant)
92− .padding(top = 2.dp, end = 4.dp),
93+ .background(MaterialTheme.colorScheme.surfaceVariant),
9394 ) {
94− Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
95− IconButton(onClick = { copyToClipboard(context, "diff", diff) }) {
96− Icon(Icons.Filled.ContentCopy, contentDescription = stringResource(R.string.copy), tint = MaterialTheme.colorScheme.onSurfaceVariant)
95+ item(key = "__copy") {
96+ Row(modifier = Modifier.fillMaxWidth().padding(top = 2.dp, end = 4.dp), horizontalArrangement = Arrangement.End) {
97+ IconButton(onClick = { copyToClipboard(context, "diff", diff) }) {
98+ Icon(Icons.Filled.ContentCopy, contentDescription = stringResource(R.string.copy), tint = MaterialTheme.colorScheme.onSurfaceVariant)
99+ }
97100 }
98101 }
99− Column(
100− modifier = Modifier
101− .horizontalScroll(rememberScrollState())
102− .verticalScroll(rememberScrollState())
103− .padding(horizontal = 10.dp)
104− .padding(bottom = 10.dp),
105− ) {
106− for (line in lines) {
102+ itemsIndexed(lines, key = { index, _ -> index }) { _, line ->
103+ Row(modifier = Modifier.horizontalScroll(hScrollState).padding(horizontal = 10.dp)) {
107104 when (line) {
108105 is DiffLine.Hunk -> Text(
109106 line.text,
@@ -125,13 +122,14 @@ fun DiffView(diff: String, modifier: Modifier = Modifier) {
125122 }
126123 }
127124 }
125+ item(key = "__spacer") { Spacer(Modifier.padding(bottom = 10.dp)) }
128126 }
129127}
130128
131129@Composable
132130private fun DiffRow(text: String, prefix: String, bg: Color, textColor: androidx.compose.ui.graphics.Color) {
133131 Row(
134− modifier = Modifier.fillMaxWidth().background(bg),
132+ modifier = Modifier.background(bg),
135133 ) {
136134 Text(
137135 prefix,