@@ -33,10 +33,13 @@ import androidx.compose.runtime.Composable
3333import androidx.compose.runtime.getValue
3434import androidx.compose.ui.Alignment
3535import androidx.compose.ui.Modifier
36+import androidx.compose.ui.graphics.Color
37+import androidx.compose.ui.text.font.FontFamily
3638import androidx.compose.ui.text.style.TextOverflow
3739import androidx.compose.ui.unit.dp
3840import androidx.lifecycle.compose.collectAsStateWithLifecycle
3941import androidx.lifecycle.viewmodel.compose.viewModel
42+import soy.iko.opencode.data.model.FileStatusEntry
4043import soy.iko.opencode.di.AppContainer
4144import soy.iko.opencode.ui.vmFactory
4245
@@ -164,6 +167,7 @@ private fun DirectoryListing(
164167 icon = node.isDirectory,
165168 label = node.name,
166169 onClick = { if (node.isDirectory) onOpenDir(node.path) else onOpenFile(node.path) },
170+ status = state.statusMap[node.path],
167171 )
168172 HorizontalDivider()
169173 }
@@ -171,7 +175,12 @@ private fun DirectoryListing(
171175}
172176
173177@Composable
174−private fun FileRow(icon: Boolean, label: String, onClick: () -> Unit) {
178+private fun FileRow(
179+ icon: Boolean,
180+ label: String,
181+ onClick: () -> Unit,
182+ status: FileStatusEntry? = null,
183+) {
175184 Row(
176185 modifier = Modifier.fillMaxWidth().clickable(onClick = onClick).padding(horizontal = 16.dp, vertical = 14.dp),
177186 verticalAlignment = Alignment.CenterVertically,
@@ -187,6 +196,32 @@ private fun FileRow(icon: Boolean, label: String, onClick: () -> Unit) {
187196 style = MaterialTheme.typography.bodyLarge,
188197 maxLines = 1,
189198 overflow = TextOverflow.Ellipsis,
199+ modifier = Modifier.weight(1f),
200+ )
201+ if (status != null) StatusBadge(status)
202+ }
203+}
204+
205+@Composable
206+private fun StatusBadge(status: FileStatusEntry) {
207+ val (letter, color) = when (status.status) {
208+ "added" -> "A" to Color(0xFF4CAF50)
209+ "modified" -> "M" to Color(0xFFFFA000)
210+ "deleted" -> "D" to MaterialTheme.colorScheme.error
211+ else -> "·" to MaterialTheme.colorScheme.onSurfaceVariant
212+ }
213+ Text(
214+ letter,
215+ style = MaterialTheme.typography.labelMedium,
216+ fontFamily = FontFamily.Monospace,
217+ color = color,
218+ )
219+ if (status.added > 0 || status.removed > 0) {
220+ Text(
221+ " +${status.added} −${status.removed}",
222+ style = MaterialTheme.typography.labelSmall,
223+ fontFamily = FontFamily.Monospace,
224+ color = MaterialTheme.colorScheme.onSurfaceVariant,
190225 )
191226 }
192227}