secant-ios-wallet/modules/Sources/UIComponents/Backgrounds/ScreenBackground.swift

187 lines
5.4 KiB
Swift

//
// ScreenBackground.swift
// Zashi
//
// Created by Francisco Gindre on 10/18/21.
//
import SwiftUI
import Generated
public struct ScreenBackgroundModifier: ViewModifier {
var color: Color
public func body(content: Content) -> some View {
ZStack {
color
.edgesIgnoringSafeArea(.all)
content
}
}
}
public struct ScreenGradientBackground: View {
@Environment(\.colorScheme) var colorScheme
public enum Mode {
case branded
case defaultGradient
case erred
case failure
case onboardingDark
case onboardingLight
case success
public func stops(_ colorScheme: ColorScheme) -> [Gradient.Stop] {
switch self {
case .branded:
return [
Gradient.Stop(color: Design.Utility.Brand._600.color(colorScheme), location: 0.0),
Gradient.Stop(color: Design.Utility.Brand._400.color(colorScheme), location: 0.5),
Gradient.Stop(color: Design.screenBackground.color(colorScheme), location: 0.75)
]
case .defaultGradient:
return [
Gradient.Stop(color: Design.Surfaces.bgAdjust.color(colorScheme), location: 0.0),
Gradient.Stop(color: Design.Surfaces.bgPrimary.color(colorScheme), location: 0.25)
]
case .erred:
return [
Gradient.Stop(color: Design.Utility.WarningYellow._100.color(colorScheme), location: 0.0),
Gradient.Stop(color: Design.screenBackground.color(colorScheme), location: 0.4)
]
case .failure:
return [
Gradient.Stop(color: Design.Utility.ErrorRed._100.color(colorScheme), location: 0.0),
Gradient.Stop(color: Design.screenBackground.color(colorScheme), location: 0.4)
]
case .onboardingDark:
return [
Gradient.Stop(color: Asset.Colors.ZDesign.sharkShades06dp.color, location: 0.0),
Gradient.Stop(color: Asset.Colors.ZDesign.Base.obsidian.color, location: 1.0)
]
case .onboardingLight:
return [
Gradient.Stop(color: Asset.Colors.ZDesign.Base.concrete.color, location: 0.0),
Gradient.Stop(color: Asset.Colors.ZDesign.Base.bone.color, location: 1.0)
]
case .success:
return [
Gradient.Stop(color: Design.Utility.SuccessGreen._100.color(colorScheme), location: 0.0),
Gradient.Stop(color: Design.screenBackground.color(colorScheme), location: 0.4)
]
}
}
}
let mode: Mode
public var body: some View {
LinearGradient(
stops: mode.stops(colorScheme),
startPoint: .top,
endPoint: .bottom
)
}
}
struct ScreenGradientBackgroundModifier: ViewModifier {
let mode: ScreenGradientBackground.Mode
func body(content: Content) -> some View {
ZStack {
ScreenGradientBackground(mode: mode)
.edgesIgnoringSafeArea(.all)
content
}
}
}
struct ScreenOnboardingGradientBackgroundModifier: ViewModifier {
@Environment(\.colorScheme) var colorScheme
func body(content: Content) -> some View {
ZStack {
ScreenGradientBackground(
mode: colorScheme == .light ? .onboardingLight : .onboardingDark
)
.edgesIgnoringSafeArea(.all)
content
}
}
}
struct ScreenDefaultGradientBackgroundModifier: ViewModifier {
@Environment(\.colorScheme) var colorScheme
func body(content: Content) -> some View {
ZStack {
ScreenGradientBackground(
mode: .defaultGradient
)
.edgesIgnoringSafeArea(.all)
content
}
}
}
extension View {
public func applyScreenBackground() -> some View {
modifier(
ScreenBackgroundModifier(
color: Asset.Colors.background.color
)
)
}
public func applyErredScreenBackground() -> some View {
modifier(
ScreenGradientBackgroundModifier(mode: .erred)
)
}
public func applyBrandedScreenBackground() -> some View {
modifier(
ScreenGradientBackgroundModifier(mode: .branded)
)
}
public func applyOnboardingScreenBackground() -> some View {
self.modifier(
ScreenOnboardingGradientBackgroundModifier()
)
}
public func applyDefaultGradientScreenBackground() -> some View {
self.modifier(
ScreenDefaultGradientBackgroundModifier()
)
}
public func applySuccessScreenBackground() -> some View {
modifier(
ScreenGradientBackgroundModifier(mode: .success)
)
}
public func applyFailureScreenBackground() -> some View {
modifier(
ScreenGradientBackgroundModifier(mode: .failure)
)
}
}
struct ScreenBackground_Previews: PreviewProvider {
static var previews: some View {
VStack {
Text("Hello")
}
.applyScreenBackground()
.preferredColorScheme(.light)
}
}