@@ -129,33 +129,38 @@ fun DiffView(diff: String, modifier: Modifier = Modifier) {
130 val visibleLines = if (lines.size <= COLLAPSED_DIFF_LINES || expanded) lines
130 val visibleLines = if (lines.size <= COLLAPSED_DIFF_LINES || expanded) lines
131 else lines.subList(0, COLLAPSED_DIFF_LINES)
131 else lines.subList(0, COLLAPSED_DIFF_LINES)
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)) {
132− visibleLines.forEach { line ->
136+ visibleLines.forEach { line ->
133− Row(modifier = Modifier.horizontalScroll(hScrollState).padding(horizontal = 10.dp)) {
137+ Row(modifier = Modifier.padding(horizontal = 10.dp)) {
134− when (line) {
138+ when (line) {
135− is DiffLine.Hunk -> Text(
139+ is DiffLine.Hunk -> Text(
136− line.text,
140+ line.text,
137− style = MaterialTheme.typography.bodySmall,
141+ style = MaterialTheme.typography.bodySmall,
138− fontFamily = FontFamily.Monospace,
142+ fontFamily = FontFamily.Monospace,
139− color = MaterialTheme.colorScheme.tertiary,
143+ color = MaterialTheme.colorScheme.tertiary,
140− modifier = Modifier.padding(vertical = 2.dp),
144+ modifier = Modifier.padding(vertical = 2.dp),
142− is DiffLine.FileHeader -> Text(
146+ is DiffLine.FileHeader -> Text(
143− line.text,
147+ line.text,
144− style = MaterialTheme.typography.bodySmall,
148+ style = MaterialTheme.typography.bodySmall,
145− fontFamily = FontFamily.Monospace,
149+ fontFamily = FontFamily.Monospace,
146− color = MaterialTheme.colorScheme.onSurfaceVariant,
150+ color = MaterialTheme.colorScheme.onSurfaceVariant,
147− modifier = Modifier.padding(vertical = 1.dp),
151+ modifier = Modifier.padding(vertical = 1.dp),
149− is DiffLine.Meta -> Text(
153+ is DiffLine.Meta -> Text(
150− line.text,
154+ line.text,
151− style = MaterialTheme.typography.bodySmall,
155+ style = MaterialTheme.typography.bodySmall,
152− fontFamily = FontFamily.Monospace,
156+ fontFamily = FontFamily.Monospace,
153− color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f),
157+ color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f),
154− modifier = Modifier.padding(vertical = 1.dp),
158+ modifier = Modifier.padding(vertical = 1.dp),
156− is DiffLine.Add -> DiffRow(line.text, "+", addColor, addText)
160+ is DiffLine.Add -> DiffRow(line.text, "+", addColor, addText)
157− is DiffLine.Remove -> DiffRow(line.text, "-", removeColor, removeText)
161+ is DiffLine.Remove -> DiffRow(line.text, "-", removeColor, removeText)
158− is DiffLine.Context -> DiffRow(line.text, " ", Color.Transparent, MaterialTheme.colorScheme.onSurface)
162+ is DiffLine.Context -> DiffRow(line.text, " ", Color.Transparent, MaterialTheme.colorScheme.onSurface)