@@ -129,33 +129,38 @@ fun DiffView(diff: String, modifier: Modifier = Modifier) {
129129 }
130130 val visibleLines = if (lines.size <= COLLAPSED_DIFF_LINES || expanded) lines
131131 else lines.subList(0, COLLAPSED_DIFF_LINES)
132− visibleLines.forEach { line ->
133− Row(modifier = Modifier.horizontalScroll(hScrollState).padding(horizontal = 10.dp)) {
134− when (line) {
135− is DiffLine.Hunk -> Text(
136− line.text,
137− style = MaterialTheme.typography.bodySmall,
138− fontFamily = FontFamily.Monospace,
139− color = MaterialTheme.colorScheme.tertiary,
140− modifier = Modifier.padding(vertical = 2.dp),
141− )
142− is DiffLine.FileHeader -> Text(
143− line.text,
144− style = MaterialTheme.typography.bodySmall,
145− fontFamily = FontFamily.Monospace,
146− color = MaterialTheme.colorScheme.onSurfaceVariant,
147− modifier = Modifier.padding(vertical = 1.dp),
148− )
149− is DiffLine.Meta -> Text(
150− line.text,
151− style = MaterialTheme.typography.bodySmall,
152− fontFamily = FontFamily.Monospace,
153− color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f),
154− modifier = Modifier.padding(vertical = 1.dp),
155− )
156− is DiffLine.Add -> DiffRow(line.text, "+", addColor, addText)
157− is DiffLine.Remove -> DiffRow(line.text, "-", removeColor, removeText)
158− is DiffLine.Context -> DiffRow(line.text, " ", Color.Transparent, MaterialTheme.colorScheme.onSurface)
132+ // One horizontalScroll on the container instead of one per row: each modifier
133+ // adds a layout node + clip + offset pass, so a 200-line collapsed diff was
134+ // paying for 200 of them. The shared scroll state still synchronizes all rows.
135+ Column(modifier = Modifier.horizontalScroll(hScrollState)) {
136+ visibleLines.forEach { line ->
137+ Row(modifier = Modifier.padding(horizontal = 10.dp)) {
138+ when (line) {
139+ is DiffLine.Hunk -> Text(
140+ line.text,
141+ style = MaterialTheme.typography.bodySmall,
142+ fontFamily = FontFamily.Monospace,
143+ color = MaterialTheme.colorScheme.tertiary,
144+ modifier = Modifier.padding(vertical = 2.dp),
145+ )
146+ is DiffLine.FileHeader -> Text(
147+ line.text,
148+ style = MaterialTheme.typography.bodySmall,
149+ fontFamily = FontFamily.Monospace,
150+ color = MaterialTheme.colorScheme.onSurfaceVariant,
151+ modifier = Modifier.padding(vertical = 1.dp),
152+ )
153+ is DiffLine.Meta -> Text(
154+ line.text,
155+ style = MaterialTheme.typography.bodySmall,
156+ fontFamily = FontFamily.Monospace,
157+ color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f),
158+ modifier = Modifier.padding(vertical = 1.dp),
159+ )
160+ is DiffLine.Add -> DiffRow(line.text, "+", addColor, addText)
161+ is DiffLine.Remove -> DiffRow(line.text, "-", removeColor, removeText)
162+ is DiffLine.Context -> DiffRow(line.text, " ", Color.Transparent, MaterialTheme.colorScheme.onSurface)
163+ }
159164 }
160165 }
161166 }