vOOice/VoiceInk/Views/PredefinedPromptsView.swift
2025-10-31 15:13:49 +05:45

91 lines
3.2 KiB
Swift

import SwiftUI
struct PredefinedPromptsView: View {
let onSelect: (TemplatePrompt) -> Void
private let columns: [GridItem] = Array(repeating: GridItem(.flexible(), spacing: 18), count: 2)
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 16) {
ForEach(PromptTemplates.all) { template in
PredefinedTemplateButton(prompt: template) {
onSelect(template)
}
}
}
.padding(.horizontal, 24)
.padding(.vertical, 20)
}
.frame(minWidth: 410, idealWidth: 520, maxWidth: 570, maxHeight: 440)
}
}
struct PredefinedTemplateButton: View {
let prompt: TemplatePrompt
let action: () -> Void
var body: some View {
Button(action: action) {
VStack(alignment: .leading, spacing: 12) {
HStack(alignment: .center, spacing: 12) {
RoundedRectangle(cornerRadius: 10, style: .continuous)
.fill(Color(NSColor.unemphasizedSelectedTextBackgroundColor))
.frame(width: 42, height: 42)
.overlay(
Image(systemName: prompt.icon)
.font(.system(size: 19, weight: .medium))
.foregroundColor(Color(NSColor.labelColor))
)
Text(prompt.title)
.font(.system(size: 15, weight: .semibold))
.foregroundColor(.primary)
.lineLimit(1)
Spacer(minLength: 0)
}
Text(prompt.description)
.font(.system(size: 12))
.foregroundColor(Color(NSColor.secondaryLabelColor))
.lineLimit(1)
.truncationMode(.tail)
.frame(maxWidth: .infinity, alignment: .leading)
}
.frame(maxWidth: .infinity, alignment: .topLeading)
.padding(.horizontal, 18)
.padding(.vertical, 12)
.background(cardBackground)
.overlay(cardStroke)
.contentShape(RoundedRectangle(cornerRadius: 16, style: .continuous))
.shadow(color: cardShadowColor, radius: 6, x: 0, y: 4)
}
.buttonStyle(.plain)
}
private var cardBackground: some View {
RoundedRectangle(cornerRadius: 16, style: .continuous)
.fill(Color(NSColor.controlBackgroundColor))
}
private var cardStroke: some View {
RoundedRectangle(cornerRadius: 16, style: .continuous)
.stroke(
LinearGradient(
colors: [
Color(NSColor.separatorColor).opacity(0.35),
Color(NSColor.separatorColor).opacity(0.15)
],
startPoint: .topLeading,
endPoint: .bottomTrailing
),
lineWidth: 1
)
}
private var cardShadowColor: Color {
Color(NSColor.shadowColor).opacity(0.25)
}
}