59 lines
1.5 KiB
Swift
59 lines
1.5 KiB
Swift
import SwiftUI
|
|
|
|
struct NumpadView: View {
|
|
let onKey: (String) -> Void
|
|
|
|
private let rows: [[String]] = [
|
|
["1", "2", "3"],
|
|
["4", "5", "6"],
|
|
["7", "8", "9"],
|
|
["⌫", "0", "✓"]
|
|
]
|
|
|
|
var body: some View {
|
|
VStack(spacing: 12) {
|
|
ForEach(rows, id: \.self) { row in
|
|
HStack(spacing: 20) {
|
|
ForEach(row, id: \.self) { key in
|
|
NumpadKey(label: key) { onKey(key) }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private struct NumpadKey: View {
|
|
let label: String
|
|
let action: () -> Void
|
|
|
|
var isConfirm: Bool { label == "✓" }
|
|
|
|
var body: some View {
|
|
Button(action: action) {
|
|
Group {
|
|
switch label {
|
|
case "⌫":
|
|
Image(systemName: "delete.left")
|
|
.font(.system(size: 22))
|
|
case "✓":
|
|
Image(systemName: "checkmark")
|
|
.font(.system(size: 22, weight: .semibold))
|
|
default:
|
|
Text(label)
|
|
.font(.system(size: 28, weight: .light))
|
|
}
|
|
}
|
|
.frame(width: 72, height: 72)
|
|
.background(isConfirm ? Color.accentColor : Color(.systemFill))
|
|
.foregroundStyle(isConfirm ? .white : .primary)
|
|
.clipShape(Circle())
|
|
}
|
|
.buttonStyle(.plain)
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
NumpadView { _ in }
|
|
}
|