Start implementing light mode

This commit is contained in:
Niels Andriesse 2020-02-17 12:08:46 +11:00
parent 251a93e529
commit 09c9dccf6b
29 changed files with 222 additions and 178 deletions

View File

@ -581,7 +581,6 @@
B85357C323A1BD1200AAF6CD /* SeedVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85357C223A1BD1200AAF6CD /* SeedVC.swift */; };
B85357C523A1F13800AAF6CD /* LinkDeviceVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85357C423A1F13800AAF6CD /* LinkDeviceVC.swift */; };
B85357C723A1FB5100AAF6CD /* LinkDeviceVCDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85357C623A1FB5100AAF6CD /* LinkDeviceVCDelegate.swift */; };
B8544E3123D16CA500299F14 /* DeviceUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8544E3023D16CA500299F14 /* DeviceUtilities.swift */; };
B8544E3323D50E4900299F14 /* AppearanceUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8544E3223D50E4900299F14 /* AppearanceUtilities.swift */; };
B8544E3423D51EEF00299F14 /* ProfilePictureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82AC238F734800BA5194 /* ProfilePictureView.swift */; };
B8544E3523D5201400299F14 /* UIView+Constraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = B885D5F52334A32100EE0D8E /* UIView+Constraints.swift */; };
@ -599,15 +598,17 @@
B8B26C8F234D629C004ED98C /* MentionCandidateSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */; };
B8B26C91234D8CBD004ED98C /* MentionCandidateSelectionViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B26C90234D8CBD004ED98C /* MentionCandidateSelectionViewDelegate.swift */; };
B8B5BCEC2394D869003823C9 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B5BCEB2394D869003823C9 /* Button.swift */; };
B8BB82A0238F322400BA5194 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB829F238F322400BA5194 /* Colors.swift */; };
B8BB82A2238F356100BA5194 /* Values.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A1238F356100BA5194 /* Values.swift */; };
B8BB82A5238F627000BA5194 /* HomeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A4238F627000BA5194 /* HomeVC.swift */; };
B8BB82A9238F62FB00BA5194 /* Gradients.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A8238F62FB00BA5194 /* Gradients.swift */; };
B8BB82AB238F669C00BA5194 /* ConversationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82AA238F669C00BA5194 /* ConversationCell.swift */; };
B8BB82B12390C37000BA5194 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82B02390C37000BA5194 /* SearchBar.swift */; };
B8BB82B523947F2D00BA5194 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82B423947F2D00BA5194 /* TextField.swift */; };
B8BB82B92394911B00BA5194 /* Separator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82B82394911B00BA5194 /* Separator.swift */; };
B8BB82BE2394D4CE00BA5194 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82BD2394D4CE00BA5194 /* Fonts.swift */; };
B8C9689523FA1B72005F64E0 /* AppMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C9689023FA1401005F64E0 /* AppMode.swift */; };
B8C9689623FA1B72005F64E0 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB829F238F322400BA5194 /* Colors.swift */; };
B8C9689723FA1B72005F64E0 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82BD2394D4CE00BA5194 /* Fonts.swift */; };
B8C9689823FA1B72005F64E0 /* Gradients.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A8238F62FB00BA5194 /* Gradients.swift */; };
B8C9689923FA1B72005F64E0 /* Values.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A1238F356100BA5194 /* Values.swift */; };
B8C9689A23FA1B95005F64E0 /* DeviceUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8544E3023D16CA500299F14 /* DeviceUtilities.swift */; };
B8CCF6352396005F0091D419 /* SpaceMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B8CCF6342396005F0091D419 /* SpaceMono-Regular.ttf */; };
B8CCF63723961D6D0091D419 /* NewPrivateChatVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8CCF63623961D6D0091D419 /* NewPrivateChatVC.swift */; };
B8CCF639239721E20091D419 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8CCF638239721E20091D419 /* TabBar.swift */; };
@ -1453,6 +1454,7 @@
B8BB82B423947F2D00BA5194 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = "<group>"; };
B8BB82B82394911B00BA5194 /* Separator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Separator.swift; sourceTree = "<group>"; };
B8BB82BD2394D4CE00BA5194 /* Fonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fonts.swift; sourceTree = "<group>"; };
B8C9689023FA1401005F64E0 /* AppMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMode.swift; sourceTree = "<group>"; };
B8CCF6342396005F0091D419 /* SpaceMono-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpaceMono-Regular.ttf"; sourceTree = "<group>"; };
B8CCF63623961D6D0091D419 /* NewPrivateChatVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewPrivateChatVC.swift; sourceTree = "<group>"; };
B8CCF638239721E20091D419 /* TabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = "<group>"; };
@ -2719,7 +2721,6 @@
children = (
B8CCF63B239757C10091D419 /* Components */,
B8BFFF392355426100102A27 /* Messaging */,
B8BB82A3238F356800BA5194 /* Style Guide */,
B8CCF63C239757DB0091D419 /* Utilities */,
B8CCF63D2397580E0091D419 /* View Controllers */,
);
@ -2729,9 +2730,8 @@
B846365922B7417900AF1514 /* Loki */ = {
isa = PBXGroup;
children = (
B8C9689223FA1B05005F64E0 /* Redesign */,
B8544E3623D520F600299F14 /* Jazz Icon */,
B8BB82AC238F734800BA5194 /* ProfilePictureView.swift */,
B885D5F52334A32100EE0D8E /* UIView+Constraints.swift */,
);
path = Loki;
sourceTree = "<group>";
@ -2750,6 +2750,7 @@
B8BB82A3238F356800BA5194 /* Style Guide */ = {
isa = PBXGroup;
children = (
B8C9689023FA1401005F64E0 /* AppMode.swift */,
B8BB829F238F322400BA5194 /* Colors.swift */,
B8BB82BD2394D4CE00BA5194 /* Fonts.swift */,
B8BB82A8238F62FB00BA5194 /* Gradients.swift */,
@ -2775,6 +2776,33 @@
path = Messaging;
sourceTree = "<group>";
};
B8C9689223FA1B05005F64E0 /* Redesign */ = {
isa = PBXGroup;
children = (
B8C9689323FA1B32005F64E0 /* Components */,
B8BB82A3238F356800BA5194 /* Style Guide */,
B8C9689423FA1B3D005F64E0 /* Utilities */,
);
path = Redesign;
sourceTree = "<group>";
};
B8C9689323FA1B32005F64E0 /* Components */ = {
isa = PBXGroup;
children = (
B8BB82AC238F734800BA5194 /* ProfilePictureView.swift */,
);
path = Components;
sourceTree = "<group>";
};
B8C9689423FA1B3D005F64E0 /* Utilities */ = {
isa = PBXGroup;
children = (
B8544E3023D16CA500299F14 /* DeviceUtilities.swift */,
B885D5F52334A32100EE0D8E /* UIView+Constraints.swift */,
);
path = Utilities;
sourceTree = "<group>";
};
B8CCF63B239757C10091D419 /* Components */ = {
isa = PBXGroup;
children = (
@ -2801,7 +2829,6 @@
isa = PBXGroup;
children = (
B8544E3223D50E4900299F14 /* AppearanceUtilities.swift */,
B8544E3023D16CA500299F14 /* DeviceUtilities.swift */,
B8783E9B23EB8DDE00404FB8 /* GeneralUtilities.swift */,
B847570223D5698100759540 /* LokiPushNotificationManager.swift */,
B84664F4235022F30083A1CD /* MentionUtilities.swift */,
@ -3673,6 +3700,7 @@
34AC09E1211B39B100997B47 /* SelectThreadViewController.m in Sources */,
34AC09EF211B39B100997B47 /* ViewControllerUtils.m in Sources */,
346941A2215D2EE400B5BFAD /* OWSConversationColor.m in Sources */,
B8C9689723FA1B72005F64E0 /* Fonts.swift in Sources */,
34AC0A17211B39EA00997B47 /* VideoPlayerView.swift in Sources */,
34BEDB1321C43F6A007B0EAE /* ImageEditorView.swift in Sources */,
34AC09EE211B39B100997B47 /* EditContactShareNameViewController.swift in Sources */,
@ -3692,12 +3720,14 @@
4CBBCA6321714B4500EEB37D /* OWS110SortIdMigration.swift in Sources */,
342950832124C9750000B063 /* OWSTextView.m in Sources */,
452EC6E1205FF5DC000E787C /* Bench.swift in Sources */,
B8C9689923FA1B72005F64E0 /* Values.swift in Sources */,
34BBC85D220D19D600857249 /* ImageEditorPanGestureRecognizer.swift in Sources */,
342950882124CB0A0000B063 /* OWSSearchBar.m in Sources */,
342950822124C9750000B063 /* OWSTextField.m in Sources */,
34AC0A13211B39EA00997B47 /* DisappearingTimerConfigurationView.swift in Sources */,
4CA46F4D219CFDAA0038ABDE /* GalleryRailView.swift in Sources */,
34480B621FD0A98800BC14EF /* UIColor+OWS.m in Sources */,
B8C9689823FA1B72005F64E0 /* Gradients.swift in Sources */,
4C20B2B720CA0034001BAC90 /* ThreadViewModel.swift in Sources */,
34BBC857220C7ADA00857249 /* ImageEditorItem.swift in Sources */,
346E35BE224283B100E55D5F /* UIAlertController+OWS.swift in Sources */,
@ -3725,6 +3755,7 @@
346129FB1FD5F31400532771 /* OWS101ExistingUsersBlockOnIdentityChange.m in Sources */,
B8544E3523D5201400299F14 /* UIView+Constraints.swift in Sources */,
34AC09EA211B39B100997B47 /* ModalActivityIndicatorViewController.swift in Sources */,
B8C9689523FA1B72005F64E0 /* AppMode.swift in Sources */,
344F248D2007CCD600CFB4F4 /* DisplayableText.swift in Sources */,
450998651FD8A34D00D89EB3 /* DeviceSleepManager.swift in Sources */,
34AC09EB211B39B100997B47 /* ContactShareApprovalViewController.swift in Sources */,
@ -3742,6 +3773,7 @@
346129FE1FD5F31400532771 /* OWS106EnsureProfileComplete.swift in Sources */,
34AC0A10211B39EA00997B47 /* TappableView.swift in Sources */,
346129F91FD5F31400532771 /* OWS104CreateRecipientIdentities.m in Sources */,
B8C9689A23FA1B95005F64E0 /* DeviceUtilities.swift in Sources */,
346129B61FD1F7E800532771 /* ProfileFetcherJob.swift in Sources */,
34AC09E9211B39B100997B47 /* OWSTableViewController.m in Sources */,
340872CE2239596100CB25B0 /* AttachmentApprovalInputAccessoryView.swift in Sources */,
@ -3810,6 +3842,7 @@
4C948FF72146EB4800349F0D /* BlockListCache.swift in Sources */,
B846365B22B7418B00AF1514 /* Identicon+ObjC.swift in Sources */,
4551DB5A205C562300C8AE75 /* Collection+OWS.swift in Sources */,
B8C9689623FA1B72005F64E0 /* Colors.swift in Sources */,
34BBC84F220B8A0100857249 /* ImageEditorCropViewController.swift in Sources */,
34AC09ED211B39B100997B47 /* ContactFieldView.swift in Sources */,
B8544E3423D51EEF00299F14 /* ProfilePictureView.swift in Sources */,
@ -3869,7 +3902,6 @@
4505C2BF1E648EA300CEBF41 /* ExperienceUpgrade.swift in Sources */,
EF764C351DB67CC5000D9A87 /* UIViewController+Permissions.m in Sources */,
45CD81EF1DC030E7004C9430 /* SyncPushTokensJob.swift in Sources */,
B8BB82A0238F322400BA5194 /* Colors.swift in Sources */,
34D2CCE0206939B400CB1A14 /* DebugUIMessagesAssetLoader.m in Sources */,
4CEB78C92178EBAB00F315D2 /* OWSSessionResetJobRecord.m in Sources */,
45794E861E00620000066731 /* CallUIAdapter.swift in Sources */,
@ -3904,7 +3936,6 @@
B80C6B572384A56D00FDBC8B /* DeviceLinksVC.swift in Sources */,
34A8B3512190A40E00218A25 /* MediaAlbumCellView.swift in Sources */,
34D1F0AE1F867BFC0066283D /* OWSMessageCell.m in Sources */,
B8BB82A2238F356100BA5194 /* Values.swift in Sources */,
B8BB82AB238F669C00BA5194 /* ConversationCell.swift in Sources */,
4C4AEC4520EC343B0020E72B /* DismissableTextField.swift in Sources */,
4CB5F26720F6E1E2004D1B42 /* MenuActionsViewController.swift in Sources */,
@ -3919,7 +3950,6 @@
D221A09A169C9E5E00537ABF /* main.m in Sources */,
3496957221A301A100DCFE74 /* OWSBackup.m in Sources */,
B86BD08623399CEF000F5AE3 /* SeedModal.swift in Sources */,
B8BB82A9238F62FB00BA5194 /* Gradients.swift in Sources */,
34B3F87B1E8DF1700035BE1A /* ExperienceUpgradesPageViewController.swift in Sources */,
3448E1622213585C004B052E /* OnboardingBaseViewController.swift in Sources */,
34E5DC8220D8050D00C08145 /* RegistrationUtils.m in Sources */,
@ -3960,7 +3990,6 @@
34B3F8801E8DF1700035BE1A /* InviteFlow.swift in Sources */,
B85357C523A1F13800AAF6CD /* LinkDeviceVC.swift in Sources */,
457C87B82032645C008D52D6 /* DebugUINotifications.swift in Sources */,
B8544E3123D16CA500299F14 /* DeviceUtilities.swift in Sources */,
4C21D5D8223AC60F00EF8A77 /* PhotoCapture.swift in Sources */,
4C13C9F620E57BA30089A98B /* ColorPickerViewController.swift in Sources */,
B8162F0522892C5F00D46544 /* FriendRequestViewDelegate.swift in Sources */,
@ -4058,7 +4087,6 @@
340FC8AE204DAC8D007AEB0F /* OWSSoundSettingsViewController.m in Sources */,
4579431E1E7C8CE9008ED0C0 /* Pastelog.m in Sources */,
340FC8B0204DAC8D007AEB0F /* AddToBlockListViewController.m in Sources */,
B8BB82BE2394D4CE00BA5194 /* Fonts.swift in Sources */,
3496957321A301A100DCFE74 /* OWSBackupJob.m in Sources */,
340FC8B3204DAC8D007AEB0F /* AppSettingsViewController.m in Sources */,
C3DFFAC823E970080058DAF8 /* OpenGroupSuggestionSheet.swift in Sources */,

View File

@ -54,8 +54,9 @@ final class FakeChatView : UIView {
bubbleView.set(.width, to: Values.fakeChatBubbleWidth)
bubbleView.layer.cornerRadius = Values.fakeChatBubbleCornerRadius
bubbleView.layer.shadowColor = UIColor.black.cgColor
bubbleView.layer.shadowRadius = 2
bubbleView.layer.shadowOpacity = 0.24
bubbleView.layer.shadowRadius = isLightMode ? 1 : 2
bubbleView.layer.shadowOpacity = isLightMode ? 0.08 : 0.24
bubbleView.layer.shadowOffset = CGSize.zero
let backgroundColor = wasSentByCurrentUser ? Colors.fakeChatBubbleBackground : Colors.accent
bubbleView.backgroundColor = backgroundColor
let label = UILabel()

View File

@ -28,11 +28,11 @@ final class TextField : UITextField {
placeholder.addAttribute(.foregroundColor, value: placeholderColor, range: NSRange(location: 0, length: placeholder.length))
attributedPlaceholder = placeholder
tintColor = Colors.accent
keyboardAppearance = .dark
keyboardAppearance = isLightMode ? .light : .dark
if usesDefaultHeight {
set(.height, to: Values.textFieldHeight)
}
layer.borderColor = Colors.border.withAlphaComponent(Values.textFieldBorderOpacity).cgColor
layer.borderColor = isLightMode ? Colors.text.cgColor : Colors.border.withAlphaComponent(Values.textFieldBorderOpacity).cgColor
layer.borderWidth = Values.borderThickness
layer.cornerRadius = Values.textFieldCornerRadius
}

View File

@ -1,38 +0,0 @@
@objc extension UIColor {
@objc convenience init(hex value: UInt) {
let red = CGFloat((value >> 16) & 0xff) / 255
let green = CGFloat((value >> 8) & 0xff) / 255
let blue = CGFloat((value >> 0) & 0xff) / 255
self.init(red: red, green: green, blue: blue, alpha: 1)
}
}
@objc(LKColors)
final class Colors : NSObject {
@objc static let accent = UIColor(hex: 0x00F782)
@objc static let text = UIColor(hex: 0xFFFFFF)
@objc static let destructive = UIColor(hex: 0xFF453A)
@objc static let unimportant = UIColor(hex: 0xD8D8D8)
@objc static let border = UIColor(hex: 0x979797)
@objc static let cellBackground = UIColor(hex: 0x1B1B1B)
@objc static let cellSelected = UIColor(hex: 0x0C0C0C)
@objc static let navigationBarBackground = UIColor(hex: 0x161616)
@objc static let searchBarPlaceholder = UIColor(hex: 0x8E8E93) // Also used for the icons
@objc static let searchBarBackground = UIColor(red: 142 / 255, green: 142 / 255, blue: 147 / 255, alpha: 0.12)
@objc static let newConversationButtonShadow = UIColor(hex: 0x077C44)
@objc static let separator = UIColor(hex: 0x36383C)
@objc static let unimportantButtonBackground = UIColor(hex: 0x323232)
@objc static let buttonBackground = UIColor(hex: 0x1B1B1B)
@objc static let settingButtonSelected = UIColor(hex: 0x0C0C0C)
@objc static let modalBackground = UIColor(hex: 0x101011)
@objc static let modalBorder = UIColor(hex: 0x212121)
@objc static let fakeChatBubbleBackground = UIColor(hex: 0x3F4146)
@objc static let fakeChatBubbleText = UIColor(hex: 0x000000)
@objc static let composeViewBackground = UIColor(hex: 0x1B1B1B)
@objc static let composeViewTextFieldBackground = UIColor(hex: 0x141414)
@objc static let receivedMessageBackground = UIColor(hex: 0x222325)
@objc static let sentMessageBackground = UIColor(hex: 0x3F4146)
}

View File

@ -1,12 +0,0 @@
@objc(LKFonts)
final class Fonts : NSObject {
@objc static func spaceMono(ofSize size: CGFloat) -> UIFont {
return UIFont(name: "SpaceMono-Regular", size: size)!
}
@objc static func boldSpaceMono(ofSize size: CGFloat) -> UIFont {
return UIFont(name: "SpaceMono-Bold", size: size)!
}
}

View File

@ -1,30 +0,0 @@
@objc(LKGradient)
final class Gradient : NSObject {
let start: UIColor
let end: UIColor
private override init() { preconditionFailure("Use init(start:end:) instead.") }
@objc init(start: UIColor, end: UIColor) {
self.start = start
self.end = end
super.init()
}
}
@objc extension UIView {
@objc func setGradient(_ gradient: Gradient) {
let layer = CAGradientLayer()
layer.frame = UIScreen.main.bounds
layer.colors = [ gradient.start.cgColor, gradient.end.cgColor ]
self.layer.insertSublayer(layer, at: 0)
}
}
@objc(LKGradients)
final class Gradients : NSObject {
@objc static let defaultLokiBackground = Gradient(start: UIColor(hex: 0x171717), end: UIColor(hex:0x121212))
}

View File

@ -1,64 +0,0 @@
@objc(LKValues)
final class Values : NSObject {
// MARK: - Alpha Values
@objc static let unimportantElementOpacity = CGFloat(0.6)
@objc static let conversationCellTimestampOpacity = CGFloat(0.4)
@objc static let textFieldBorderOpacity = CGFloat(0.4)
@objc static let modalBackgroundOpacity = CGFloat(0.75)
@objc static let composeViewTextFieldBorderOpacity = CGFloat(0.12)
@objc static let composeViewTextFieldPlaceholderOpacity = CGFloat(0.4)
// MARK: - Font Sizes
@objc static let verySmallFontSize = CGFloat(10)
@objc static let smallFontSize = CGFloat(13)
@objc static let mediumFontSize = CGFloat(15)
@objc static let largeFontSize = CGFloat(20)
@objc static let veryLargeFontSize = CGFloat(25)
@objc static let massiveFontSize = CGFloat(50)
// MARK: - Element Sizes
@objc static let smallButtonHeight = isSmallScreen ? CGFloat(24) : CGFloat(27)
@objc static let mediumButtonHeight = isSmallScreen ? CGFloat(30) : CGFloat(34)
@objc static let largeButtonHeight = isSmallScreen ? CGFloat(40) : CGFloat(45)
@objc static let accentLineThickness = CGFloat(4)
@objc static let verySmallProfilePictureSize = CGFloat(26)
@objc static let smallProfilePictureSize = CGFloat(35)
@objc static let mediumProfilePictureSize = CGFloat(45)
@objc static let largeProfilePictureSize = CGFloat(75)
@objc static let borderThickness = CGFloat(1)
@objc static let conversationCellStatusIndicatorSize = CGFloat(14)
@objc static let searchBarHeight = CGFloat(36)
@objc static let newConversationButtonSize = CGFloat(45)
@objc static let textFieldHeight = isSmallScreen ? CGFloat(48) : CGFloat(80)
@objc static let textFieldCornerRadius = CGFloat(8)
@objc static let separatorLabelHeight = CGFloat(24)
@objc static var separatorThickness: CGFloat { return 1 / UIScreen.main.scale }
@objc static let tabBarHeight = isSmallScreen ? CGFloat(32) : CGFloat(48)
@objc static let settingButtonHeight = isSmallScreen ? CGFloat(52) : CGFloat(75)
@objc static let modalCornerRadius = CGFloat(10)
@objc static let modalButtonCornerRadius = CGFloat(5)
@objc static let fakeChatBubbleWidth = CGFloat(224)
@objc static let fakeChatBubbleCornerRadius = CGFloat(10)
@objc static let fakeChatViewHeight = CGFloat(234)
@objc static let composeViewTextFieldBorderThickness = 1 / UIScreen.main.scale
@objc static let messageBubbleCornerRadius: CGFloat = 10
@objc static let progressBarThickness: CGFloat = 2
// MARK: - Distances
@objc static let verySmallSpacing = CGFloat(4)
@objc static let smallSpacing = CGFloat(8)
@objc static let mediumSpacing = CGFloat(16)
@objc static let largeSpacing = CGFloat(24)
@objc static let veryLargeSpacing = CGFloat(35)
@objc static let massiveSpacing = CGFloat(64)
@objc static let newConversationButtonBottomOffset = CGFloat(52)
@objc static let onboardingButtonBottomOffset = isSmallScreen ? CGFloat(52) : CGFloat(72)
// MARK: - Animation Values
@objc static let fakeChatStartDelay: TimeInterval = 1.5
@objc static let fakeChatAnimationDuration: TimeInterval = 0.4
@objc static let fakeChatDelay: TimeInterval = 2
@objc static let fakeChatMessagePopAnimationStartScale: CGFloat = 0.6
}

View File

@ -13,7 +13,7 @@ final class DisplayNameVC : UIViewController {
}()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Lifecycle
override func viewDidLoad() {

View File

@ -20,7 +20,7 @@ final class HomeVC : UIViewController, UITableViewDataSource, UITableViewDelegat
private let editingDatabaseConnection = OWSPrimaryStorage.shared().newDatabaseConnection()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
private lazy var seedReminderView: SeedReminderView = {

View File

@ -6,7 +6,7 @@ final class JoinPublicChatVC : UIViewController, UIPageViewControllerDataSource,
private var targetVCIndex: Int?
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
private lazy var tabBar: TabBar = {

View File

@ -34,7 +34,7 @@ final class LandingVC : UIViewController, LinkDeviceVCDelegate, DeviceLinkingMod
}()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Lifecycle
override func viewDidLoad() {

View File

@ -6,7 +6,7 @@ final class LinkDeviceVC : UIViewController, UIPageViewControllerDataSource, UIP
var delegate: LinkDeviceVCDelegate?
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
private lazy var tabBar: TabBar = {

View File

@ -4,7 +4,7 @@ class Modal : UIViewController {
private(set) var verticalCenteringConstraint: NSLayoutConstraint!
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
lazy var contentView: UIView = {

View File

@ -5,7 +5,7 @@ final class NewPrivateChatVC : UIViewController, UIPageViewControllerDataSource,
private var targetVCIndex: Int?
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
private lazy var tabBar: TabBar = {

View File

@ -6,7 +6,7 @@ final class QRCodeVC : UIViewController, UIPageViewControllerDataSource, UIPageV
private var tabBarTopConstraint: NSLayoutConstraint!
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
private lazy var tabBar: TabBar = {

View File

@ -38,7 +38,7 @@ final class RegisterVC : UIViewController {
}()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Lifecycle
override func viewDidLoad() {

View File

@ -30,7 +30,7 @@ final class RestoreVC : UIViewController {
}()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Lifecycle
override func viewDidLoad() {

View File

@ -53,7 +53,7 @@ final class SeedVC : UIViewController {
}()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Lifecycle
override func viewDidLoad() {

View File

@ -13,7 +13,7 @@ final class SettingsVC : UIViewController, AvatarViewHelperDelegate {
}()
// MARK: Settings
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
private lazy var profilePictureView: ProfilePictureView = {

View File

@ -4,7 +4,7 @@ class Sheet : UIViewController {
// MARK: Settings
let overshoot: CGFloat = 40
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent }
// MARK: Components
lazy var contentView: UIView = {

View File

@ -0,0 +1,10 @@
public enum AppMode {
case light, dark
public static var current: AppMode = .light
}
public var isLightMode: Bool {
return AppMode.current == .light
}

View File

@ -0,0 +1,38 @@
@objc public extension UIColor {
@objc public convenience init(hex value: UInt) {
let red = CGFloat((value >> 16) & 0xff) / 255
let green = CGFloat((value >> 8) & 0xff) / 255
let blue = CGFloat((value >> 0) & 0xff) / 255
self.init(red: red, green: green, blue: blue, alpha: 1)
}
}
@objc(LKColors)
public final class Colors : NSObject {
@objc public static var accent = isLightMode ? UIColor(hex: 0x00E97B) : UIColor(hex: 0x00F782)
@objc public static var text = isLightMode ? UIColor(hex: 0x000000) : UIColor(hex: 0xFFFFFF)
@objc public static var destructive = UIColor(hex: 0xFF453A)
@objc public static var unimportant = UIColor(hex: 0xD8D8D8)
@objc public static var border = UIColor(hex: 0x979797)
@objc public static var cellBackground = isLightMode ? UIColor(hex: 0xFCFCFC) : UIColor(hex: 0x1B1B1B)
@objc public static var cellSelected = isLightMode ? UIColor(hex: 0xDFDFDF) : UIColor(hex: 0x0C0C0C)
@objc public static var navigationBarBackground = isLightMode ? UIColor(hex: 0xFCFCFC) : UIColor(hex: 0x161616)
@objc public static var searchBarPlaceholder = UIColor(hex: 0x8E8E93) // Also used for the icons
@objc public static var searchBarBackground = UIColor(red: 142 / 255, green: 142 / 255, blue: 147 / 255, alpha: 0.12)
@objc public static var newConversationButtonShadow = UIColor(hex: 0x077C44)
@objc public static var separator = UIColor(hex: 0x36383C)
@objc public static var unimportantButtonBackground = UIColor(hex: 0x323232)
@objc public static var buttonBackground = UIColor(hex: 0x1B1B1B)
@objc public static var settingButtonSelected = UIColor(hex: 0x0C0C0C)
@objc public static var modalBackground = UIColor(hex: 0x101011)
@objc public static var modalBorder = UIColor(hex: 0x212121)
@objc public static var fakeChatBubbleBackground = isLightMode ? UIColor(hex: 0xFAFAFA) : UIColor(hex: 0x3F4146)
@objc public static var fakeChatBubbleText = UIColor(hex: 0x000000)
@objc public static var composeViewBackground = UIColor(hex: 0x1B1B1B)
@objc public static var composeViewTextFieldBackground = UIColor(hex: 0x141414)
@objc public static var receivedMessageBackground = UIColor(hex: 0x222325)
@objc public static var sentMessageBackground = UIColor(hex: 0x3F4146)
}

View File

@ -0,0 +1,12 @@
@objc(LKFonts)
public final class Fonts : NSObject {
@objc public static func spaceMono(ofSize size: CGFloat) -> UIFont {
return UIFont(name: "SpaceMono-Regular", size: size)!
}
@objc public static func boldSpaceMono(ofSize size: CGFloat) -> UIFont {
return UIFont(name: "SpaceMono-Bold", size: size)!
}
}

View File

@ -0,0 +1,35 @@
@objc(LKGradient)
public final class Gradient : NSObject {
public let start: UIColor
public let end: UIColor
private override init() { preconditionFailure("Use init(start:end:) instead.") }
@objc public init(start: UIColor, end: UIColor) {
self.start = start
self.end = end
super.init()
}
}
@objc public extension UIView {
@objc public func setGradient(_ gradient: Gradient) {
let layer = CAGradientLayer()
layer.frame = UIScreen.main.bounds
layer.colors = [ gradient.start.cgColor, gradient.end.cgColor ]
self.layer.insertSublayer(layer, at: 0)
}
}
@objc(LKGradients)
final public class Gradients : NSObject {
@objc public static var defaultLokiBackground: Gradient {
switch AppMode.current {
case .light: return Gradient(start: UIColor(hex: 0xFCFCFC), end: UIColor(hex: 0xFFFFFF))
case .dark: return Gradient(start: UIColor(hex: 0x171717), end: UIColor(hex: 0x121212))
}
}
}

View File

@ -0,0 +1,64 @@
@objc(LKValues)
public final class Values : NSObject {
// MARK: - Alpha Values
@objc public static let unimportantElementOpacity = CGFloat(0.6)
@objc public static let conversationCellTimestampOpacity = CGFloat(0.4)
@objc public static let textFieldBorderOpacity = CGFloat(0.4)
@objc public static let modalBackgroundOpacity = CGFloat(0.75)
@objc public static let composeViewTextFieldBorderOpacity = CGFloat(0.12)
@objc public static let composeViewTextFieldPlaceholderOpacity = CGFloat(0.4)
// MARK: - Font Sizes
@objc public static let verySmallFontSize = CGFloat(10)
@objc public static let smallFontSize = CGFloat(13)
@objc public static let mediumFontSize = CGFloat(15)
@objc public static let largeFontSize = CGFloat(20)
@objc public static let veryLargeFontSize = CGFloat(25)
@objc public static let massiveFontSize = CGFloat(50)
// MARK: - Element Sizes
@objc public static let smallButtonHeight = isSmallScreen ? CGFloat(24) : CGFloat(27)
@objc public static let mediumButtonHeight = isSmallScreen ? CGFloat(30) : CGFloat(34)
@objc public static let largeButtonHeight = isSmallScreen ? CGFloat(40) : CGFloat(45)
@objc public static let accentLineThickness = CGFloat(4)
@objc public static let verySmallProfilePictureSize = CGFloat(26)
@objc public static let smallProfilePictureSize = CGFloat(35)
@objc public static let mediumProfilePictureSize = CGFloat(45)
@objc public static let largeProfilePictureSize = CGFloat(75)
@objc public static let borderThickness = CGFloat(1)
@objc public static let conversationCellStatusIndicatorSize = CGFloat(14)
@objc public static let searchBarHeight = CGFloat(36)
@objc public static let newConversationButtonSize = CGFloat(45)
@objc public static let textFieldHeight = isSmallScreen ? CGFloat(48) : CGFloat(80)
@objc public static let textFieldCornerRadius = CGFloat(8)
@objc public static let separatorLabelHeight = CGFloat(24)
@objc public static var separatorThickness: CGFloat { return 1 / UIScreen.main.scale }
@objc public static let tabBarHeight = isSmallScreen ? CGFloat(32) : CGFloat(48)
@objc public static let settingButtonHeight = isSmallScreen ? CGFloat(52) : CGFloat(75)
@objc public static let modalCornerRadius = CGFloat(10)
@objc public static let modalButtonCornerRadius = CGFloat(5)
@objc public static let fakeChatBubbleWidth = CGFloat(224)
@objc public static let fakeChatBubbleCornerRadius = CGFloat(10)
@objc public static let fakeChatViewHeight = CGFloat(234)
@objc public static let composeViewTextFieldBorderThickness = 1 / UIScreen.main.scale
@objc public static let messageBubbleCornerRadius: CGFloat = 10
@objc public static let progressBarThickness: CGFloat = 2
// MARK: - Distances
@objc public static let verySmallSpacing = CGFloat(4)
@objc public static let smallSpacing = CGFloat(8)
@objc public static let mediumSpacing = CGFloat(16)
@objc public static let largeSpacing = CGFloat(24)
@objc public static let veryLargeSpacing = CGFloat(35)
@objc public static let massiveSpacing = CGFloat(64)
@objc public static let newConversationButtonBottomOffset = CGFloat(52)
@objc public static let onboardingButtonBottomOffset = isSmallScreen ? CGFloat(52) : CGFloat(72)
// MARK: - Animation Values
@objc public static let fakeChatStartDelay: TimeInterval = 1.5
@objc public static let fakeChatAnimationDuration: TimeInterval = 0.4
@objc public static let fakeChatDelay: TimeInterval = 2
@objc public static let fakeChatMessagePopAnimationStartScale: CGFloat = 0.6
}

View File

@ -1,4 +1,4 @@
var isSmallScreen: Bool {
public var isSmallScreen: Bool {
return (UIScreen.main.bounds.height - 568) < 1
}

View File

@ -75,9 +75,9 @@ public class OWSNavigationBar: UINavigationBar {
return
}
backgroundColor = UIColor(rgbHex: 0x161616) // Colors.navigationBarBackground
backgroundColor = Colors.navigationBarBackground
tintColor = UIColor(rgbHex: 0xFFFFFF) // Colors.text
tintColor = Colors.text
if UIAccessibility.isReduceTransparencyEnabled {
blurEffectView?.isHidden = true