Merge remote-tracking branch 'upstream/swiftui' into swiftui

This commit is contained in:
Stuart Breckenridge 2020-07-04 17:50:11 +08:00
commit ff6fd64557
20 changed files with 320 additions and 138 deletions

View File

@ -1,5 +1,5 @@
// //
// AddWebFeedViewModel.swift // AddWebFeedModel.swift
// NetNewsWire // NetNewsWire
// //
// Created by Stuart Breckenridge on 4/7/20. // Created by Stuart Breckenridge on 4/7/20.
@ -30,7 +30,7 @@ enum AddWebFeedError: LocalizedError {
} }
class AddWebFeedViewModel: ObservableObject { class AddWebFeedModel: ObservableObject {
@Published var shouldDismiss: Bool = false @Published var shouldDismiss: Bool = false
@Published var providedURL: String = "" @Published var providedURL: String = ""

View File

@ -14,7 +14,7 @@ import RSCore
struct AddWebFeedView: View { struct AddWebFeedView: View {
@Environment(\.presentationMode) private var presentationMode @Environment(\.presentationMode) private var presentationMode
@ObservedObject private var viewModel = AddWebFeedViewModel() @ObservedObject private var viewModel = AddWebFeedModel()
@ViewBuilder var body: some View { @ViewBuilder var body: some View {
#if os(iOS) #if os(iOS)

View File

@ -13,70 +13,102 @@ import Account
struct AppAssets { struct AppAssets {
static var accountLocalMacImage: RSImage! = { static var accountLocalMacImage: RSImage! = {
return RSImage(named: "accountLocalMac") return RSImage(named: "AccountLocalMac")
}() }()
static var accountLocalPadImage: RSImage = { static var accountLocalPadImage: RSImage = {
return RSImage(named: "accountLocalPad")! return RSImage(named: "AccountLocalPad")!
}() }()
static var accountLocalPhoneImage: RSImage = { static var accountLocalPhoneImage: RSImage = {
return RSImage(named: "accountLocalPhone")! return RSImage(named: "AccountLocalPhone")!
}() }()
static var accountCloudKitImage: RSImage = { static var accountCloudKitImage: RSImage = {
return RSImage(named: "accountCloudKit")! return RSImage(named: "AccountCloudKit")!
}() }()
static var accountFeedbinImage: RSImage = { static var accountFeedbinImage: RSImage = {
return RSImage(named: "accountFeedbin")! return RSImage(named: "AccountFeedbin")!
}() }()
static var accountFeedlyImage: RSImage = { static var accountFeedlyImage: RSImage = {
return RSImage(named: "accountFeedly")! return RSImage(named: "AccountFeedly")!
}() }()
static var accountFeedWranglerImage: RSImage = { static var accountFeedWranglerImage: RSImage = {
return RSImage(named: "accountFeedWrangler")! return RSImage(named: "AccountFeedWrangler")!
}() }()
static var accountFreshRSSImage: RSImage = { static var accountFreshRSSImage: RSImage = {
return RSImage(named: "accountFreshRSS")! return RSImage(named: "AccountFreshRSS")!
}() }()
static var accountNewsBlurImage: RSImage = { static var accountNewsBlurImage: RSImage = {
return RSImage(named: "accountNewsBlur")! return RSImage(named: "AccountNewsBlur")!
}() }()
static var addMenuImage: Image = {
return Image(systemName: "plus")
}()
static var extensionPointMarsEdit: RSImage = { static var extensionPointMarsEdit: RSImage = {
return RSImage(named: "extensionPointMarsEdit")! return RSImage(named: "ExtensionPointMarsEdit")!
}() }()
static var extensionPointMicroblog: RSImage = { static var extensionPointMicroblog: RSImage = {
return RSImage(named: "extensionPointMicroblog")! return RSImage(named: "ExtensionPointMicroblog")!
}() }()
static var extensionPointReddit: RSImage = { static var extensionPointReddit: RSImage = {
return RSImage(named: "extensionPointReddit")! return RSImage(named: "ExtensionPointReddit")!
}() }()
static var extensionPointTwitter: RSImage = { static var extensionPointTwitter: RSImage = {
return RSImage(named: "extensionPointTwitter")! return RSImage(named: "ExtensionPointTwitter")!
}() }()
static var faviconTemplateImage: RSImage = { static var faviconTemplateImage: RSImage = {
return RSImage(named: "faviconTemplateImage")! return RSImage(named: "FaviconTemplateImage")!
}() }()
static var masterFolderImage: IconImage = { static var settingsImage: Image = {
return Image(systemName: "gear")
}()
static var masterFolderImage: IconImage {
#if os(macOS) #if os(macOS)
return IconImage(NSImage(systemSymbolName: "folder.fill", accessibilityDescription: nil)!) let image = NSImage(systemSymbolName: "folder.fill", accessibilityDescription: nil)!
let coloredImage = image.tinted(with: NSColor(named: "AccentColor")!)
return IconImage(coloredImage)
#endif #endif
#if os(iOS) #if os(iOS)
return IconImage(UIImage(systemName: "folder.fill")!) let image = UIImage(systemName: "folder.fill")!
let coloredImage = image.tinted(color: UIColor(named: "AccentColor")!)!
return IconImage(coloredImage)
#endif #endif
}
static var markAllAsReadImage: Image = {
return Image("MarkAllAsRead")
}() }()
static var markAllAsReadImagePDF: Image = {
return Image("MarkAllAsReadPDF")
}()
static var nextUnreadArticleImage: Image = {
return Image(systemName: "chevron.down.circle")
}()
static var openInBrowserImage: Image = {
return Image(systemName: "safari")
}()
static var refreshImage: Image = {
return Image(systemName: "arrow.clockwise")
}()
static var searchFeedImage: IconImage = { static var searchFeedImage: IconImage = {
#if os(macOS) #if os(macOS)
return IconImage(NSImage(systemSymbolName: "magnifyingglass", accessibilityDescription: nil)!) return IconImage(NSImage(systemSymbolName: "magnifyingglass", accessibilityDescription: nil)!)
@ -86,6 +118,18 @@ struct AppAssets {
#endif #endif
}() }()
static var sidebarUnreadCountBackground: Color = {
return Color("SidebarUnreadCountBackground")
}()
static var sidebarUnreadCountForeground: Color = {
return Color("SidebarUnreadCountForeground")
}()
static var shareImage: Image = {
Image(systemName: "square.and.arrow.up")
}()
static var smartFeedImage: RSImage = { static var smartFeedImage: RSImage = {
#if os(macOS) #if os(macOS)
return NSImage(systemSymbolName: "gear", accessibilityDescription: nil)! return NSImage(systemSymbolName: "gear", accessibilityDescription: nil)!
@ -97,40 +141,76 @@ struct AppAssets {
static var starredFeedImage: IconImage = { static var starredFeedImage: IconImage = {
#if os(macOS) #if os(macOS)
return IconImage(NSImage(systemSymbolName: "star.fill", accessibilityDescription: nil)!) let image = NSImage(systemSymbolName: "star.fill", accessibilityDescription: nil)!
let coloredImage = image.tinted(with: NSColor(named: "StarColor")!)
return IconImage(coloredImage)
#endif #endif
#if os(iOS) #if os(iOS)
return IconImage(UIImage(systemName: "star.fill")!) let image = UIImage(systemName: "star.fill")!
let coloredImage = image.tinted(color: UIColor(named: "StarColor")!)!
return IconImage(coloredImage)
#endif #endif
}() }()
static var timelineStarred: Image = { static var timelineStarred: Image = {
return Image(systemName: "star.fill") #if os(macOS)
let image = NSImage(systemSymbolName: "star.fill", accessibilityDescription: nil)!
let coloredImage = image.tinted(with: NSColor(named: "StarColor")!)
return Image(nsImage: coloredImage)
#endif
#if os(iOS)
let image = UIImage(systemName: "star.fill")!
let coloredImage = image.tinted(color: UIColor(named: "StarColor")!)!
return Image(uiImage: coloredImage)
#endif
}() }()
static var timelineUnread: Image = { static var timelineUnread: Image {
return Image(systemName: "circle.fill") #if os(macOS)
let image = NSImage(systemSymbolName: "circle.fill", accessibilityDescription: nil)!
}() let coloredImage = image.tinted(with: NSColor(named: "AccentColor")!)
return Image(nsImage: coloredImage)
#endif
#if os(iOS)
let image = UIImage(systemName: "circle.fill")!
let coloredImage = image.tinted(color: UIColor(named: "AccentColor")!)!
return Image(uiImage: coloredImage)
#endif
}
static var todayFeedImage: IconImage = { static var todayFeedImage: IconImage = {
#if os(macOS) #if os(macOS)
return IconImage(NSImage(systemSymbolName: "sun.max.fill", accessibilityDescription: nil)!) let image = NSImage(systemSymbolName: "sun.max.fill", accessibilityDescription: nil)!
let coloredImage = image.tinted(with: .orange)
return IconImage(coloredImage)
#endif #endif
#if os(iOS) #if os(iOS)
return IconImage(UIImage(systemName: "sun.max.fill")!) let image = UIImage(systemName: "sun.max.fill")!
let coloredImage = image.tinted(color: .orange)!
return IconImage(coloredImage)
#endif #endif
}() }()
static var unreadFeedImage: IconImage = { static var toggleStarred: Image = {
return Image(systemName: "star.fill")
}()
static var toggleRead: Image = {
return Image(systemName: "largecircle.fill.circle")
}()
static var unreadFeedImage: IconImage {
#if os(macOS) #if os(macOS)
return IconImage(NSImage(systemSymbolName: "largecircle.fill.circle", accessibilityDescription: nil)!) let image = NSImage(systemSymbolName: "largecircle.fill.circle", accessibilityDescription: nil)!
let coloredImage = image.tinted(with: NSColor(named: "AccentColor")!)
return IconImage(coloredImage)
#endif #endif
#if os(iOS) #if os(iOS)
return IconImage(UIImage(systemName: "largecircle.fill.circle")!) let image = UIImage(systemName: "largecircle.fill.circle")!
let coloredImage = image.tinted(color: UIColor(named: "AccentColor")!)!
return IconImage(coloredImage)
#endif #endif
}() }
static func image(for accountType: AccountType) -> RSImage? { static func image(for accountType: AccountType) -> RSImage? {
switch accountType { switch accountType {

View File

@ -23,9 +23,9 @@
"color-space" : "srgb", "color-space" : "srgb",
"components" : { "components" : {
"alpha" : "1.000", "alpha" : "1.000",
"blue" : "0.945", "blue" : "0.957",
"green" : "0.502", "green" : "0.620",
"red" : "0.176" "red" : "0.369"
} }
}, },
"idiom" : "universal" "idiom" : "universal"

View File

@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "MarkAllAsReadPDF.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.500",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.900",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.204",
"green" : "0.776",
"red" : "0.976"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg width="3300px" height="2200px" viewBox="0 0 3300 2200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <svg width="3300px" height="2200px" viewBox="0 0 3300 2200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 60.1 (88133) - https://sketch.com --> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
<title>Untitled</title> <title>markAllAsRead</title>
<desc>Created with Sketch.</desc> <desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="markAllAsRead"> <g id="markAllAsRead">
@ -136,6 +136,11 @@
<path d="M50.45587,25 C77.70197,25 100.30977,47.6074 100.30977,74.8047 C100.30977,74.870144 100.30964,74.935561 100.30938,75.0009507 L99.8322178,75.0006156 C97.6995557,51.580586 76.5280991,33.3008 50.4213361,33.3008 C24.3145732,33.3008 3.24806132,51.580586 1.17616722,75.0006156 L0.701,75 L0.7,74.8047 C0.7,47.879373 22.8096545,25.452607 49.6413605,25.0067642 Z" id="Combined-Shape"></path> <path d="M50.45587,25 C77.70197,25 100.30977,47.6074 100.30977,74.8047 C100.30977,74.870144 100.30964,74.935561 100.30938,75.0009507 L99.8322178,75.0006156 C97.6995557,51.580586 76.5280991,33.3008 50.4213361,33.3008 C24.3145732,33.3008 3.24806132,51.580586 1.17616722,75.0006156 L0.701,75 L0.7,74.8047 C0.7,47.879373 22.8096545,25.452607 49.6413605,25.0067642 Z" id="Combined-Shape"></path>
<path d="M50.45587,-1.77635684e-14 C77.70197,-1.77635684e-14 100.30977,22.6074 100.30977,49.8047 C100.30977,49.870144 100.30964,49.935561 100.30938,50.0009507 L99.8322178,50.0006156 C97.6995557,26.580586 76.5280991,8.3008 50.4213361,8.3008 C24.3145732,8.3008 3.24806132,26.580586 1.17616722,50.0006156 L0.701,50 L0.7,49.8047 C0.7,22.879373 22.8096545,0.45260699 49.6413605,0.0067642025 Z" id="Combined-Shape"></path> <path d="M50.45587,-1.77635684e-14 C77.70197,-1.77635684e-14 100.30977,22.6074 100.30977,49.8047 C100.30977,49.870144 100.30964,49.935561 100.30938,50.0009507 L99.8322178,50.0006156 C97.6995557,26.580586 76.5280991,8.3008 50.4213361,8.3008 C24.3145732,8.3008 3.24806132,26.580586 1.17616722,50.0006156 L0.701,50 L0.7,49.8047 C0.7,22.879373 22.8096545,0.45260699 49.6413605,0.0067642025 Z" id="Combined-Shape"></path>
</g> </g>
<g id="Medium-M" transform="translate(0.300000, 0.000000)">
<path d="M50.50467,149.611301 C77.75077,149.611301 100.30977,127.052691 100.30977,99.8066015 C100.30977,72.6093015 77.70197,50.0019015 50.45587,50.0019015 C23.25857,50.0019015 0.7,72.6093015 0.7,99.8066015 C0.7,127.052691 23.30747,149.611301 50.50467,149.611301 Z M50.50467,141.310501 C27.45777,141.310501 9.04957,122.853501 9.04957,99.8066015 C9.04957,76.8085015 27.40897,58.3027015 50.45587,58.3027015 C73.50277,58.3027015 91.95977,76.8085015 92.0088671,99.8066015 C92.05777,122.853501 73.55157,141.310501 50.50467,141.310501 Z" id="Shape"></path>
<path d="M50.45587,25.0009507 C77.70197,25.0009507 100.30977,47.6083507 100.30977,74.8056507 C100.30977,74.8710948 100.30964,74.9365118 100.30938,75.0019015 L99.8322178,75.0015664 C97.6995557,51.5815367 76.5280991,33.3017507 50.4213361,33.3017507 C24.3145732,33.3017507 3.24806132,51.5815367 1.17616722,75.0015664 L0.701,75.0009507 L0.7,74.8056507 C0.7,47.8803237 22.8096545,25.4535577 49.6413605,25.0077149 Z" id="Combined-Shape"></path>
<path d="M50.45587,-1.77635684e-14 C77.70197,-1.77635684e-14 100.30977,22.6074 100.30977,49.8047 C100.30977,49.870144 100.30964,49.935561 100.30938,50.0009507 L99.8322178,50.0006156 C97.6995557,26.580586 76.5280991,8.3008 50.4213361,8.3008 C24.3145732,8.3008 3.24806132,26.580586 1.17616722,50.0006156 L0.701,50 L0.7,49.8047 C0.7,22.879373 22.8096545,0.45260699 49.6413605,0.0067642025 Z" id="Combined-Shape"></path>
</g>
</g> </g>
</g> </g>
</g> </g>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -34,61 +34,65 @@ struct MainApp: App {
} }
.toolbar { .toolbar {
ToolbarItem { ToolbarItem() {
Button(action: { showSheet = true }, label: { Menu {
Image(systemName: "plus").foregroundColor(.secondary) Button("Add Web Feed", action: { showSheet = true })
}).help("Add Feed") Button("Add Reddit Feed", action: { })
Button("Add Twitter Feed", action: { })
Button("Add Folder", action: { })
} label : {
AppAssets.addMenuImage
}
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { Button(action: {}, label: {
Image(systemName: "folder.fill.badge.plus").foregroundColor(.pink) AppAssets.refreshImage
}).help("New Folder")
}
ToolbarItem {
Button(action: {}, label: {
Image(systemName: "arrow.clockwise").foregroundColor(.secondary)
}).help("Refresh").padding(.trailing, 40) }).help("Refresh").padding(.trailing, 40)
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { Button(action: {}, label: {
Image(systemName: "circle.dashed").foregroundColor(.orange) AppAssets.markAllAsReadImagePDF
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
}).help("Mark All as Read") }).help("Mark All as Read")
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { MacSearchField()
Image(systemName: "arrow.triangle.turn.up.right.circle.fill").foregroundColor(.purple) .frame(width: 200)
}).help("Go to Next Unread")
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { Button(action: {}, label: {
Image(systemName: "star.fill").foregroundColor(.yellow) AppAssets.nextUnreadArticleImage
}).help("Go to Next Unread").padding(.trailing, 40)
}
ToolbarItem {
Button(action: {}, label: {
AppAssets.toggleStarred
}).help("Mark as Starred") }).help("Mark as Starred")
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { Button(action: {}, label: {
Image(systemName: "checkmark.circle.fill").foregroundColor(.green) AppAssets.toggleRead
}).help("Mark as Unread") }).help("Mark as Unread")
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { Button(action: {}, label: {
Image(systemName: "safari").foregroundColor(.blue) AppAssets.openInBrowserImage
}).help("Open in Browser") }).help("Open in Browser")
} }
ToolbarItem { ToolbarItem {
Button(action: {}, label: { Button(action: {}, label: {
Image(systemName: "square.and.arrow.up") AppAssets.shareImage
}).help("Share") }).help("Share")
} }
ToolbarItem {
MacSearchField()
.frame(width: 300)
}
} }
} }
.commands { .commands {
@ -199,20 +203,3 @@ struct MainApp: App {
#endif #endif
} }
} }
struct PreferredColorSchemeModifier: ViewModifier {
var preferredColorScheme: UserInterfaceColorPalette
@ViewBuilder
func body(content: Content) -> some View {
switch preferredColorScheme {
case .automatic:
content
case .dark:
content.preferredColorScheme(.dark)
case .light:
content.preferredColorScheme(.light)
}
}
}

View File

@ -22,19 +22,14 @@ fileprivate class SidebarToolbarViewModel: ObservableObject {
} }
@Published var showActionSheet: Bool = false @Published var showActionSheet: Bool = false
@Published var showAddSheet: Bool = false @Published var showAddSheet: Bool = false
} }
struct SidebarToolbar: View { struct SidebarToolbar: View {
@EnvironmentObject private var appSettings: AppDefaults @EnvironmentObject private var appSettings: AppDefaults
@StateObject private var viewModel = SidebarToolbarViewModel() @StateObject private var viewModel = SidebarToolbarViewModel()
var addActionSheetButtons = [
Button(action: {}, label: { Text("Add Feed") })
]
var body: some View { var body: some View {
VStack { VStack {
Divider() Divider()
@ -42,7 +37,7 @@ struct SidebarToolbar: View {
Button(action: { Button(action: {
viewModel.sheetToShow = .settings viewModel.sheetToShow = .settings
}, label: { }, label: {
Image(systemName: "gear") AppAssets.settingsImage
.font(.title3) .font(.title3)
.foregroundColor(.accentColor) .foregroundColor(.accentColor)
}).help("Settings") }).help("Settings")
@ -58,7 +53,7 @@ struct SidebarToolbar: View {
Button(action: { Button(action: {
viewModel.showActionSheet = true viewModel.showActionSheet = true
}, label: { }, label: {
Image(systemName: "plus") AppAssets.addMenuImage
.font(.title3) .font(.title3)
.foregroundColor(.accentColor) .foregroundColor(.accentColor)
}) })

View File

@ -14,10 +14,12 @@ struct UnreadCountView: View {
var body: some View { var body: some View {
Text(verbatim: String(count)) Text(verbatim: String(count))
.font(.footnote) .font(.caption)
.fontWeight(.bold)
.padding(.horizontal, 7) .padding(.horizontal, 7)
.padding(.vertical, 1) .padding(.vertical, 1)
.background(SwiftUI.Color.gray.opacity(0.5)) .background(AppAssets.sidebarUnreadCountBackground)
.foregroundColor(AppAssets.sidebarUnreadCountForeground)
.cornerRadius(8) .cornerRadius(8)
} }
} }

View File

@ -0,0 +1,27 @@
//
// PreferredColorSchemeModifier.swift
// NetNewsWire
//
// Created by Maurice Parker on 7/3/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import SwiftUI
struct PreferredColorSchemeModifier: ViewModifier {
var preferredColorScheme: UserInterfaceColorPalette
@ViewBuilder
func body(content: Content) -> some View {
switch preferredColorScheme {
case .automatic:
content.preferredColorScheme(nil)
case .dark:
content.preferredColorScheme(.dark)
case .light:
content.preferredColorScheme(.light)
}
}
}

View File

@ -19,12 +19,10 @@ struct TimelineItemStatusView: View {
.resizable() .resizable()
.frame(width: 8, height: 8, alignment: .center) .frame(width: 8, height: 8, alignment: .center)
.padding(.all, 2) .padding(.all, 2)
.foregroundColor(.accentColor)
case .showStar: case .showStar:
AppAssets.timelineStarred AppAssets.timelineStarred
.resizable() .resizable()
.frame(width: 10, height: 10, alignment: .center) .frame(width: 10, height: 10, alignment: .center)
.foregroundColor(.yellow)
case .showNone: case .showNone:
AppAssets.timelineUnread AppAssets.timelineUnread
.resizable() .resizable()

View File

@ -14,7 +14,14 @@ struct TimelineItemView: View {
@StateObject var articleIconImageLoader = ArticleIconImageLoader() @StateObject var articleIconImageLoader = ArticleIconImageLoader()
var timelineItem: TimelineItem var timelineItem: TimelineItem
#if os(macOS)
var verticalPadding: CGFloat = 10
#endif
#if os(iOS)
var verticalPadding: CGFloat = 0
#endif
var body: some View { var body: some View {
VStack { VStack {
HStack(alignment: .top) { HStack(alignment: .top) {
@ -46,6 +53,7 @@ struct TimelineItemView: View {
} }
} }
} }
.padding(.vertical, verticalPadding)
.onAppear { .onAppear {
articleIconImageLoader.loadImage(for: timelineItem.article) articleIconImageLoader.loadImage(for: timelineItem.article)
} }

View File

@ -27,8 +27,8 @@
17930ED524AF10EE00A9BA52 /* AddWebFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17930ED324AF10EE00A9BA52 /* AddWebFeedView.swift */; }; 17930ED524AF10EE00A9BA52 /* AddWebFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17930ED324AF10EE00A9BA52 /* AddWebFeedView.swift */; };
179DB1DFBCF9177104B12E0F /* AccountsNewsBlurWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179DBBA2B22A659F81EED6F9 /* AccountsNewsBlurWindowController.swift */; }; 179DB1DFBCF9177104B12E0F /* AccountsNewsBlurWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179DBBA2B22A659F81EED6F9 /* AccountsNewsBlurWindowController.swift */; };
179DB3CE822BFCC2D774D9F4 /* AccountsNewsBlurWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179DBBA2B22A659F81EED6F9 /* AccountsNewsBlurWindowController.swift */; }; 179DB3CE822BFCC2D774D9F4 /* AccountsNewsBlurWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179DBBA2B22A659F81EED6F9 /* AccountsNewsBlurWindowController.swift */; };
17D232A824AFF10A0005F075 /* AddWebFeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D232A724AFF10A0005F075 /* AddWebFeedViewModel.swift */; }; 17D232A824AFF10A0005F075 /* AddWebFeedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D232A724AFF10A0005F075 /* AddWebFeedModel.swift */; };
17D232A924AFF10A0005F075 /* AddWebFeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D232A724AFF10A0005F075 /* AddWebFeedViewModel.swift */; }; 17D232A924AFF10A0005F075 /* AddWebFeedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D232A724AFF10A0005F075 /* AddWebFeedModel.swift */; };
3B3A32A5238B820900314204 /* FeedWranglerAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */; }; 3B3A32A5238B820900314204 /* FeedWranglerAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */; };
3B826DCB2385C84800FC1ADB /* AccountsFeedWrangler.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */; }; 3B826DCB2385C84800FC1ADB /* AccountsFeedWrangler.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */; };
3B826DCC2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B826DCA2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift */; }; 3B826DCC2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B826DCA2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift */; };
@ -220,6 +220,8 @@
517A757A24451C0700B553B9 /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755524451BD500B553B9 /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 517A757A24451C0700B553B9 /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755524451BD500B553B9 /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
517A757B24451C1500B553B9 /* OAuthSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755324451BD500B553B9 /* OAuthSwift.framework */; }; 517A757B24451C1500B553B9 /* OAuthSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755324451BD500B553B9 /* OAuthSwift.framework */; };
517A757C24451C1500B553B9 /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755324451BD500B553B9 /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 517A757C24451C1500B553B9 /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755324451BD500B553B9 /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
5181C5AD24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5181C5AC24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift */; };
5181C5AE24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5181C5AC24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift */; };
5183CCD0226E1E880010922C /* NonIntrinsicLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */; }; 5183CCD0226E1E880010922C /* NonIntrinsicLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */; };
5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */; }; 5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */; };
5183CCE5226F4DFA0010922C /* RefreshInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */; }; 5183CCE5226F4DFA0010922C /* RefreshInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */; };
@ -1728,7 +1730,7 @@
17930ED324AF10EE00A9BA52 /* AddWebFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedView.swift; sourceTree = "<group>"; }; 17930ED324AF10EE00A9BA52 /* AddWebFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedView.swift; sourceTree = "<group>"; };
179DBBA2B22A659F81EED6F9 /* AccountsNewsBlurWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsNewsBlurWindowController.swift; sourceTree = "<group>"; }; 179DBBA2B22A659F81EED6F9 /* AccountsNewsBlurWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsNewsBlurWindowController.swift; sourceTree = "<group>"; };
17B223DB24AC24D2001E4592 /* TimelineLayoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineLayoutView.swift; sourceTree = "<group>"; }; 17B223DB24AC24D2001E4592 /* TimelineLayoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineLayoutView.swift; sourceTree = "<group>"; };
17D232A724AFF10A0005F075 /* AddWebFeedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedViewModel.swift; sourceTree = "<group>"; }; 17D232A724AFF10A0005F075 /* AddWebFeedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedModel.swift; sourceTree = "<group>"; };
3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedWranglerAccountViewController.swift; sourceTree = "<group>"; }; 3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedWranglerAccountViewController.swift; sourceTree = "<group>"; };
3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccountsFeedWrangler.xib; sourceTree = "<group>"; }; 3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccountsFeedWrangler.xib; sourceTree = "<group>"; };
3B826DCA2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsFeedWranglerWindowController.swift; sourceTree = "<group>"; }; 3B826DCA2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsFeedWranglerWindowController.swift; sourceTree = "<group>"; };
@ -1845,6 +1847,7 @@
517630222336657E00E15FFF /* WebViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewProvider.swift; sourceTree = "<group>"; }; 517630222336657E00E15FFF /* WebViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewProvider.swift; sourceTree = "<group>"; };
517A745A2443665000B553B9 /* UIPageViewController-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIPageViewController-Extensions.swift"; sourceTree = "<group>"; }; 517A745A2443665000B553B9 /* UIPageViewController-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIPageViewController-Extensions.swift"; sourceTree = "<group>"; };
517A754424451BD500B553B9 /* OAuthSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OAuthSwift.xcodeproj; path = submodules/OAuthSwift/OAuthSwift.xcodeproj; sourceTree = "<group>"; }; 517A754424451BD500B553B9 /* OAuthSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OAuthSwift.xcodeproj; path = submodules/OAuthSwift/OAuthSwift.xcodeproj; sourceTree = "<group>"; };
5181C5AC24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferredColorSchemeModifier.swift; sourceTree = "<group>"; };
5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = "<group>"; }; 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = "<group>"; };
5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = "<group>"; }; 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = "<group>"; };
5183CCE4226F4DFA0010922C /* RefreshInterval.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshInterval.swift; sourceTree = "<group>"; }; 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshInterval.swift; sourceTree = "<group>"; };
@ -2408,7 +2411,7 @@
17930ED224AF10CD00A9BA52 /* Add */ = { 17930ED224AF10CD00A9BA52 /* Add */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
17D232A724AFF10A0005F075 /* AddWebFeedViewModel.swift */, 17D232A724AFF10A0005F075 /* AddWebFeedModel.swift */,
17930ED324AF10EE00A9BA52 /* AddWebFeedView.swift */, 17930ED324AF10EE00A9BA52 /* AddWebFeedView.swift */,
); );
path = Add; path = Add;
@ -2578,6 +2581,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
514E6C0524AD2B5F00AC6F6E /* Image-Extensions.swift */, 514E6C0524AD2B5F00AC6F6E /* Image-Extensions.swift */,
5181C5AC24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift */,
); );
path = "SwiftUI Extensions"; path = "SwiftUI Extensions";
sourceTree = "<group>"; sourceTree = "<group>";
@ -3968,46 +3972,46 @@
TargetAttributes = { TargetAttributes = {
51314636235A7BBE00387FDC = { 51314636235A7BBE00387FDC = {
CreatedOnToolsVersion = 11.2; CreatedOnToolsVersion = 11.2;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
LastSwiftMigration = 1120; LastSwiftMigration = 1120;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
513C5CE5232571C2003D4054 = { 513C5CE5232571C2003D4054 = {
CreatedOnToolsVersion = 11.0; CreatedOnToolsVersion = 11.0;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
518B2ED12351B3DD00400001 = { 518B2ED12351B3DD00400001 = {
CreatedOnToolsVersion = 11.2; CreatedOnToolsVersion = 11.2;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
TestTargetID = 840D617B2029031C009BC708; TestTargetID = 840D617B2029031C009BC708;
}; };
51C0513C24A77DF800194D5E = { 51C0513C24A77DF800194D5E = {
CreatedOnToolsVersion = 12.0; CreatedOnToolsVersion = 12.0;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
51C0514324A77DF800194D5E = { 51C0514324A77DF800194D5E = {
CreatedOnToolsVersion = 12.0; CreatedOnToolsVersion = 12.0;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
6581C73220CED60000F4AD34 = { 6581C73220CED60000F4AD34 = {
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
65ED3FA2235DEF6C0081F399 = { 65ED3FA2235DEF6C0081F399 = {
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
65ED4090235DEF770081F399 = { 65ED4090235DEF770081F399 = {
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
840D617B2029031C009BC708 = { 840D617B2029031C009BC708 = {
CreatedOnToolsVersion = 9.3; CreatedOnToolsVersion = 9.3;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
SystemCapabilities = { SystemCapabilities = {
com.apple.BackgroundModes = { com.apple.BackgroundModes = {
@ -4017,7 +4021,7 @@
}; };
849C645F1ED37A5D003D8FC0 = { 849C645F1ED37A5D003D8FC0 = {
CreatedOnToolsVersion = 8.2.1; CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
SystemCapabilities = { SystemCapabilities = {
com.apple.HardenedRuntime = { com.apple.HardenedRuntime = {
@ -4027,7 +4031,7 @@
}; };
849C64701ED37A5D003D8FC0 = { 849C64701ED37A5D003D8FC0 = {
CreatedOnToolsVersion = 8.2.1; CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = FQLBNX3GP7; DevelopmentTeam = SHJK2V3AJG;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
TestTargetID = 849C645F1ED37A5D003D8FC0; TestTargetID = 849C645F1ED37A5D003D8FC0;
}; };
@ -4832,6 +4836,7 @@
51E4996924A8760C00B667CB /* ArticleStylesManager.swift in Sources */, 51E4996924A8760C00B667CB /* ArticleStylesManager.swift in Sources */,
51E498F324A8085D00B667CB /* PseudoFeed.swift in Sources */, 51E498F324A8085D00B667CB /* PseudoFeed.swift in Sources */,
51A5769624AE617200078888 /* ArticleContainerView.swift in Sources */, 51A5769624AE617200078888 /* ArticleContainerView.swift in Sources */,
5181C5AD24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift in Sources */,
51E4996B24A8762D00B667CB /* ArticleExtractor.swift in Sources */, 51E4996B24A8762D00B667CB /* ArticleExtractor.swift in Sources */,
51E49A0324A91FF600B667CB /* SceneNavigationView.swift in Sources */, 51E49A0324A91FF600B667CB /* SceneNavigationView.swift in Sources */,
51E4990124A808BB00B667CB /* FaviconURLFinder.swift in Sources */, 51E4990124A808BB00B667CB /* FaviconURLFinder.swift in Sources */,
@ -4840,7 +4845,7 @@
51A576BE24AE637400078888 /* ArticleView.swift in Sources */, 51A576BE24AE637400078888 /* ArticleView.swift in Sources */,
51E4995324A8734D00B667CB /* RedditFeedProvider-Extensions.swift in Sources */, 51E4995324A8734D00B667CB /* RedditFeedProvider-Extensions.swift in Sources */,
172199C924AB228900A31D04 /* SettingsView.swift in Sources */, 172199C924AB228900A31D04 /* SettingsView.swift in Sources */,
17D232A824AFF10A0005F075 /* AddWebFeedViewModel.swift in Sources */, 17D232A824AFF10A0005F075 /* AddWebFeedModel.swift in Sources */,
51E4994224A8713C00B667CB /* ArticleStatusSyncTimer.swift in Sources */, 51E4994224A8713C00B667CB /* ArticleStatusSyncTimer.swift in Sources */,
51E498F624A8085D00B667CB /* SearchFeedDelegate.swift in Sources */, 51E498F624A8085D00B667CB /* SearchFeedDelegate.swift in Sources */,
51E498F224A8085D00B667CB /* SmartFeedsController.swift in Sources */, 51E498F224A8085D00B667CB /* SmartFeedsController.swift in Sources */,
@ -4915,12 +4920,13 @@
51E4992224A8095600B667CB /* URL-Extensions.swift in Sources */, 51E4992224A8095600B667CB /* URL-Extensions.swift in Sources */,
51E4990424A808C300B667CB /* WebFeedIconDownloader.swift in Sources */, 51E4990424A808C300B667CB /* WebFeedIconDownloader.swift in Sources */,
51E498CB24A8085D00B667CB /* TodayFeedDelegate.swift in Sources */, 51E498CB24A8085D00B667CB /* TodayFeedDelegate.swift in Sources */,
17D232A924AFF10A0005F075 /* AddWebFeedViewModel.swift in Sources */, 17D232A924AFF10A0005F075 /* AddWebFeedModel.swift in Sources */,
51E4993324A867E700B667CB /* AppNotifications.swift in Sources */, 51E4993324A867E700B667CB /* AppNotifications.swift in Sources */,
51E4990624A808C300B667CB /* ImageDownloader.swift in Sources */, 51E4990624A808C300B667CB /* ImageDownloader.swift in Sources */,
51E4994F24A8734C00B667CB /* TwitterFeedProvider-Extensions.swift in Sources */, 51E4994F24A8734C00B667CB /* TwitterFeedProvider-Extensions.swift in Sources */,
51E498CA24A8085D00B667CB /* SmartFeedDelegate.swift in Sources */, 51E498CA24A8085D00B667CB /* SmartFeedDelegate.swift in Sources */,
51E4990524A808C300B667CB /* FeaturedImageDownloader.swift in Sources */, 51E4990524A808C300B667CB /* FeaturedImageDownloader.swift in Sources */,
5181C5AE24AF89B1002E0F70 /* PreferredColorSchemeModifier.swift in Sources */,
51E4991624A8090300B667CB /* ArticleUtilities.swift in Sources */, 51E4991624A8090300B667CB /* ArticleUtilities.swift in Sources */,
51919FF224AB864A00541E64 /* TimelineModel.swift in Sources */, 51919FF224AB864A00541E64 /* TimelineModel.swift in Sources */,
51E4991A24A8090F00B667CB /* IconImage.swift in Sources */, 51E4991A24A8090F00B667CB /* IconImage.swift in Sources */,

View File

@ -12,7 +12,6 @@ import RSParser
import AppKit import AppKit
typealias Font = NSFont typealias Font = NSFont
typealias FontDescriptor = NSFontDescriptor typealias FontDescriptor = NSFontDescriptor
typealias Color = NSColor
private let boldTrait = NSFontDescriptor.SymbolicTraits.bold private let boldTrait = NSFontDescriptor.SymbolicTraits.bold
private let italicTrait = NSFontDescriptor.SymbolicTraits.italic private let italicTrait = NSFontDescriptor.SymbolicTraits.italic
@ -21,7 +20,6 @@ private let monoSpaceTrait = NSFontDescriptor.SymbolicTraits.monoSpace
import UIKit import UIKit
typealias Font = UIFont typealias Font = UIFont
typealias FontDescriptor = UIFontDescriptor typealias FontDescriptor = UIFontDescriptor
typealias Color = UIColor
private let boldTrait = UIFontDescriptor.SymbolicTraits.traitBold private let boldTrait = UIFontDescriptor.SymbolicTraits.traitBold
private let italicTrait = UIFontDescriptor.SymbolicTraits.traitItalic private let italicTrait = UIFontDescriptor.SymbolicTraits.traitItalic

View File

@ -1,23 +1,18 @@
{ {
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [ "colors" : [
{ {
"idiom" : "universal",
"color" : { "color" : {
"color-space" : "srgb", "color-space" : "srgb",
"components" : { "components" : {
"red" : "0x08",
"alpha" : "1.000", "alpha" : "1.000",
"blue" : "0xEE", "blue" : "0xEE",
"green" : "0x6A" "green" : "0x6A",
"red" : "0x08"
} }
} },
"idiom" : "universal"
}, },
{ {
"idiom" : "universal",
"appearances" : [ "appearances" : [
{ {
"appearance" : "luminosity", "appearance" : "luminosity",
@ -27,12 +22,17 @@
"color" : { "color" : {
"color-space" : "srgb", "color-space" : "srgb",
"components" : { "components" : {
"red" : "0x5E",
"alpha" : "1.000", "alpha" : "1.000",
"blue" : "0xF4", "blue" : "0xF4",
"green" : "0x9E" "green" : "0x9E",
"red" : "0x5E"
} }
} },
"idiom" : "universal"
} }
] ],
} "info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -1,20 +1,20 @@
{ {
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [ "colors" : [
{ {
"idiom" : "universal",
"color" : { "color" : {
"color-space" : "srgb", "color-space" : "srgb",
"components" : { "components" : {
"red" : "249",
"alpha" : "1.000", "alpha" : "1.000",
"blue" : "52", "blue" : "52",
"green" : "198" "green" : "198",
"red" : "249"
} }
} },
"idiom" : "universal"
} }
] ],
} "info" : {
"author" : "xcode",
"version" : 1
}
}