From cb2eefa56ad2d2442aac1117f65c51e89f266145 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 10 Aug 2020 17:34:12 -0500 Subject: [PATCH] Implement new article extractor button for Big Sur --- Mac/AppAssets.swift | 72 +++++++----- Mac/MainWindow/ArticleExtractorButton.swift | 108 ++++++++++++++++++ .../LegacyArticleExtractorButton.swift | 14 +-- Mac/MainWindow/MainWindowController.swift | 90 +++++++++++---- .../ArticleExtractorError.pdf | Bin 3818 -> 4143 bytes .../Contents.json | 13 ++- .../ArticleExtractorOff.pdf | Bin 0 -> 4210 bytes .../Contents.json | 16 +++ .../ArticleExtractorOn.pdf | Bin 0 -> 4100 bytes .../articleExtractorOn.imageset/Contents.json | 16 +++ .../ArticleExtractor.pdf | Bin .../Contents.json | 0 .../ArticleExtractorError.pdf | Bin 0 -> 3818 bytes .../Contents.json | 12 ++ .../ArticleExtractorInactiveDark.pdf | Bin .../Contents.json | 0 .../ArticleExtractorInactiveLight.pdf | Bin .../Contents.json | 0 .../ArticleExtractorProgress1.pdf | Bin .../Contents.json | 0 .../ArticleExtractorProgress2.pdf | Bin .../Contents.json | 0 .../ArticleExtractorProgress3.pdf | Bin .../Contents.json | 0 .../ArticleExtractorProgress4.pdf | Bin .../Contents.json | 0 NetNewsWire.xcodeproj/project.pbxproj | 6 + 27 files changed, 280 insertions(+), 67 deletions(-) create mode 100644 Mac/MainWindow/ArticleExtractorButton.swift create mode 100644 Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/ArticleExtractorOff.pdf create mode 100644 Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/Contents.json create mode 100644 Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/ArticleExtractorOn.pdf create mode 100644 Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/Contents.json rename Mac/Resources/Assets.xcassets/{articleExtractor.imageset => legacyArticleExtractor.imageset}/ArticleExtractor.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractor.imageset => legacyArticleExtractor.imageset}/Contents.json (100%) create mode 100644 Mac/Resources/Assets.xcassets/legacyArticleExtractorError.imageset/ArticleExtractorError.pdf create mode 100644 Mac/Resources/Assets.xcassets/legacyArticleExtractorError.imageset/Contents.json rename Mac/Resources/Assets.xcassets/{articleExtractorInactiveDark.imageset => legacyArticleExtractorInactiveDark.imageset}/ArticleExtractorInactiveDark.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorInactiveDark.imageset => legacyArticleExtractorInactiveDark.imageset}/Contents.json (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorInactiveLight.imageset => legacyArticleExtractorInactiveLight.imageset}/ArticleExtractorInactiveLight.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorInactiveLight.imageset => legacyArticleExtractorInactiveLight.imageset}/Contents.json (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress1.imageset => legacyArticleExtractorProgress1.imageset}/ArticleExtractorProgress1.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress1.imageset => legacyArticleExtractorProgress1.imageset}/Contents.json (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress2.imageset => legacyArticleExtractorProgress2.imageset}/ArticleExtractorProgress2.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress2.imageset => legacyArticleExtractorProgress2.imageset}/Contents.json (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress3.imageset => legacyArticleExtractorProgress3.imageset}/ArticleExtractorProgress3.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress3.imageset => legacyArticleExtractorProgress3.imageset}/Contents.json (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress4.imageset => legacyArticleExtractorProgress4.imageset}/ArticleExtractorProgress4.pdf (100%) rename Mac/Resources/Assets.xcassets/{articleExtractorProgress4.imageset => legacyArticleExtractorProgress4.imageset}/Contents.json (100%) diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index 6f09f1046..7697c4408 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -45,38 +45,18 @@ struct AppAssets { return NSImage(systemSymbolName: "plus", accessibilityDescription: nil)! }() - static var articleExtractor: RSImage! = { - return RSImage(named: "articleExtractor") + static var articleExtractorError: RSImage = { + return RSImage(named: "articleExtractorError")! }() - - static var articleExtractorError: RSImage! = { - return RSImage(named: "articleExtractorError") + + static var articleExtractorOff: RSImage = { + return RSImage(named: "articleExtractorOff")! }() - - static var articleExtractorInactiveDark: RSImage! = { - return RSImage(named: "articleExtractorInactiveDark") + + static var articleExtractorOn: RSImage = { + return RSImage(named: "articleExtractorOn")! }() - - static var articleExtractorInactiveLight: RSImage! = { - return RSImage(named: "articleExtractorInactiveLight") - }() - - static var articleExtractorProgress1: RSImage! = { - return RSImage(named: "articleExtractorProgress1") - }() - - static var articleExtractorProgress2: RSImage! = { - return RSImage(named: "articleExtractorProgress2") - }() - - static var articleExtractorProgress3: RSImage! = { - return RSImage(named: "articleExtractorProgress3") - }() - - static var articleExtractorProgress4: RSImage! = { - return RSImage(named: "articleExtractorProgress4") - }() - + @available(macOS 11.0, *) static var cleanUpImage: RSImage = { return NSImage(systemSymbolName: "wind", accessibilityDescription: nil)! @@ -117,7 +97,39 @@ struct AppAssets { static var iconDarkBackgroundColor: NSColor = { return NSColor(named: NSColor.Name("iconDarkBackgroundColor"))! }() - + + static var legacyArticleExtractor: RSImage! = { + return RSImage(named: "legacyArticleExtractor") + }() + + static var legacyArticleExtractorError: RSImage! = { + return RSImage(named: "legacyArticleExtractorError") + }() + + static var legacyArticleExtractorInactiveDark: RSImage! = { + return RSImage(named: "legacyArticleExtractorInactiveDark") + }() + + static var legacyArticleExtractorInactiveLight: RSImage! = { + return RSImage(named: "legacyArticleExtractorInactiveLight") + }() + + static var legacyArticleExtractorProgress1: RSImage! = { + return RSImage(named: "legacyArticleExtractorProgress1") + }() + + static var legacyArticleExtractorProgress2: RSImage! = { + return RSImage(named: "legacyArticleExtractorProgress2") + }() + + static var legacyArticleExtractorProgress3: RSImage! = { + return RSImage(named: "legacyArticleExtractorProgress3") + }() + + static var legacyArticleExtractorProgress4: RSImage! = { + return RSImage(named: "legacyArticleExtractorProgress4") + }() + static var masterFolderImage: IconImage { if #available(macOS 11.0, *) { let image = NSImage(systemSymbolName: "folder", accessibilityDescription: nil)! diff --git a/Mac/MainWindow/ArticleExtractorButton.swift b/Mac/MainWindow/ArticleExtractorButton.swift new file mode 100644 index 000000000..adb0e8542 --- /dev/null +++ b/Mac/MainWindow/ArticleExtractorButton.swift @@ -0,0 +1,108 @@ +// +// ArticleExtractorButton.swift +// NetNewsWire +// +// Created by Maurice Parker on 8/10/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import AppKit + +enum ArticleExtractorButtonState { + case error + case animated + case on + case off +} + +class ArticleExtractorButton: NSButton { + + private var animatedLayer: CALayer? + + var buttonState: ArticleExtractorButtonState = .off { + didSet { + if buttonState != oldValue { + switch buttonState { + case .error: + stripAnimatedSublayer() + image = AppAssets.articleExtractorError + case .animated: + image = nil + needsLayout = true + case .on: + stripAnimatedSublayer() + image = AppAssets.articleExtractorOn + case .off: + stripAnimatedSublayer() + image = AppAssets.articleExtractorOff + } + } + } + } + + override func accessibilityLabel() -> String? { + switch buttonState { + case .error: + return NSLocalizedString("Error - Reader View", comment: "Error - Reader View") + case .animated: + return NSLocalizedString("Processing - Reader View", comment: "Processing - Reader View") + case .on: + return NSLocalizedString("Selected - Reader View", comment: "Selected - Reader View") + case .off: + return NSLocalizedString("Reader View", comment: "Reader View") + } + } + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + commonInit() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + commonInit() + } + + private func commonInit() { + wantsLayer = true + bezelStyle = .texturedRounded + image = AppAssets.articleExtractorOff + imageScaling = .scaleProportionallyDown + } + + override func layout() { + super.layout() + guard case .animated = buttonState else { + return + } + stripAnimatedSublayer() + addAnimatedSublayer(to: layer!) + } + + private func stripAnimatedSublayer() { + animatedLayer?.removeFromSuperlayer() + } + + private func addAnimatedSublayer(to hostedLayer: CALayer) { + let image1 = AppAssets.articleExtractorOff.tinted(with: NSColor.controlTextColor) + let image2 = AppAssets.articleExtractorOn.tinted(with: NSColor.controlTextColor) + let images = [image1, image2, image1] + + animatedLayer = CALayer() + let imageSize = AppAssets.articleExtractorOff.size + animatedLayer!.bounds = CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height) + animatedLayer!.position = CGPoint(x: bounds.midX, y: bounds.midY) + + hostedLayer.addSublayer(animatedLayer!) + + let animation = CAKeyframeAnimation(keyPath: "contents") + animation.calculationMode = CAAnimationCalculationMode.linear + animation.keyTimes = [0, 0.5, 1] + animation.duration = 2 + animation.values = images + animation.repeatCount = HUGE + + animatedLayer!.add(animation, forKey: "contents") + } + +} diff --git a/Mac/MainWindow/LegacyArticleExtractorButton.swift b/Mac/MainWindow/LegacyArticleExtractorButton.swift index ea1fdc847..30fd0620d 100644 --- a/Mac/MainWindow/LegacyArticleExtractorButton.swift +++ b/Mac/MainWindow/LegacyArticleExtractorButton.swift @@ -60,12 +60,12 @@ class LegacyArticleExtractorButton: NSButton { addAnimatedSublayer(to: hostedLayer) default: if NSApplication.shared.isActive { - addImageSublayer(to: hostedLayer, image: AppAssets.articleExtractor, opacity: opacity) + addImageSublayer(to: hostedLayer, image: AppAssets.legacyArticleExtractor, opacity: opacity) } else { if NSApplication.shared.effectiveAppearance.isDarkMode { - addImageSublayer(to: hostedLayer, image: AppAssets.articleExtractorInactiveDark, opacity: opacity) + addImageSublayer(to: hostedLayer, image: AppAssets.legacyArticleExtractorInactiveDark, opacity: opacity) } else { - addImageSublayer(to: hostedLayer, image: AppAssets.articleExtractorInactiveLight, opacity: opacity) + addImageSublayer(to: hostedLayer, image: AppAssets.legacyArticleExtractorInactiveLight, opacity: opacity) } } } @@ -86,10 +86,10 @@ class LegacyArticleExtractorButton: NSButton { } private func addAnimatedSublayer(to hostedLayer: CALayer) { - let imageProgress1 = AppAssets.articleExtractorProgress1 - let imageProgress2 = AppAssets.articleExtractorProgress2 - let imageProgress3 = AppAssets.articleExtractorProgress3 - let imageProgress4 = AppAssets.articleExtractorProgress4 + let imageProgress1 = AppAssets.legacyArticleExtractorProgress1 + let imageProgress2 = AppAssets.legacyArticleExtractorProgress2 + let imageProgress3 = AppAssets.legacyArticleExtractorProgress3 + let imageProgress4 = AppAssets.legacyArticleExtractorProgress4 let images = [imageProgress1, imageProgress2, imageProgress3, imageProgress4, imageProgress3, imageProgress2] let imageLayer = CALayer() diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 0e002cae2..c3ad72918 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -757,6 +757,17 @@ extension MainWindowController: NSToolbarDelegate { let title = NSLocalizedString("Star", comment: "Star") return buildToolbarButton(.markStar, title, AppAssets.starOpenImage, "toggleStarred:") + case .readerView: + let toolbarItem = RSToolbarItem(itemIdentifier: .readerView) + toolbarItem.autovalidates = true + let description = NSLocalizedString("Reader View", comment: "Reader View") + toolbarItem.toolTip = description + toolbarItem.label = description + let button = ArticleExtractorButton() + button.action = #selector(toggleArticleExtractor(_:)) + toolbarItem.view = button + return toolbarItem + case .openInBrowser: let title = NSLocalizedString("Open in Browser", comment: "Open in Browser") return buildToolbarButton(.openInBrowser, title, AppAssets.openInBrowserImage, "openArticleInBrowser:") @@ -791,6 +802,7 @@ extension MainWindowController: NSToolbarDelegate { .nextUnread, .markRead, .markStar, + .readerView, .openInBrowser, .share, .cleanUp @@ -828,6 +840,7 @@ extension MainWindowController: NSToolbarDelegate { .nextUnread, .markRead, .markStar, + .readerView, .openInBrowser, .share ] @@ -1019,32 +1032,59 @@ private extension MainWindowController { return false } - guard let toolbarItem = item as? NSToolbarItem, let toolbarButton = toolbarItem.view as? LegacyArticleExtractorButton else { - if let menuItem = item as? NSMenuItem { - menuItem.state = isShowingExtractedArticle ? .on : .off - } - return currentLink != nil - } - - toolbarButton.state = isShowingExtractedArticle ? .on : .off + if #available(macOS 11.0, *) { - guard let state = articleExtractor?.state else { - toolbarButton.isError = false - toolbarButton.isInProgress = false - toolbarButton.state = .off - return currentLink != nil - } - - switch state { - case .processing: - toolbarButton.isError = false - toolbarButton.isInProgress = true - case .failedToParse: - toolbarButton.isError = true - toolbarButton.isInProgress = false - case .ready, .cancelled, .complete: - toolbarButton.isError = false - toolbarButton.isInProgress = false + guard let toolbarItem = item as? NSToolbarItem, let toolbarButton = toolbarItem.view as? ArticleExtractorButton else { + if let menuItem = item as? NSMenuItem { + menuItem.state = isShowingExtractedArticle ? .on : .off + } + return currentLink != nil + } + + guard let state = articleExtractor?.state else { + toolbarButton.buttonState = .off + return currentLink != nil + } + + switch state { + case .processing: + toolbarButton.buttonState = .animated + case .failedToParse: + toolbarButton.buttonState = .error + case .ready, .cancelled, .complete: + toolbarButton.buttonState = isShowingExtractedArticle ? .on : .off + } + + } else { + + guard let toolbarItem = item as? NSToolbarItem, let toolbarButton = toolbarItem.view as? LegacyArticleExtractorButton else { + if let menuItem = item as? NSMenuItem { + menuItem.state = isShowingExtractedArticle ? .on : .off + } + return currentLink != nil + } + + toolbarButton.state = isShowingExtractedArticle ? .on : .off + + guard let state = articleExtractor?.state else { + toolbarButton.isError = false + toolbarButton.isInProgress = false + toolbarButton.state = .off + return currentLink != nil + } + + switch state { + case .processing: + toolbarButton.isError = false + toolbarButton.isInProgress = true + case .failedToParse: + toolbarButton.isError = true + toolbarButton.isInProgress = false + case .ready, .cancelled, .complete: + toolbarButton.isError = false + toolbarButton.isInProgress = false + } + } return true diff --git a/Mac/Resources/Assets.xcassets/articleExtractorError.imageset/ArticleExtractorError.pdf b/Mac/Resources/Assets.xcassets/articleExtractorError.imageset/ArticleExtractorError.pdf index e8b78e506434756118ee21d4fc152a4871df24d0..fec2ed4ba9e304f9afd5fa2be03d5c7535cbdb20 100644 GIT binary patch delta 1125 zcmaDQyIx^}7?-hvfkJ*#7MG39L_M*3eV^34^pXq(QzKIaJ3Fr8lA_eaT&@bn)G6M1 zcMN#izT354V_h}rk$2R0mdLLRY+WKVL^z7-7ucspKVBknK)G(&j~~7-_wJeU{m@!7 z!>flD?-9M`HTUYJB%5kg_31mm-Lg1x`rpZ_1Gl1jCrGSa61t-ASYF$VaEq#E3wa7u zRqNjzNDFrsl8AoC`}JDl!|h6eyJRiP_Cy?GW{aQd`&j3v80X$KG7<0RuW_$DTXbV; z)x#BHmsq^E+zPGED%ixk_bMan8eO(UNf&K7E1ye$IMuAQ>Gso-O_HzfblA9D&|4Z^ zcVh9Kh4;N8wpO~F-*kj+Vaw#4o9D!*ZM+b~aki;%Zhb;f=7xngw52+BZu??ol-Ipx zSHSByTaS18)lUj z-BOMq0Xn-K)CvS6Yj1cP*LP$r=~Fi}l;14hQBc-Dg*I+8AUC9~d1h^Dg_j zrYmg5>d8~H8~@&{f8S;-Jj41hj~nmXyot|WBuL~vJU2N)S?67gw3@+f+c`#8T=-q2 z+MI8G=v!MU-s52;HzRGyOW(HhH8nbCI&vD$^fT=B+rS(seOI)5a^+i_mP@~RrYxEG zEqzzW=Y-p9S=K8$f4n+x>b;8>6V-D3KATyF>{u1GX-VDweN*@EFxX@DN7KHp&Y`{k zF_)%%_0PPenQ~coWM+l)sa8En{XoWtqvTLGDfpu+(Z~W@t1~PigacMi(w=kZB;T(F*#W&dyGW z#i=O@Amf4*Vkh2{o1DNSq-CmLXc?=Z@0?$nSE693pzocTQmhaSWPw#7Im3MNTpk5h zu(u}XGm1~X$s;3VrVyjyRGOKSqF`j;XliU?oH?0|SBJyG(7?#h$ii^46|Xdc6U!^j zXgRrxS6afr%+ON700b2B6u7_)17lM|lgS5pRfEkeG389mF~kha&CD^)umt)T&0I4R zlgYk(()E_W$jHwxQ2^=!MT}=&TE2n>lN&kfI{7sHCDOHI2*I!oZSCRn^tsjgbogL7Jnu delta 780 zcmZ3l@Je=qn1qRffkJ*#7MG2Ug1%2`UV2G}f+uxB}m2YoaAut|AY@=ertFv+@5YNc-HylT<_m2Q+B#aU-dmD z;hAEQWq5m2S9R&avmdiB*H>!IfqHk$Qa~I1^uAZ;{4L0-_(D!t9c1kQxO;NA_8x;#vVmx^_ue!FGf}vTgg1&QpXtEs}E#4JPyODF{NmfpDeaWLrLUK~p_rg%}N|(#)I`1w%_0bF;~1d^#M)hUNyQ z#s&tHSMfIuryH@)Wqh3g!!rR4)d4#IW;hMi5SK}w>TrJ13HnT17ia-yYKvSpf~QBtb0iG^uuTAHOD7hxp| ev7oRoE=epZsVGWK<1#ieG2~)XRdw}u;{pKqY2V5K diff --git a/Mac/Resources/Assets.xcassets/articleExtractorError.imageset/Contents.json b/Mac/Resources/Assets.xcassets/articleExtractorError.imageset/Contents.json index 8f74f540d..0f8e6142c 100644 --- a/Mac/Resources/Assets.xcassets/articleExtractorError.imageset/Contents.json +++ b/Mac/Resources/Assets.xcassets/articleExtractorError.imageset/Contents.json @@ -1,12 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "ArticleExtractorError.pdf" + "filename" : "ArticleExtractorError.pdf", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/ArticleExtractorOff.pdf b/Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/ArticleExtractorOff.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d1a8f11c870452e8c9777742b68cb1ecb6619fde GIT binary patch literal 4210 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 literal 0 HcmV?d00001 diff --git a/Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/Contents.json b/Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/Contents.json new file mode 100644 index 000000000..a0b6f11cb --- /dev/null +++ b/Mac/Resources/Assets.xcassets/articleExtractorOff.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "ArticleExtractorOff.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/ArticleExtractorOn.pdf b/Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/ArticleExtractorOn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59cf13d37c1109fe37782db5294d52b1e0f08c8c GIT binary patch literal 4100 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 nJr0Jn$3byOI7|urzg_-R1&K^;(9h~2nQ literal 0 HcmV?d00001 diff --git a/Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/Contents.json b/Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/Contents.json new file mode 100644 index 000000000..ba8f780d4 --- /dev/null +++ b/Mac/Resources/Assets.xcassets/articleExtractorOn.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "ArticleExtractorOn.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Mac/Resources/Assets.xcassets/articleExtractor.imageset/ArticleExtractor.pdf b/Mac/Resources/Assets.xcassets/legacyArticleExtractor.imageset/ArticleExtractor.pdf similarity index 100% rename from Mac/Resources/Assets.xcassets/articleExtractor.imageset/ArticleExtractor.pdf rename to Mac/Resources/Assets.xcassets/legacyArticleExtractor.imageset/ArticleExtractor.pdf diff --git a/Mac/Resources/Assets.xcassets/articleExtractor.imageset/Contents.json b/Mac/Resources/Assets.xcassets/legacyArticleExtractor.imageset/Contents.json similarity index 100% rename from Mac/Resources/Assets.xcassets/articleExtractor.imageset/Contents.json rename to Mac/Resources/Assets.xcassets/legacyArticleExtractor.imageset/Contents.json diff --git a/Mac/Resources/Assets.xcassets/legacyArticleExtractorError.imageset/ArticleExtractorError.pdf b/Mac/Resources/Assets.xcassets/legacyArticleExtractorError.imageset/ArticleExtractorError.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e8b78e506434756118ee21d4fc152a4871df24d0 GIT binary patch literal 3818 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