Repository: wordpress-mobile/WordPress-iOS
Pull request #24446: Reader: Second batch of changes
Author: login: kean
Labels: name: General
Created: 2025-04-11T17:39:47Z | Merged: 2025-04-14T14:24:34Z

Same deal; minimum changes to the production code.

- Replace "Following" with "Library" which is a subset of the existing "Sidebar" screen from Jetpack. You now have access to "Likes", "Saved", and your "Favorites"
- Slightly tweak the "Me" design
- Enable GBK (new editor) by default in Reader
- Update some `AppConfiguration.isJetpack` usages
- Disable self-hosted sites support

(screenshots in the respective channel)

To test:

- Smoke test the library screen
- Create a new account and verify you can create a new site from the "Me" tab

## Regression Notes
1. Potential unintended areas of impact


2. What I did to test those areas of impact (or what existing automated tests I relied on)


3. What automated tests I added (or what prevented me from doing so)

PR submission checklist:

- [ ] I have completed the Regression Notes.
- [ ] I have considered adding unit tests for my changes.
- [ ] I have considered adding accessibility improvements for my changes.
- [ ] I have considered if this change warrants user-facing release notes and have added them to `RELEASE-NOTES.txt` if necessary.

Testing checklist:
- [ ] WordPress.com sites and self-hosted Jetpack sites.
- [ ] Portrait and landscape orientations.
- [ ] Light and dark modes.
- [ ] Fonts: Larger, smaller and bold text.
- [ ] High contrast.
- [ ] VoiceOver.
- [ ] Languages with large words or with letters/accents not frequently used in English.
- [ ] Right-to-left languages. (Even if translation isn’t complete, formatting should still respect the right-to-left layout)
- [ ] iPhone and iPad. 
- [ ] Multi-tasking: Split view and Slide over. (iPad)



