Skip to content

Commit

Permalink
🌈 Color darken/lighten modifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
benlmyers committed Feb 3, 2022
1 parent 09f2c10 commit 2606265
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
85 changes: 85 additions & 0 deletions Sources/ShinySwiftUI/Extensions/SwiftUI/Color.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import SwiftUI
@available(macOS 11.0, iOS 13.0, *)
public extension Color {

// MARK: - Public Methods

/**
Sets the opacity of the color.

Expand All @@ -20,3 +22,86 @@ public extension Color {
return self.opacity(Double(level.rawValue))
}
}

@available(macOS 11.0, iOS 14.0, *)
public extension Color {

// MARK: - Public Methods

/**
Makes the color lighter.

- parameter amount: The amount to lighten. Use `0.0` for no lightness and `1.0` for white.
*/
func lighter(by amount: CGFloat = 0.2) -> Self { Self(_Color(self).lighter(by: amount)) }

/**
Makes the color darker.

- parameter amount: The amount to darken. Use `0.0` for no darkness and `1.0` for black.
*/
func darker(by amount: CGFloat = 0.2) -> Self { Self(_Color(self).darker(by: amount)) }
}

#if os(iOS)

fileprivate typealias _Color = UIColor
fileprivate extension UIColor {

func mix(with color: UIColor, amount: CGFloat) -> Self {
var red1: CGFloat = 0
var green1: CGFloat = 0
var blue1: CGFloat = 0
var alpha1: CGFloat = 0

var red2: CGFloat = 0
var green2: CGFloat = 0
var blue2: CGFloat = 0
var alpha2: CGFloat = 0

getRed(&red1, green: &green1, blue: &blue1, alpha: &alpha1)
color.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

return Self(
red: red1 * CGFloat(1.0 - amount) + red2 * amount,
green: green1 * CGFloat(1.0 - amount) + green2 * amount,
blue: blue1 * CGFloat(1.0 - amount) + blue2 * amount,
alpha: alpha1
)
}

func lighter(by amount: CGFloat = 0.2) -> Self { mix(with: .white, amount: amount) }
func darker(by amount: CGFloat = 0.2) -> Self { mix(with: .black, amount: amount) }
}

#elseif os(macOS)

fileprivate typealias _Color = NSColor
fileprivate extension NSColor {
func mix(with color: NSColor, amount: CGFloat) -> Self {
var red1: CGFloat = 0
var green1: CGFloat = 0
var blue1: CGFloat = 0
var alpha1: CGFloat = 0

var red2: CGFloat = 0
var green2: CGFloat = 0
var blue2: CGFloat = 0
var alpha2: CGFloat = 0

getRed(&red1, green: &green1, blue: &blue1, alpha: &alpha1)
color.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

return Self(
red: red1 * CGFloat(1.0 - amount) + red2 * amount,
green: green1 * CGFloat(1.0 - amount) + green2 * amount,
blue: blue1 * CGFloat(1.0 - amount) + blue2 * amount,
alpha: alpha1
)
}

func lighter(by amount: CGFloat = 0.2) -> Self { mix(with: .white, amount: amount) }
func darker(by amount: CGFloat = 0.2) -> Self { mix(with: .black, amount: amount) }
}

#endif
3 changes: 3 additions & 0 deletions Sources/ShinySwiftUI/Extensions/UIKit/UIDevice.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// Created by Ben Myers on 2/3/22.
//

#if os(iOS)
import UIKit

public extension UIDevice {
Expand All @@ -20,3 +21,5 @@ public extension UIDevice {
}
}
}

#endif

0 comments on commit 2606265

Please sign in to comment.