taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

WalletColors.swift (4828B)


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