Diff:
diff --git a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingSubscriptionsView.swift b/WordPress/Classes/Apps/Reader/Following/ReaderFollowingSubscriptionsView.swift
deleted file mode 100644
index 01a6df6dc715..000000000000
--- a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingSubscriptionsView.swift
+++ /dev/null
@@ -1,54 +0,0 @@
-import SwiftUI
-import WordPressUI
-
-/// A "Subscriptions" tab content view for on Reader's "Following" screen.
-struct ReaderFollowingSubscriptionsView: View {
-    let viewModel: ReaderFollowingViewModel
-
-    @FetchRequest(
-        sortDescriptors: [SortDescriptor(\.title, order: .forward)],
-        predicate: NSPredicate(format: "following = YES")
-    )
-    private var subscriptions: FetchedResults<ReaderSiteTopic>
-
-    var body: some View {
-        ForEach(subscriptions, id: \.objectID, content: makeSubscriptionCell)
-            .onDelete(perform: delete)
-    }
-
-    private func makeSubscriptionCell(for site: ReaderSiteTopic) -> some View {
-        Button {
-            viewModel.navigate(to: .topic(site))
-        } label: {
-            ReaderSubscriptionCell(site: site, onDelete: delete)
-        }
-        .swipeActions(edge: .leading) {
-            if let siteURL = URL(string: site.siteURL) {
-                ShareLink(item: siteURL).tint(.blue)
-            }
-        }
-        .swipeActions(edge: .trailing) {
-            Button(SharedStrings.Reader.unfollow, role: .destructive) {
-                ReaderSubscriptionHelper().unfollow(site)
-            }.tint(.red)
-        }
-    }
-
-    private func getSubscription(at index: Int) -> ReaderSiteTopic {
-//        if isShowingSearchResuts {
-//            searchResults[index]
-//        } else {
-            subscriptions[index]
-//        }
-    }
-
-    private func delete(at offsets: IndexSet) {
-        for site in offsets.map(getSubscription) {
-            delete(site)
-        }
-    }
-
-    private func delete(_ site: ReaderSiteTopic) {
-        ReaderSubscriptionHelper().unfollow(site)
-    }
-}
diff --git a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingTagsView.swift b/WordPress/Classes/Apps/Reader/Following/ReaderFollowingTagsView.swift
deleted file mode 100644
index a71e526d0def..000000000000
--- a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingTagsView.swift
+++ /dev/null
@@ -1,68 +0,0 @@
-import UIKit
-import SwiftUI
-import Combine
-import WordPressUI
-
-struct ReaderFollowingTagsView: View {
-    let viewModel: ReaderFollowingViewModel
-
-    @FetchRequest(
-        sortDescriptors: [SortDescriptor(\.title, order: .forward)],
-        predicate: ReaderSidebarTagsSection.predicate
-    )
-    private var tags: FetchedResults<ReaderTagTopic>
-
-    static let predicate = NSPredicate(format: "following == YES AND showInMenu == YES AND type == 'tag'")
-
-    var body: some View {
-        ForEach(tags, id: \.self) { tag in
-            Button {
-                viewModel.navigate(to: .topic(tag))
-            } label: {
-                Label {
-                    Text(tag.title)
-                        .lineLimit(1)
-                } icon: {
-                    ReaderSidebarImage(name: "reader-menu-tag")
-                        .foregroundStyle(.secondary)
-                }
-            }
-            .swipeActions(edge: .trailing) {
-                Button(SharedStrings.Reader.unfollow, role: .destructive) {
-                    ReaderTagsHelper().unfollow(tag)
-                }.tint(.red)
-            }
-            .contextMenu(menuItems: {
-                Button(SharedStrings.Reader.unfollow, systemImage: "trash", role: .destructive) {
-                    ReaderTagsHelper().unfollow(tag)
-                }
-            }, preview: {
-                ReaderTopicPreviewView(topic: tag)
-            })
-        }
-        .onDelete(perform: delete)
-
-        Button {
-            viewModel.navigate(to: .discoverTags)
-        } label: {
-            Label {
-                Text(Strings.discoverTags)
-            } icon: {
-                ReaderSidebarImage(name: "reader-menu-explorer")
-            }
-        }
-        .listItemTint(AppColor.primary)
-    }
-
-    func delete(at offsets: IndexSet) {
-        let tags = offsets.map { self.tags[$0] }
-        for tag in tags {
-            ReaderTagsHelper().unfollow(tag)
-        }
-    }
-}
-
-private struct Strings {
-    static let addTag = NSLocalizedString("reader.following.tags.addTag", value: "Add tag", comment: "Button title")
-    static let discoverTags = NSLocalizedString("reader.following.tags.discoverTags", value: "Discover More Tags", comment: "Button title")
-}
diff --git a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingViewController.swift b/WordPress/Classes/Apps/Reader/Following/ReaderFollowingViewController.swift
deleted file mode 100644
index cf1254239543..000000000000
--- a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingViewController.swift
+++ /dev/null
@@ -1,139 +0,0 @@
-import UIKit
-import SwiftUI
-import WordPressUI
-
-final class ReaderFollowingViewController: UIHostingController<AnyView>, UIPopoverPresentationControllerDelegate {
-    private let mainContext = ContextManager.shared.mainContext
-    private let viewModel = ReaderFollowingViewModel()
-
-    init() {
-        let view = AnyView(ReaderFollowingView(viewModel: viewModel)
-            .environment(\.managedObjectContext, mainContext))
-        super.init(rootView: view)
-
-        viewModel._navigate = { [weak self] in
-            self?.navigate(to: $0)
-        }
-    }
-
-    required dynamic init?(coder aDecoder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    override func viewDidLoad() {
-        super.viewDidLoad()
-
-        title = SharedStrings.Reader.following
-        navigationItem.largeTitleDisplayMode = .always
-        navigationController?.navigationBar.prefersLargeTitles = true
-        navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "reader-menu-plus"), style: .plain, target: self, action: #selector(buttonAddTapped))
-    }
-
-    private func navigate(to route: ReaderFollowingNavigation) {
-        switch route {
-        case .topic(let topic):
-            let streamVC = ReaderStreamViewController.controllerWithTopic(topic)
-            navigationController?.pushViewController(streamVC, animated: true)
-        case .discoverTags:
-            ReaderSelectInterestsViewController.show(from: self)
-        }
-    }
-
-    @objc private func buttonAddTapped(_ item: UIBarButtonItem) {
-        switch viewModel.selectedTab {
-        case .subscriptions:
-            let hostVC = UIHostingController(rootView: ReaderSubscriptionAddView())
-            hostVC.modalPresentationStyle = .popover
-            hostVC.popoverPresentationController?.delegate = self
-            hostVC.popoverPresentationController?.sourceItem = item
-            // TODO: (reader) remove hardcoded size
-            hostVC.preferredContentSize = CGSize(width: 320, height: 140)
-            present(hostVC, animated: true)
-        case .lists:
-            let alert = UIAlertController(title: "This feature is not supported in the prototype", message: nil, preferredStyle: .alert)
-            alert.addCancelActionWithTitle(SharedStrings.Button.ok)
-            present(alert, animated: true)
-        case .tags:
-            let addTagVC = UIHostingController(rootView: ReaderTagsAddTagView())
-            addTagVC.modalPresentationStyle = .popover
-            addTagVC.popoverPresentationController?.delegate = self
-            addTagVC.popoverPresentationController?.sourceItem = item
-            // TODO: (reader) remove hardcoded size
-            addTagVC.preferredContentSize = CGSize(width: 320, height: 140)
-            present(addTagVC, animated: true, completion: nil)
-        }
-    }
-
-    // MARK: UIPopoverPresentationControllerDelegate
-
-    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
-        return .none
-    }
-}
-
-private struct ReaderFollowingView: View {
-    @ObservedObject var viewModel: ReaderFollowingViewModel
-
-    var body: some View {
-        List {
-            filters
-
-            switch viewModel.selectedTab {
-            case .subscriptions:
-                ReaderFollowingSubscriptionsView(viewModel: viewModel)
-            case .lists:
-                ReaderFollowingListsView(viewModel: viewModel)
-            case .tags:
-                ReaderFollowingTagsView(viewModel: viewModel)
-            }
-        }
-        .listStyle(.plain)
-        .task { await viewModel.refresh() }
-        .refreshable { await viewModel.refresh() }
-        // TODO: (reader) add searching
-//        .searchable(text: $viewModel.searchText)
-    }
-
-    private var filters: some View {
-        VStack(spacing: 0) {
-            HStack(spacing: 0) {
-                ForEach(ReaderFollowingTab.allCases, id: \.self) { tab in
-                    Button {
-                        viewModel.selectedTab = tab
-                    } label: {
-                        MenuItem(tab.title, isSelected: tab == viewModel.selectedTab)
-                    }
-                    .buttonStyle(.plain)
-                }
-                Spacer()
-            }
-            .font(.subheadline)
-            Divider()
-        }
-        .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
-        .listRowSeparator(.hidden, edges: .all)
-    }
-}
-
-// TODO: (reader) create a proper reusable component; this one is just for a prototype
-private struct MenuItem: View {
-    let title: String
-    let isSelected: Bool
-
-    init(_ title: String, isSelected: Bool = false) {
-        self.title = title
-        self.isSelected = isSelected
-    }
-
-    var body: some View {
-        VStack {
-            Text(title)
-                .fontWeight(isSelected ? .bold : .regular)
-                .foregroundStyle(isSelected ? Color.primary : Color.secondary)
-            Rectangle()
-                .frame(height: 2)
-                .foregroundStyle(isSelected ? Color.black : Color(uiColor: .separator))
-                .opacity(isSelected ? 1 : 0)
-        }
-    }
-}
diff --git a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingViewModel.swift b/WordPress/Classes/Apps/Reader/Following/ReaderFollowingViewModel.swift
deleted file mode 100644
index 63b30d004a4e..000000000000
--- a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingViewModel.swift
+++ /dev/null
@@ -1,75 +0,0 @@
-import Foundation
-import SwiftUI
-import WordPressData
-import WordPressShared
-
-@MainActor
-final class ReaderFollowingViewModel: ObservableObject {
-    // TODO: extract to a service (store fetches both subscription and menus)
-    private let store = ReaderMenuStore()
-
-    @Published var selectedTab: ReaderFollowingTab = .subscriptions
-
-    @Published private(set) var error: Error?
-    @Published private(set) var isRefreshing = false
-
-    @Published var searchText = ""
-
-    private var refreshTask: Task<Void, Never>? {
-        didSet { isRefreshing = refreshTask != nil }
-    }
-
-    var _navigate: ((ReaderFollowingNavigation) -> Void)?
-
-    deinit {
-        refreshTask?.cancel()
-    }
-
-    func refresh() async {
-        if let task = refreshTask {
-            await task.value
-        }
-        let task = Task {
-            await _refresh()
-        }
-        refreshTask = task
-        return await task.value
-    }
-
-    private func _refresh() async {
-        error = nil
-        isRefreshing = true
-
-        return await withUnsafeContinuation { continuation in
-            store.onCompletion = { [weak self] in
-                // TODO: (reader) add error handling
-                self?.refreshTask = nil
-                self?.store.onCompletion = nil
-                continuation.resume()
-            }
-            store.refreshMenu()
-        }
-    }
-
-    func navigate(to route: ReaderFollowingNavigation) {
-        wpAssert(_navigate != nil)
-        _navigate?(route)
-    }
-}
-
-enum ReaderFollowingNavigation {
-    case topic(ReaderAbstractTopic)
-    case discoverTags
-}
-
-enum ReaderFollowingTab: CaseIterable {
-    case subscriptions, lists, tags
-
-    var title: String {
-        switch self {
-        case .subscriptions: NSLocalizedString("reader.following.subscriptions", value: "Subscriptions", comment: "Tabs on Reader Following screen")
-        case .lists: NSLocalizedString("reader.following.lists", value: "Lists", comment: "Tabs on Reader Following screen")
-        case .tags: NSLocalizedString("reader.following.tags", value: "Tags", comment: "Tabs on Reader Following screen")
-        }
-    }
-}
diff --git a/WordPress/Classes/Apps/Reader/Me/ReaderProfileViewController.swift b/WordPress/Classes/Apps/Reader/Me/ReaderProfileViewController.swift
index c0eee0339db8..69ca327ad258 100644
--- a/WordPress/Classes/Apps/Reader/Me/ReaderProfileViewController.swift
+++ b/WordPress/Classes/Apps/Reader/Me/ReaderProfileViewController.swift
@@ -7,7 +7,7 @@ final class ReaderProfileViewController: UIViewController {
         super.viewDidLoad()
 
         let mySiteVC = MySiteViewController()
-        mySiteVC.isReaderModeEnabled = true
+        mySiteVC.isReaderAppModeEnabled = true
         mySiteVC.willMove(toParent: self)
         addChild(mySiteVC)
         view.addSubview(mySiteVC.view)
@@ -15,8 +15,6 @@ final class ReaderProfileViewController: UIViewController {
         mySiteVC.willMove(toParent: self)
 
         navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "gearshape"), style: .plain, target: self, action: #selector(buttonSettingsTapped))
-
-        mySiteVC.view.backgroundColor = .systemBackground
     }
 
     @objc private func buttonSettingsTapped() {
diff --git a/WordPress/Classes/Apps/Reader/ReaderTabViewController.swift b/WordPress/Classes/Apps/Reader/ReaderTabViewController.swift
index c36f2c841a01..4da5d0cc586e 100644
--- a/WordPress/Classes/Apps/Reader/ReaderTabViewController.swift
+++ b/WordPress/Classes/Apps/Reader/ReaderTabViewController.swift
@@ -5,6 +5,9 @@ import WordPressUI
 
 final class ReaderTabViewController: UITabBarController, UITabBarControllerDelegate {
     private var menuStore = ReaderMenuStore()
+    private let library = ReaderPresenter(
+        viewModel: ReaderSidebarViewModel(isReaderAppModeEnabled: true)
+    )
     private let notificationsButtonViewModel = NotificationsButtonViewModel()
     private var cancellables: [AnyCancellable] = []
 
@@ -38,7 +41,7 @@ final class ReaderTabViewController: UITabBarController, UITabBarControllerDeleg
     private func setupViewControllers() {
         self.viewControllers = [
             makeHomeViewController(),
-            makeFollowingViewController(),
+            makeLibraryViewController(),
             makeDiscoverViewController(),
             makeNotificationsViewController(),
             makeMeViewController()
@@ -56,17 +59,23 @@ final class ReaderTabViewController: UITabBarController, UITabBarControllerDeleg
             image: UIImage(named: "reader-menu-home"),
             selectedImage: nil
         )
+        // TODO: (reader) remove it; had to use due to how ghosts are implemented (separate table)
+        homeVC.tabBarItem.scrollEdgeAppearance = {
+            let appearance = UITabBarAppearance()
+            appearance.configureWithOpaqueBackground()
+            return appearance
+        }()
         return UINavigationController(rootViewController: homeVC)
     }
 
-    private func makeFollowingViewController() -> UIViewController {
-        let followingVC = ReaderFollowingViewController()
-        followingVC.tabBarItem = UITabBarItem(
-            title: SharedStrings.Reader.following,
+    private func makeLibraryViewController() -> UIViewController {
+        let libraryVC = library.sidebar
+        libraryVC.tabBarItem = UITabBarItem(
+            title: SharedStrings.Reader.library,
             image: UIImage(named: "reader-menu-subscriptions"),
             selectedImage: nil
         )
-        return UINavigationController(rootViewController: followingVC)
+        return library.prepareForLibraryPresentation()
     }
 
     private func makeDiscoverViewController() -> UIViewController {
@@ -83,6 +92,11 @@ final class ReaderTabViewController: UITabBarController, UITabBarControllerDeleg
             image: UIImage(named: "reader-menu-explorer"),
             selectedImage: nil
         )
+        discoverVC.tabBarItem.scrollEdgeAppearance = {
+            let appearance = UITabBarAppearance()
+            appearance.configureWithOpaqueBackground()
+            return appearance
+        }()
         let navigationVC = UINavigationController(rootViewController: discoverVC)
         navigationVC.navigationBar.prefersLargeTitles = true
         return navigationVC
@@ -96,7 +110,7 @@ final class ReaderTabViewController: UITabBarController, UITabBarControllerDeleg
             image: UIImage(named: "tab-bar-notifications"),
             selectedImage: UIImage(named: "tab-bar-notifications")
         )
-        notificationsVC.isReaderModeEnabled = true
+        notificationsVC.isReaderAppModeEnabled = true
         let navigationVC = UINavigationController(rootViewController: notificationsVC)
         notificationsVC.enableLargeTitles()
 
diff --git a/WordPress/Classes/Apps/Reader/ReaderWelcomeView.swift b/WordPress/Classes/Apps/Reader/ReaderWelcomeView.swift
index d5081f21bd26..ba54cbcddb07 100644
--- a/WordPress/Classes/Apps/Reader/ReaderWelcomeView.swift
+++ b/WordPress/Classes/Apps/Reader/ReaderWelcomeView.swift
@@ -28,7 +28,7 @@ struct ReaderWelcomeView: View {
         .background {
             ZStack {
                 Rectangle()
-                    .fill(Color(CSColor.WordPressBlue.base))
+                    .fill(Color(CSColor.WordPressBlue.base.withAlphaComponent(0.75)))
                 Rectangle()
                     .fill(
                         LinearGradient(
diff --git a/WordPress/Classes/System/Root View/ReaderPresenter.swift b/WordPress/Classes/System/Root View/ReaderPresenter.swift
index 69a8d70a6d3c..74f447b173be 100644
--- a/WordPress/Classes/System/Root View/ReaderPresenter.swift	
+++ b/WordPress/Classes/System/Root View/ReaderPresenter.swift	
@@ -7,7 +7,7 @@ import WordPressUI
 
 /// Manages top-level Reader navigation.
 public final class ReaderPresenter: NSObject, SplitViewDisplayable {
-    private let sidebarViewModel = ReaderSidebarViewModel()
+    private let sidebarViewModel: ReaderSidebarViewModel
 
     // The view controllers used during split view presentation.
     let sidebar: ReaderSidebarViewController
@@ -23,7 +23,12 @@ public final class ReaderPresenter: NSObject, SplitViewDisplayable {
 
     private var selectionObserver: AnyCancellable?
 
-    public override init() {
+    public convenience override init() {
+        self.init(viewModel: ReaderSidebarViewModel())
+    }
+
+    init(viewModel: ReaderSidebarViewModel) {
+        sidebarViewModel = viewModel
         secondary = UINavigationController()
         sidebar = ReaderSidebarViewController(viewModel: sidebarViewModel)
         sidebar.navigationItem.largeTitleDisplayMode = .automatic
@@ -52,6 +57,24 @@ public final class ReaderPresenter: NSObject, SplitViewDisplayable {
         return mainNavigationController
     }
 
+    // TODO: (reader) rework
+    /// Returns the sidebar screen updated to act a a "Library" tab in the
+    /// standalone Reader app.
+    func prepareForLibraryPresentation() -> UIViewController {
+        sidebarViewModel.isCompact = true
+        sidebar.onViewDidLoad = { [weak self] in
+            self?.showInitialSelection()
+        }
+        mainNavigationController = UINavigationController(rootViewController: sidebar) // Loads sidebar lazily
+        mainNavigationController.navigationBar.prefersLargeTitles = true
+
+        sidebar.title = SharedStrings.Reader.library
+        sidebar.navigationItem.largeTitleDisplayMode = .always
+        mainNavigationController.navigationBar.prefersLargeTitles = true
+
+        return mainNavigationController
+    }
+
     // MARK: - Navigation
 
     func showInitialSelection() {
@@ -124,6 +147,12 @@ public final class ReaderPresenter: NSObject, SplitViewDisplayable {
             return ReaderStreamViewController.controllerForContentType(.saved)
         case .search:
             return ReaderSearchViewController()
+        case .subscrtipions:
+            return makeAllSubscriptionsViewController()
+        case .tags:
+            return makeTagsViewController()
+        case .lists:
+            return makeListsViewController()
         }
     }
 
@@ -133,7 +162,29 @@ public final class ReaderPresenter: NSObject, SplitViewDisplayable {
             self?.push(streamVC)
         }.environment(\.managedObjectContext, viewContext)
         let hostVC = UIHostingController(rootView: view)
-        hostVC.title = ReaderSubscriptionsView.navigationTitle
+        hostVC.title = SharedStrings.Reader.subscriptions
+        if sidebarViewModel.isCompact {
+            hostVC.navigationItem.largeTitleDisplayMode = .never
+        }
+        return hostVC
+    }
+
+    private func makeTagsViewController() -> UIViewController {
+        let tagsVC = ReaderTagsTableViewController(style: .plain)
+        tagsVC.title = SharedStrings.Reader.tags
+        if sidebarViewModel.isCompact {
+            tagsVC.navigationItem.largeTitleDisplayMode = .never
+        }
+        return tagsVC
+    }
+
+    private func makeListsViewController() -> UIViewController {
+        let view = ReaderListsView() { [weak self] selection in
+            let streamVC = ReaderStreamViewController.controllerWithTopic(selection)
+            self?.push(streamVC)
+        }.environment(\.managedObjectContext, viewContext)
+        let hostVC = UIHostingController(rootView: view)
+        hostVC.title = SharedStrings.Reader.lists
         if sidebarViewModel.isCompact {
             hostVC.navigationItem.largeTitleDisplayMode = .never
         }
diff --git a/WordPress/Classes/System/Root View/SplitViewRootPresenter.swift b/WordPress/Classes/System/Root View/SplitViewRootPresenter.swift
index e3b486c449a9..a13da8a1f358 100644
--- a/WordPress/Classes/System/Root View/SplitViewRootPresenter.swift	
+++ b/WordPress/Classes/System/Root View/SplitViewRootPresenter.swift	
@@ -330,6 +330,8 @@ extension SplitViewRootPresenter: UISplitViewControllerDelegate {
                     case .saved: tabBarVC.showReader()
                     case .likes: tabBarVC.showReader(path: .likes)
                     case .search: tabBarVC.showReader(path: .search)
+                    case .subscrtipions, .lists, .tags:
+                        wpAssertionFailure("not supported by Jetpack")
                     }
                 case .allSubscriptions:
                     tabBarVC.showReader(path: .subscriptions)
diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift
index 54435ac9243d..53f9fc60072a 100644
--- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift
+++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift
@@ -36,21 +36,23 @@ public enum FeatureFlag: Int, CaseIterable {
             return overriddenValue
         }
 
+        let app = BuildSettings.current.brand
+
         switch self {
         case .signUp:
             return true
         case .customAppIcons:
             return true
         case .domainRegistration:
-            return AppConfiguration.isJetpack
+            return app == .jetpack || app == .reader
         case .selfHostedSites:
-            return true
+            return app != .reader
         case .whatsNew:
             return true
         case .qrCodeLogin:
-            return AppConfiguration.isJetpack
+            return app == .jetpack
         case .bloggingPrompts:
-            return AppConfiguration.isJetpack
+            return app == .jetpack || app == .reader
         case .jetpackDisconnect:
             return BuildConfiguration.current == .debug
         case .siteIconCreator:
@@ -64,11 +66,11 @@ public enum FeatureFlag: Int, CaseIterable {
         case .googleDomainsCard:
             return false
         case .voiceToContent:
-            return AppConfiguration.isJetpack && BuildConfiguration.current.isInternal
+            return app == .jetpack && BuildConfiguration.current.isInternal
         case .authenticateUsingApplicationPassword:
             return false
         case .newGutenberg:
-            return false
+            return app == .reader
         case .newGutenbergThemeStyles:
             return false
         case .newGutenbergPlugins:
diff --git a/WordPress/Classes/Utility/SharedStrings.swift b/WordPress/Classes/Utility/SharedStrings.swift
index f7f95d68707f..f44d8549c193 100644
--- a/WordPress/Classes/Utility/SharedStrings.swift
+++ b/WordPress/Classes/Utility/SharedStrings.swift
@@ -27,8 +27,6 @@ enum SharedStrings {
     }
 
     enum Reader {
-        static let home = NSLocalizedString("reader.tab.home", value: "Home", comment: "Reader app primary navigation tab bar")
-        static let following = NSLocalizedString("reader.tab.following", value: "Following", comment: "Reader app primary navigation tab bar")
         /// - warning: This is the legacy value. It's not compliant with the new format but has the correct translation for different languages.
         static let title = NSLocalizedString("Reader", comment: "The accessibility value of the Reader tab.")
         static let unfollow = NSLocalizedString("reader.button.unfollow", value: "Unfollow", comment: "Reader sidebar button title")
@@ -41,5 +39,11 @@ enum SharedStrings {
         static let discover = NSLocalizedString("reader.discover.title", value: "Discover", comment: "Used in multiple contexts, usually as a screen title")
         static let saved = NSLocalizedString("reader.saved.title", value: "Saved", comment: "Used in multiple contexts, usually as a screen title")
         static let likes = NSLocalizedString("reader.likes.title", value: "Likes", comment: "Used in multiple contexts, usually as a screen title")
+        static let home = NSLocalizedString("reader.home.title", value: "Home", comment: "Used in multiple contexts, usually as a screen title")
+        static let library = NSLocalizedString("reader.library.title", value: "Library", comment: "Used in multiple contexts, usually as a screen title")
+        static let subscriptions = NSLocalizedString("reader.subscriptions.title", value: "Subscriptions", comment: "Used in multiple contexts, usually as a screen title")
+        static let tags = NSLocalizedString("reader.tags.title", value: "Tags", comment: "Used in multiple contexts, usually as a screen title")
+        static let lists = NSLocalizedString("reader.lists.title", value: "Lists", comment: "Used in multiple contexts, usually as a screen title")
+        static let search = NSLocalizedString("reader.search.title", value: "Search", comment: "Used in multiple contexts, usually as a screen title")
     }
 }
diff --git a/WordPress/Classes/ViewRelated/Blaze/Helpers/BlazeHelper.swift b/WordPress/Classes/ViewRelated/Blaze/Helpers/BlazeHelper.swift
index 19dfbe8b6be2..26f999d47f75 100644
--- a/WordPress/Classes/ViewRelated/Blaze/Helpers/BlazeHelper.swift
+++ b/WordPress/Classes/ViewRelated/Blaze/Helpers/BlazeHelper.swift
@@ -1,8 +1,9 @@
 import Foundation
+import BuildSettingsKit
 
 enum BlazeHelper {
     static func isBlazeFlagEnabled() -> Bool {
-        guard AppConfiguration.isJetpack else {
+        guard [.jetpack, .reader].contains(BuildSettings.current.brand) else {
             return false
         }
         return RemoteFeatureFlag.blaze.enabled()
diff --git a/WordPress/Classes/ViewRelated/Blog/My Site/MySiteViewController.swift b/WordPress/Classes/ViewRelated/Blog/My Site/MySiteViewController.swift
index e76f2876df64..860e619f3a03 100644
--- a/WordPress/Classes/ViewRelated/Blog/My Site/MySiteViewController.swift	
+++ b/WordPress/Classes/ViewRelated/Blog/My Site/MySiteViewController.swift	
@@ -72,7 +72,7 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
     private let overlaysCoordinator: MySiteOverlaysCoordinator
 
     // TODO: (reader) factor if out of `MySiteVC` for a production version
-    var isReaderModeEnabled = false
+    var isReaderAppModeEnabled = false
 
     // MARK: - Initializers
 
@@ -207,7 +207,7 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
 
         trackNoSitesVisibleIfNeeded()
 
-        if !isReaderModeEnabled {
+        if !isReaderAppModeEnabled {
             createFABIfNeeded()
         }
         fetchPrompt(for: blog)
@@ -303,7 +303,7 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
     }
 
     private func configureNavBarAppearance(animated: Bool) {
-        guard !isReaderModeEnabled else {
+        guard !isReaderAppModeEnabled else {
             return
         }
         if scrollView.contentOffset.y >= 60 {
@@ -363,7 +363,7 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
         showSitePicker(for: blog)
         updateNavigationTitle(for: blog)
 
-        let section = (isSidebarModeEnabled || isReaderModeEnabled) ? .dashboard : viewModel.getSection(
+        let section = (isSidebarModeEnabled || isReaderAppModeEnabled) ? .dashboard : viewModel.getSection(
             for: blog,
             jetpackFeaturesEnabled: JetpackFeaturesRemovalCoordinator.jetpackFeaturesEnabled(),
             splitViewControllerIsHorizontallyCompact: splitViewControllerIsHorizontallyCompact
@@ -740,7 +740,7 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
         self.blogDashboardViewController = blogDashboardViewController
         stackView.sendSubviewToBack(blogDashboardViewController.view)
 
-        if isReaderModeEnabled, let account = blog.account {
+        if isReaderAppModeEnabled, let account = blog.account {
             let headerView = MeHeaderView()
             headerView.update(with: .init(account: account))
             headerView.configureReaderMode()
@@ -751,9 +751,6 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
 
             let separator = SeparatorView.horizontal()
             stackView.insertArrangedSubview(separator, at: 2)
-
-            headerViewController?.view.backgroundColor = .secondarySystemBackground
-            blogDashboardViewController.collectionView.backgroundColor = .secondarySystemBackground
         }
     }
 
diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift b/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift
index 2db5e1ad89d1..e68140e1bffe 100644
--- a/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift	
+++ b/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift	
@@ -60,7 +60,7 @@ class AppAboutScreenConfiguration: AboutScreenConfiguration {
                     context.showSubmenu(title: TextContent.legalAndMore, configuration: LegalAndMoreSubmenuConfiguration())
                 }),
             ],
-            AppConfiguration.isJetpack ?
+            [.jetpack, .reader].contains(BuildSettings.current.brand) ?
             [
                 AboutItem(title: TextContent.automatticFamily, accessoryType: .disclosureIndicator, hidesSeparator: true, action: { [weak self] context in
                     self?.tracker.buttonPressed(.automatticFamily)
@@ -104,7 +104,7 @@ class AppAboutScreenConfiguration: AboutScreenConfiguration {
         static let twitter = NSLocalizedString("Twitter", comment: "Title of button that displays the app's Twitter profile")
         static let legalAndMore = NSLocalizedString("Legal and More", comment: "Title of button which shows a list of legal documentation such as privacy policy and acknowledgements")
         static let automatticFamily = NSLocalizedString("Automattic Family", comment: "Title of button that displays information about the other apps available from Automattic")
-        static var workWithUsSubtitle = AppConfiguration.isJetpack ? NSLocalizedString("Join From Anywhere", comment: "Subtitle for button displaying the Automattic Work With Us web page, indicating that Automattic employees can work from anywhere in the world") : nil
+        static var workWithUsSubtitle = AppConfiguration.isWordPress ? nil : NSLocalizedString("Join From Anywhere", comment: "Subtitle for button displaying the Automattic Work With Us web page, indicating that Automattic employees can work from anywhere in the world")
     }
 
     private enum Links {
diff --git a/WordPress/Classes/ViewRelated/Me/Views/MeHeaderView.swift b/WordPress/Classes/ViewRelated/Me/Views/MeHeaderView.swift
index 2b4ddd2f8bad..d4339f101e86 100644
--- a/WordPress/Classes/ViewRelated/Me/Views/MeHeaderView.swift
+++ b/WordPress/Classes/ViewRelated/Me/Views/MeHeaderView.swift
@@ -106,19 +106,8 @@ final class MeHeaderView: UIView {
 
     func configureReaderMode() {
         infoStackView.alignment = .leading
-        setIconSize(40)
-
-        // TODO: (reader) refactor and remove hardcoded line height
-        assert(titleLabel.text != nil)
-        titleLabel.attributedText = NSAttributedString(string: titleLabel.text ?? "", attributes: [
-            .font: AppStyleGuide.current.navigationBarLargeFont,
-            .paragraphStyle: {
-                let style = NSMutableParagraphStyle()
-                style.lineHeightMultiple = 0.8
-                return style
-            }(),
-            .baselineOffset: 0
-        ])
+        setIconSize(60)
+        titleLabel.font = AppStyleGuide.current.navigationBarLargeFont
         infoStackView.spacing = 0
         detailsLabel.isHidden = true
     }
diff --git a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationsViewController/NotificationsViewController.swift b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationsViewController/NotificationsViewController.swift
index e62efd328f38..9a7ddaa8c24c 100644
--- a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationsViewController/NotificationsViewController.swift
+++ b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationsViewController/NotificationsViewController.swift
@@ -114,7 +114,7 @@ class NotificationsViewController: UIViewController, UITableViewDataSource, UITa
     }()
 
     var isSidebarModeEnabled = false
-    var isReaderModeEnabled = false
+    var isReaderAppModeEnabled = false
 
     // MARK: - View Lifecycle
 
@@ -451,7 +451,7 @@ class NotificationsViewController: UIViewController, UITableViewDataSource, UITa
 private extension NotificationsViewController {
 
     func setupNavigationBar() {
-        if !isReaderModeEnabled {
+        if !isReaderAppModeEnabled {
             navigationController?.navigationBar.prefersLargeTitles = false
             navigationItem.largeTitleDisplayMode = .never
         }
diff --git a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingListsView.swift b/WordPress/Classes/ViewRelated/Reader/Manage/ReaderListsView.swift
similarity index 70%
rename from WordPress/Classes/Apps/Reader/Following/ReaderFollowingListsView.swift
rename to WordPress/Classes/ViewRelated/Reader/Manage/ReaderListsView.swift
index 8ba1e142d22a..5c85f33c6972 100644
--- a/WordPress/Classes/Apps/Reader/Following/ReaderFollowingListsView.swift
+++ b/WordPress/Classes/ViewRelated/Reader/Manage/ReaderListsView.swift
@@ -3,28 +3,30 @@ import SwiftUI
 import Combine
 import WordPressUI
 
-struct ReaderFollowingListsView: View {
-    let viewModel: ReaderFollowingViewModel
-
+struct ReaderListsView: View {
     @FetchRequest(
         sortDescriptors: [SortDescriptor(\.title, order: .forward)]
     )
     private var lists: FetchedResults<ReaderListTopic>
 
+    var onSelection: (ReaderListTopic) -> Void
+
     var body: some View {
-        if lists.isEmpty {
-            EmptyStateView(Strings.emptyTitle, systemImage: "list.clipboard", description: Strings.emptyDetails)
-                .frame(height: 420)
-                .listRowSeparator(.hidden)
-        } else {
-            items
+        List {
+            if lists.isEmpty {
+                EmptyStateView(Strings.emptyTitle, systemImage: "list.clipboard", description: Strings.emptyDetails)
+                    .frame(height: 420)
+                    .listRowSeparator(.hidden)
+            } else {
+                items
+            }
         }
     }
 
     private var items: some View {
         ForEach(lists, id: \.self) { list in
             Button {
-                viewModel.navigate(to: .topic(list))
+                onSelection(list)
             } label: {
                 Label {
                     Text(list.title)
diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarTagsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarTagsSection.swift
index 7dc0e9bcced4..918b4700dda7 100644
--- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarTagsSection.swift
+++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarTagsSection.swift
@@ -39,27 +39,29 @@ struct ReaderSidebarTagsSection: View {
         }
         .onDelete(perform: delete)
 
-        Button {
-            viewModel.navigate(.addTag)
-        } label: {
-            Label {
-                Text(Strings.addTag)
-            } icon: {
-                ReaderSidebarImage(name: "reader-menu-plus")
+        if !viewModel.menu.contains(.tags) {
+            Button {
+                viewModel.navigate(.addTag)
+            } label: {
+                Label {
+                    Text(Strings.addTag)
+                } icon: {
+                    ReaderSidebarImage(name: "reader-menu-plus")
+                }
             }
-        }
-        .listItemTint(AppColor.primary)
+            .listItemTint(AppColor.primary)
 
-        Button {
-            viewModel.navigate(.discoverTags)
-        } label: {
-            Label {
-                Text(Strings.discoverTags)
-            } icon: {
-                ReaderSidebarImage(name: "reader-menu-explorer")
+            Button {
+                viewModel.navigate(.discoverTags)
+            } label: {
+                Label {
+                    Text(Strings.discoverTags)
+                } icon: {
+                    ReaderSidebarImage(name: "reader-menu-explorer")
+                }
             }
+            .listItemTint(AppColor.primary)
         }
-        .listItemTint(AppColor.primary)
     }
 
     func delete(at offsets: IndexSet) {
diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewController.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewController.swift
index c33f945c5a40..fa4daee88c4a 100644
--- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewController.swift
+++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewController.swift
@@ -3,7 +3,7 @@ import SwiftUI
 import Combine
 import WordPressUI
 
-final class ReaderSidebarViewController: UIHostingController<AnyView> {
+class ReaderSidebarViewController: UIHostingController<AnyView> {
     let viewModel: ReaderSidebarViewModel
 
     private var viewContext: NSManagedObjectContext { ContextManager.shared.mainContext }
@@ -80,7 +80,10 @@ private struct ReaderSidebarView: View {
 
     var body: some View {
         list
-            .searchable(text: $searchText)
+            .searchable(
+                text: $searchText,
+                placement: (viewModel.isReaderAppModeEnabled && viewModel.isCompact) ? .navigationBarDrawer(displayMode: .always) : .automatic
+            )
             .toolbar {
                 EditButton()
             }
@@ -118,8 +121,8 @@ private struct ReaderSidebarView: View {
     @ViewBuilder
     private var regularContent: some View {
         Section {
-            let screens = ReaderStaticScreen.allCases
-            ForEach(ReaderStaticScreen.allCases) {
+            let screens = viewModel.menu
+            ForEach(screens) {
                 makePrimaryNavigationItem($0.localizedTitle, imageName: $0.imageName)
                     .tag(ReaderSidebarItem.main($0))
                     .listRowSeparator((viewModel.isCompact && $0 != screens.last) ? .visible : .hidden, edges: .bottom)
@@ -140,14 +143,16 @@ private struct ReaderSidebarView: View {
             }
         }
         makeSection(Strings.subscriptions, isExpanded: $isSectionSubscriptionsExpanded) {
-            Label {
-                Text(Strings.subscriptions)
-            } icon: {
-                ReaderSidebarImage(name: "reader-menu-subscriptions")
-            }
+            if !viewModel.menu.contains(.subscrtipions) {
+                Label {
+                    Text(Strings.subscriptions)
+                } icon: {
+                    ReaderSidebarImage(name: "reader-menu-subscriptions")
+                }
                 .tag(ReaderSidebarItem.allSubscriptions)
                 .listItemTint(AppColor.primary)
                 .withDisabledSelection(isEditing)
+            }
 
             ReaderSidebarSubscriptionsSection(viewModel: viewModel)
                 .environment(\.siteIconBackgroundColor, Color(viewModel.isCompact ? .secondarySystemBackground : .systemBackground))
diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewModel.swift
index feea2153509d..87da38874998 100644
--- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewModel.swift
+++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewModel.swift
@@ -14,14 +14,26 @@ final class ReaderSidebarViewModel: ObservableObject {
     private var isRestoringSelection = false
 
     @Published var isCompact = false
+    let isReaderAppModeEnabled: Bool
 
     var navigate: (ReaderSidebarNavigation) -> Void = { _ in }
 
+    let menu: [ReaderStaticScreen]
+
     init(menuStore: ReaderMenuStoreProtocol = ReaderMenuStore(),
-         contextManager: CoreDataStackSwift = ContextManager.shared) {
+         contextManager: CoreDataStackSwift = ContextManager.shared,
+         isReaderAppModeEnabled: Bool = false) {
         self.tabItemsStore = menuStore
         self.contextManager = contextManager
-        self.restoreSelection(defaultValue: .main(.recent))
+
+        self.isReaderAppModeEnabled = isReaderAppModeEnabled
+        if isReaderAppModeEnabled {
+            menu = [.subscrtipions, .lists, .tags, .saved, .likes]
+        } else {
+            menu = [.recent, .discover, .saved, .likes, .search]
+            restoreSelection(defaultValue: .main(.recent))
+        }
+
         self.reloadMenuIfNeeded()
     }
 
@@ -79,22 +91,28 @@ enum ReaderSidebarNavigation {
 
 /// One of the predefined main navigation areas in the reader. The app displays
 /// these even if the respective "topics" were not loaded yet.
-enum ReaderStaticScreen: String, CaseIterable, Identifiable, Hashable {
+enum ReaderStaticScreen: String, Identifiable, Hashable, CaseIterable {
     case recent
     case discover
     case saved
     case likes
     case search
+    case subscrtipions
+    case lists
+    case tags
 
     var id: ReaderStaticScreen { self }
 
     var localizedTitle: String {
         switch self {
-        case .recent: NSLocalizedString("reader.sidebar.recent", value: "Recent", comment: "Reader sidebar menu item")
-        case .discover: NSLocalizedString("reader.sidebar.discover", value: "Discover", comment: "Reader sidebar menu item")
-        case .saved: NSLocalizedString("reader.sidebar.saved", value: "Saved", comment: "Reader sidebar menu item")
-        case .likes: NSLocalizedString("reader.sidebar.likes", value: "Likes", comment: "Reader sidebar menu item")
-        case .search: NSLocalizedString("reader.sidebar.search", value: "Search", comment: "Reader sidebar menu item")
+        case .recent: SharedStrings.Reader.recent
+        case .discover: SharedStrings.Reader.discover
+        case .saved: SharedStrings.Reader.saved
+        case .likes: SharedStrings.Reader.likes
+        case .search: SharedStrings.Reader.search
+        case .subscrtipions: SharedStrings.Reader.subscriptions
+        case .lists: SharedStrings.Reader.lists
+        case .tags: SharedStrings.Reader.tags
         }
     }
 
@@ -105,6 +123,9 @@ enum ReaderStaticScreen: String, CaseIterable, Identifiable, Hashable {
         case .saved: "reader-menu-bookmark"
         case .likes: "reader-menu-star"
         case .search: "reader-menu-search"
+        case .subscrtipions: "reader-menu-subscriptions"
+        case .lists: "reader-menu-list"
+        case .tags: "reader-menu-tag"
         }
     }
 
@@ -115,6 +136,7 @@ enum ReaderStaticScreen: String, CaseIterable, Identifiable, Hashable {
         case .saved: nil
         case .likes: .likes
         case .search: nil
+        case .subscrtipions, .tags, .lists: nil
         }
     }
 
diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionsView.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionsView.swift
index 429f35f8ec46..b7ef7a12b920 100644
--- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionsView.swift
+++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionsView.swift
@@ -43,7 +43,7 @@ struct ReaderSubscriptionsView: View {
                 EditButton()
             }
         }
-        .navigationTitle(Strings.title)
+        .navigationTitle(SharedStrings.Reader.subscriptions)
         .tint(Color(UIAppColor.primary))
     }
 
@@ -62,7 +62,7 @@ struct ReaderSubscriptionsView: View {
 
     private var emptyStateView: some View {
         EmptyStateView {
-            Label(Strings.title, systemImage: "doc.text.magnifyingglass")
+            Label(SharedStrings.Reader.subscriptions, systemImage: "doc.text.magnifyingglass")
         } description: {
             Text(Strings.emptyStateDetails)
         } actions: {
@@ -132,11 +132,8 @@ struct ReaderSubscriptionsView: View {
         let ranking = StringRankedSearch(searchTerm: searchText)
         searchResults = ranking.search(in: subscriptions) { "\($0.title) \($0.siteURL)" }
     }
-
-    static var navigationTitle: String { Strings.title }
 }
 
 private enum Strings {
-    static let title = NSLocalizedString("reader.subscriptions.title", value: "Subscriptions", comment: "Navigation bar title")
     static let emptyStateDetails = NSLocalizedString("reader.subscriptions.emptyStateDetails", value: "The sites you discover and subscribe to will appear here", comment: "Empty state details")
 }


Reviews:
user: login: crazytonyli
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T01:59:52Z
user: login: kean
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T13:30:48Z

Review comments:
diff_hunk: @@ -14,14 +14,26 @@ final class ReaderSidebarViewModel: ObservableObject {
     private var isRestoringSelection = false
 
     @Published var isCompact = false
+    let isReaderModeEnabled: Bool
path: WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewModel.swift
user: login: crazytonyli
body: Does "Reader Mode" mean in the Reader app? If that's the case, should we name this property `isInReaderApp` or something to that effect?
created_at: 2025-04-14T01:56:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -14,14 +14,26 @@ final class ReaderSidebarViewModel: ObservableObject {
     private var isRestoringSelection = false
 
     @Published var isCompact = false
+    let isReaderModeEnabled: Bool
path: WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewModel.swift
user: login: kean
body: Sounds good. Let's rename it to `isReaderAppModeEnabled`. I'm planning to remove these as soon as we can.
created_at: 2025-04-14T13:30:48Z
author_association: CONTRIBUTOR

PR comments:
user: login: dangermattic
created_at: 2025-04-11T17:40:26Z
body: <!--
  0 Errors
  3 Warnings: View files have been modified,...
  0 Messages
  0 Markdowns
-->
<table>
  <thead>
    <tr>
      <th width="50"></th>
      <th width="100%" data-danger-table="true" data-kind="Warning">
          3 Warnings
      </th>
     </tr>
  </thead>
  <tbody>
    <tr>
      <td>:warning:</td>
      <td data-sticky="false">View files have been modified, but no screenshot or video is included in the pull request. Consider adding some for clarity.</td>
    </tr>
    <tr>
      <td>:warning:</td>
      <td data-sticky="false">This PR is larger than 500 lines of changes. Please consider splitting it into smaller PRs for easier and faster reviews.</td>
    </tr>
    <tr>
      <td>:warning:</td>
      <td data-sticky="false">This PR is assigned to the milestone <a href="https://github.com/wordpress-mobile/WordPress-iOS/milestone/308">25.9</a>. The due date for this milestone has already passed.<br />
Please assign it to a milestone with a later deadline or check whether the release for this milestone has already been finished.</td>
    </tr>
  </tbody>
</table>

<p align="right" data-meta="generated_by_pr-check">
  Generated by :no_entry_sign: <a href="https://danger.systems/">Danger</a>
</p>

author_association: COLLABORATOR
user: login: wpmobilebot
created_at: 2025-04-11T17:53:05Z
body: <!-- REUSE_ID: prototype-build-link-1:124902176124:ios:ff9714d0b53aac821620f9 -->

<details><summary><img align='top' src='https://raw.githubusercontent.com/buildkite/emojis/main/img-buildkite-64/wordpress.png' width='20px' alt='App Icon' />📲 You can test the changes from this Pull Request in <b>WordPress</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='7' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Fappdistribution.firebase.google.com%2Ftesterapps%2F1%3A124902176124%3Aios%3Aff9714d0b53aac821620f9%2Freleases%2F1re7g0vvo695o%3Futm_source%3Dfastlane' width='250' height='250' /></td>
  <td><b>App Name</b></td><td>WordPress</td>
</tr>
<tr><td><b>Configuration</b></td><td>Release-Alpha</td></tr>
<tr><td><b>Build Number</b></td><td><code>27309</code></td></tr>
<tr><td><b>Version</b></td><td><code>PR #24446</code></td></tr>
<tr><td><b>Bundle ID</b></td><td><code>org.wordpress.alpha</code></td></tr>
<tr><td><b>Commit</b></td><td>0e089a0874f02ef8a1f6318a0f3cc1413aa4d87b</td></tr>
<tr><td><b>Installation URL</b></td><td><a href='https://appdistribution.firebase.google.com/testerapps/1:124902176124:ios:ff9714d0b53aac821620f9/releases/1re7g0vvo695o?utm_source=fastlane'>1re7g0vvo695o</a></td></tr>
</table>
<em>Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.</em>
</details>

author_association: CONTRIBUTOR
user: login: wpmobilebot
created_at: 2025-04-11T17:53:14Z
body: <!-- REUSE_ID: prototype-build-link-1:124902176124:ios:121c494b82f283ec1620f9 -->

<details><summary><img align='top' src='https://raw.githubusercontent.com/buildkite/emojis/main/img-buildkite-64/jetpack.png' width='20px' alt='App Icon' />📲 You can test the changes from this Pull Request in <b>Jetpack</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='7' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Fappdistribution.firebase.google.com%2Ftesterapps%2F1%3A124902176124%3Aios%3A121c494b82f283ec1620f9%2Freleases%2F3gnqbhesvmm28%3Futm_source%3Dfastlane' width='250' height='250' /></td>
  <td><b>App Name</b></td><td>Jetpack</td>
</tr>
<tr><td><b>Configuration</b></td><td>Release-Alpha</td></tr>
<tr><td><b>Build Number</b></td><td><code>27309</code></td></tr>
<tr><td><b>Version</b></td><td><code>PR #24446</code></td></tr>
<tr><td><b>Bundle ID</b></td><td><code>com.jetpack.alpha</code></td></tr>
<tr><td><b>Commit</b></td><td>0e089a0874f02ef8a1f6318a0f3cc1413aa4d87b</td></tr>
<tr><td><b>Installation URL</b></td><td><a href='https://appdistribution.firebase.google.com/testerapps/1:124902176124:ios:121c494b82f283ec1620f9/releases/3gnqbhesvmm28?utm_source=fastlane'>3gnqbhesvmm28</a></td></tr>
</table>
<em>Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.</em>
</details>

author_association: CONTRIBUTOR