WalletColors.swift (4820B)
1 /* 2 * This file is part of GNU Taler, ©2022-25 Taler Systems S.A. 3 * See LICENSE.md 4 */ 5 /** 6 * @author Marc Stibane 7 */ 8 import SwiftUI 9 10 fileprivate let grouped = true 11 12 struct FullBackground: View { 13 @Environment(\.colorScheme) private var colorScheme 14 @AppStorage("liquidBack") var liquidBack: Bool = false 15 16 var isDark: Bool { colorScheme == .dark } 17 18 @available(iOS 17.0, *) 19 @MainActor 20 var liquidView : some View { 21 // Ensure we always start with a different view 22 let startDate = Date() - Double.random(in: 1...999) 23 let size = UIScreen.screenSize 24 let view = TimelineView(.animation) { timeline in 25 let elapsed = timeline.date.timeIntervalSince(startDate) 26 Rectangle() 27 .colorEffect( 28 ShaderLibrary.liquidBack( 29 .float2(size.width, size.height), 30 .float(Float(elapsed)) 31 ) 32 ) 33 } 34 return view.ignoresSafeArea() 35 } 36 37 var backgroundView: some View { 38 WalletColors().backgroundColor.ignoresSafeArea() 39 } 40 41 var body: some View { 42 if isDark, liquidBack, #available(iOS 17.0, *) { 43 liquidView 44 } else { 45 backgroundView 46 } 47 } 48 } 49 public struct WalletColors { 50 @AppStorage("minimalistic") private var minimalistic: Bool = false 51 52 // let tint = Color(.tintColor) 53 let gray1 = Color(.systemGray) // uncompleted 54 let gray2 = Color(.systemGray2) // disabled Fore 55 let gray3 = Color(.systemGray3) 56 let gray4 = Color(.systemGray4) 57 let gray5 = Color(.systemGray5) 58 let gray6 = Color(.systemGray6) 59 let gray7 = grouped ? Color(.tertiarySystemGroupedBackground) 60 : Color(.tertiarySystemBackground) // enabled Back 61 let gray8 = grouped ? Color(.secondarySystemGroupedBackground) 62 : Color(.secondarySystemBackground) // disabled Back 63 64 let attention = Color.red // TODO: WalletColors().errorColor 65 let confirm = Color.yellow // TODO: WalletColors().warningColor 66 67 // TODO: In Japan, negative is blue, and positive is red 68 let positive = Color.green 69 let negative = Color.red 70 71 func buttonForeColor(pressed: Bool, 72 disabled: Bool, 73 scheme: ColorScheme, 74 contrast: ColorSchemeContrast, 75 prominent: Bool = false) -> Color { 76 disabled ? gray2 77 : !prominent ? talerColor 78 : scheme == .dark ? primary(contrast) 79 : pressed ? gray6 : Color.white 80 } 81 82 func buttonBackColor(pressed: Bool, 83 disabled: Bool, 84 prominent: Bool = false) -> Color { 85 disabled ? gray7 86 : prominent ? talerColor 87 : pressed ? gray4 : gray5 88 } 89 90 func primary(_ contrast: ColorSchemeContrast = .standard) -> Color { 91 return contrast == .increased ? .primary 92 : Color("Primary") 93 } 94 95 func secondary(_ scheme: ColorScheme, _ contrast: ColorSchemeContrast = .standard) -> Color { 96 return contrast == .increased ? .primary // WCAG AAA for any scheme 97 : minimalistic ? .secondary // not enough contrast 98 : scheme == .dark ? .secondary // WCAG AA for dark scheme 99 : Color(.darkGray) // WCAG AA for light scheme 100 } 101 102 var labelColor: Color { 103 Color(UIColor.label) 104 } 105 106 var backgroundColor: Color { 107 grouped ? Color(.systemGroupedBackground) 108 : Color(.systemBackground) 109 } 110 111 var secondaryBackground: Color { 112 Color(.secondarySystemGroupedBackground) 113 } 114 115 var sideBackgroundColor: Color { 116 gray6 117 } 118 119 func pickerSelected(_ scheme: ColorScheme, _ contrast: ColorSchemeContrast) -> Color { 120 return contrast == .increased ? (scheme == .dark ? gray3 : gray4) 121 : (scheme == .dark ? gray4 : gray5) 122 } 123 124 var pickerBackground: Color { 125 gray7 126 } 127 128 var fieldForeground: Color { // text color 129 Color.primary 130 } 131 132 var fieldBackground: Color { 133 gray8 134 } 135 136 var uncompletedColor: Color { 137 // used in TransactionRowView 138 gray1 139 } 140 141 var errorColor: Color { 142 Color("Error") 143 } 144 145 var talerColor: Color { 146 Color("Taler") 147 } 148 149 func pendingColor(_ incoming: Bool) -> Color { 150 incoming ? Color("PendingIncoming") 151 : Color("PendingOutgoing") 152 } 153 154 func transactionColor(_ incoming: Bool) -> Color { 155 incoming ? Color("Incoming") 156 : Color("Outgoing") 157 } 158 }