import Foundation import ManaCore /// Konstanten für `DeckEditorView` — Farbpalette. /// Werte gespiegelt aus dem `forest`-Theme. enum DeckEditorPresets { /// 8 Farb-Presets aus dem forest-Theme. Freie Hex-Werte später /// via Custom-Picker. static let colors: [String] = [ "#10803D", // forest primary light "#1E3A2F", // forest dark "#D97706", // amber "#DC2626", // red "#2563EB", // blue "#7C3AED", // violet "#0D9488", // teal "#737373" // neutral ] } /// Reine Hilfsfunktionen für `DeckEditorView` — kein State, keine Bindings. enum DeckEditorHelpers { /// Nil zurück wenn String nach Trim leer ist. static func nonEmpty(_ value: String) -> String? { let trimmed = value.trimmingCharacters(in: .whitespaces) return trimmed.isEmpty ? nil : trimmed } /// http:// oder https:// und nicht-leer. static func isValidURL(_ value: String) -> Bool { let trimmed = value.trimmingCharacters(in: .whitespaces) guard !trimmed.isEmpty else { return false } guard let url = URL(string: trimmed), let scheme = url.scheme else { return false } return scheme == "http" || scheme == "https" } /// AuthError-Server-Codes auf nutzerfreundliche deutsche Texte mappen. static func mapAIError(_ error: AuthError) -> String { if case let .serverError(status, _, message) = error { switch status { case 429: return "Zu viele KI-Anfragen. Bitte eine Minute warten." case 413: return message ?? "Datei zu groß." case 422, 400: return message ?? "Eingabe ungültig." case 502: return message ?? "KI-Server gerade nicht erreichbar." default: break } } return error.errorDescription ?? "Unbekannter Fehler." } }