Files
2026-02-26 21:24:20 -05:00

73 lines
2.5 KiB
Swift

import SwiftUI
struct TodoItemView: View {
let todo: Todo
let onToggle: () -> Void
let onTap: () -> Void
var body: some View {
Button(action: onTap) {
HStack(spacing: 12) {
// Checkbox toggle
Button(action: onToggle) {
Image(systemName: todo.completed ? "checkmark.circle.fill" : "circle")
.font(.title2)
.foregroundStyle(todo.completed ? Color.accentColor : Color(.systemGray3))
}
.buttonStyle(.plain)
// Title and metadata
VStack(alignment: .leading, spacing: 4) {
Text(todo.title)
.font(.body)
.strikethrough(todo.completed)
.foregroundStyle(todo.completed ? .secondary : .primary)
.lineLimit(2)
.multilineTextAlignment(.leading)
HStack(spacing: 8) {
// Category tag
Text(todo.category)
.font(.caption)
.padding(.horizontal, 8)
.padding(.vertical, 3)
.background(
Capsule()
.fill(Color(.systemGray5))
)
.foregroundStyle(.secondary)
// Priority dot and label
HStack(spacing: 4) {
Circle()
.fill(priorityColor(todo.priority))
.frame(width: 8, height: 8)
Text(todo.priority.displayName)
.font(.caption)
.foregroundStyle(.secondary)
}
}
}
Spacer()
Image(systemName: "chevron.right")
.font(.caption)
.foregroundStyle(Color(.systemGray3))
}
.padding(.vertical, 8)
.padding(.horizontal, 16)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
private func priorityColor(_ priority: Priority) -> Color {
switch priority {
case .low: return .green
case .medium: return .orange
case .high: return .red
}
}
}