taler-ios

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

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 }