Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
folium-app
GitHub Repository: folium-app/Folium
Path: blob/a-new-beginning/Folium-iOS/Extensions/UIColor.swift
2 views
//
//  UIColor.swift
//  Folium-iOS
//
//  Created by Jarrod Norwell on 2/7/2025.
//

import Foundation
import UIKit

extension UIColor {
    static func fromHex(_ rgba: UInt32) -> UIColor {
        return UIColor(
            red: CGFloat((Float((rgba & 0xff0000) >> 16)) / 255.0),
            green: CGFloat((Float((rgba & 0x00ff00) >> 8)) / 255.0),
            blue: CGFloat((Float((rgba & 0x0000ff) >> 0)) / 255.0),
            alpha: 1.0)
    }
    
    var darker: UIColor {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0

        getRed(&r, green: &g, blue: &b, alpha: &a)
        return .init(red: max(r - 0.3, 0.0), green: max(g - 0.3, 0.0), blue: max(b - 0.3, 0.0), alpha: a)
    }
    
    var hex: String {
        let components = cgColor.components
        let r: CGFloat = components?[0] ?? 0.0
        let g: CGFloat = components?[1] ?? 0.0
        let b: CGFloat = components?[2] ?? 0.0
        
        return .init(format: "#%02lX%02lX%02lX",
                     lroundf(Float(r * 255)),
                     lroundf(Float(g * 255)),
                     lroundf(Float(b * 255)))
    }
    
    var isLight: Bool {
        guard let components = cgColor.components, components.count > 2 else { return false }
        let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000
        return (brightness > 0.5)
    }
    
    var lighter: UIColor {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0

        getRed(&r, green: &g, blue: &b, alpha: &a)
        return .init(red: min(r + 0.3, 1.0), green: min(g + 0.3, 1.0), blue: min(b + 0.3, 1.0), alpha: a)
    }
    
    var rgba: String {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0

        getRed(&r, green: &g, blue: &b, alpha: &a)
        r *= 255
        g *= 255
        b *= 255
        a *= 255
        return "\(Int(r)) \(Int(g)) \(Int(b)) \(Int(a))"
    }
    
    static var skyBlue: UIColor {
        .init(red: 0.6, green: 0.8, blue: 1, alpha: 1)
    }
}