feat: add macOS task board widget app

This commit is contained in:
loveuer
2026-09-02 00:27:33 -07:00
commit 9dafdce855
13 changed files with 485 additions and 0 deletions
+86
View File
@@ -0,0 +1,86 @@
import SwiftUI
struct BoardView: View {
@EnvironmentObject private var store: TaskStore
@State private var newTaskTitle = ""
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Text("My board")
.font(.largeTitle.bold())
HStack(spacing: 12) {
TextField("Add a task", text: $newTaskTitle)
.textFieldStyle(.roundedBorder)
.onSubmit(addTask)
Button("Add", action: addTask)
.keyboardShortcut(.defaultAction)
}
HStack(alignment: .top, spacing: 16) {
ForEach(TaskList.allCases) { list in
TaskColumn(list: list, tasks: tasks(in: list))
}
}
}
.padding(24)
.frame(minWidth: 780, minHeight: 460)
}
private func tasks(in list: TaskList) -> [TaskItem] {
store.tasks.filter { $0.list == list }
}
private func addTask() {
store.add(title: newTaskTitle)
newTaskTitle = ""
}
}
private struct TaskColumn: View {
@EnvironmentObject private var store: TaskStore
let list: TaskList
let tasks: [TaskItem]
var body: some View {
VStack(alignment: .leading, spacing: 10) {
Text(list.title)
.font(.headline)
ScrollView {
LazyVStack(spacing: 8) {
ForEach(tasks) { task in
TaskCard(task: task)
}
}
}
}
.padding(12)
.frame(maxWidth: .infinity, minHeight: 320, alignment: .topLeading)
.background(.quaternary, in: RoundedRectangle(cornerRadius: 12))
}
}
private struct TaskCard: View {
@EnvironmentObject private var store: TaskStore
let task: TaskItem
var body: some View {
HStack(alignment: .top, spacing: 8) {
Text(task.title)
.frame(maxWidth: .infinity, alignment: .leading)
Menu {
ForEach(TaskList.allCases.filter { $0 != task.list }) { list in
Button("Move to \(list.title)") { store.move(task, to: list) }
}
Divider()
Button("Delete", role: .destructive) { store.delete(task) }
} label: {
Image(systemName: "ellipsis")
}
.menuStyle(.borderlessButton)
.fixedSize()
}
.padding(10)
.background(.background, in: RoundedRectangle(cornerRadius: 8))
}
}