// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import UIKit.UIColor import SessionUtilitiesKit // MARK: - Theme public enum Theme: String, CaseIterable, Codable, EnumStringSetting { case classicDark = "classic_dark" case classicLight = "classic_light" case oceanDark = "ocean_dark" case oceanLight = "ocean_light" // MARK: - Properties public var title: String { switch self { case .classicDark: return "Classic Dark" case .classicLight: return "Classic Light" case .oceanDark: return "Ocean Dark" case .oceanLight: return "Ocean Light" } } public var colors: [ThemeValue: UIColor] { switch self { case .classicDark: return Theme_ClassicDark.theme case .classicLight: return Theme_ClassicLight.theme case .oceanDark: return Theme_OceanDark.theme case .oceanLight: return Theme_OceanLight.theme } } public var interfaceStyle: UIUserInterfaceStyle { switch self { case .classicDark, .oceanDark: return .dark case .classicLight, .oceanLight: return .light } } public var statusBarStyle: UIStatusBarStyle { switch self { case .classicDark, .oceanDark: return .lightContent case .classicLight, .oceanLight: return .darkContent } } } // MARK: - ThemeColors public protocol ThemeColors { static var theme: [ThemeValue: UIColor] { get } } // MARK: - ThemeValue public enum ThemeValue { // General case white case black case clear case primary case defaultPrimary case danger case disabled case backgroundPrimary case backgroundSecondary case textPrimary case textSecondary case borderSeparator // Path case path_connected case path_connecting case path_error case path_unknown // TextBox case textBox_background case textBox_border // MessageBubble case messageBubble_outgoingBackground case messageBubble_incomingBackground case messageBubble_outgoingText case messageBubble_incomingText case messageBubble_overlay // MenuButton case menuButton_background case menuButton_icon case menuButton_outerShadow case menuButton_innerShadow // RadioButton case radioButton_selectedBackground case radioButton_unselectedBackground case radioButton_selectedBorder case radioButton_unselectedBorder // OutlineButton case outlineButton_text case outlineButton_background case outlineButton_highlight case outlineButton_border case outlineButton_filledText case outlineButton_filledBackground case outlineButton_filledHighlight case outlineButton_destructiveText case outlineButton_destructiveBackground case outlineButton_destructiveHighlight case outlineButton_destructiveBorder // SolidButton case solidButton_background case solidButton_highlight // Settings case settings_tabBackground case settings_tabHighlight // Appearance case appearance_sectionBackground case appearance_buttonBackground case appearance_buttonHighlight // Alert case alert_text case alert_background case alert_buttonBackground case alert_buttonHighlight // ConversationButton case conversationButton_background case conversationButton_highlight case conversationButton_unreadBackground case conversationButton_unreadHighlight case conversationButton_unreadStripBackground case conversationButton_unreadBubbleBackground case conversationButton_unreadBubbleText case conversationButton_swipeDestructive case conversationButton_swipeSecondary case conversationButton_swipeTertiary // InputButton case inputButton_background // ContextMenu case contextMenu_background case contextMenu_highlight case contextMenu_text case contextMenu_textHighlight // Call case callAccept_background case callDecline_background // Reactions case reactions_contextBackground case reactions_contextMoreBackground } // MARK: - ForcedThemeValue public enum ForcedThemeValue { case color(UIColor) case primary(Theme.PrimaryColor, alpha: CGFloat?) case theme(Theme, color: ThemeValue, alpha: CGFloat?) public static func primary(_ primary: Theme.PrimaryColor) -> ForcedThemeValue { return .primary(primary, alpha: nil) } public static func theme(_ theme: Theme, color: ThemeValue) -> ForcedThemeValue { return .theme(theme, color: color, alpha: nil) } } // MARK: - ForcedThemeAttribute public enum ForcedThemeAttribute { case background(UIColor) case foreground(UIColor) public var key: NSAttributedString.Key { switch self { case .background: return NSAttributedString.Key.backgroundColor case .foreground: return NSAttributedString.Key.foregroundColor } } public var value: Any { switch self { case .background(let value): return value case .foreground(let value): return value } } }