diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift index 81726b541..60b6e5820 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift @@ -159,16 +159,18 @@ struct WebReaderContainerView: View { #endif } - var webPreferencesPopoverView: some View { - WebPreferencesPopoverView( - updateFontFamilyAction: { updateFontFamilyActionID = UUID() }, - updateFontAction: { updateFontActionID = UUID() }, - updateTextContrastAction: { updateTextContrastActionID = UUID() }, - updateMaxWidthAction: { updateMaxWidthActionID = UUID() }, - updateLineHeightAction: { updateLineHeightActionID = UUID() }, - dismissAction: { showPreferencesPopover = false } - ) - } + #if os(iOS) + var webPreferencesPopoverView: some View { + WebPreferencesPopoverView( + updateFontFamilyAction: { updateFontFamilyActionID = UUID() }, + updateFontAction: { updateFontActionID = UUID() }, + updateTextContrastAction: { updateTextContrastActionID = UUID() }, + updateMaxWidthAction: { updateMaxWidthActionID = UUID() }, + updateLineHeightAction: { updateLineHeightActionID = UUID() }, + dismissAction: { showPreferencesPopover = false } + ) + } + #endif var body: some View { ZStack { @@ -243,11 +245,6 @@ struct WebReaderContainerView: View { .formSheet(isPresented: $showPreferencesPopover, useSmallDetent: false) { webPreferencesPopoverView } - #else - .sheet(isPresented: $showPreferencesPopover) { - webPreferencesPopoverView - .frame(minWidth: 400, minHeight: 400) - } #endif .onDisappear { // Clear the shared webview content when exiting diff --git a/apple/OmnivoreKit/Sources/Views/FontSizeAdjustmentPopoverView.swift b/apple/OmnivoreKit/Sources/Views/FontSizeAdjustmentPopoverView.swift index bca934802..654a82b98 100644 --- a/apple/OmnivoreKit/Sources/Views/FontSizeAdjustmentPopoverView.swift +++ b/apple/OmnivoreKit/Sources/Views/FontSizeAdjustmentPopoverView.swift @@ -24,169 +24,205 @@ public enum WebFont: String, CaseIterable { } } -public struct WebPreferencesPopoverView: View { - let updateFontFamilyAction: () -> Void - let updateFontAction: () -> Void - let updateTextContrastAction: () -> Void - let updateMaxWidthAction: () -> Void - let updateLineHeightAction: () -> Void - let dismissAction: () -> Void +#if os(iOS) + public struct WebPreferencesPopoverView: View { + let updateFontFamilyAction: () -> Void + let updateFontAction: () -> Void + let updateTextContrastAction: () -> Void + let updateMaxWidthAction: () -> Void + let updateLineHeightAction: () -> Void + let dismissAction: () -> Void - static let preferredWebFontSizeKey = UserDefaultKey.preferredWebFontSize.rawValue - #if os(macOS) - @AppStorage(preferredWebFontSizeKey) var storedFontSize = Int(NSFont.userFont(ofSize: 16)?.pointSize ?? 16) - #else - @AppStorage(preferredWebFontSizeKey) var storedFontSize: Int = UITraitCollection.current.preferredWebFontSize - #endif + @AppStorage(UserDefaultKey.preferredWebFontSize.rawValue) var storedFontSize: Int = + UITraitCollection.current.preferredWebFontSize + @AppStorage(UserDefaultKey.preferredWebLineSpacing.rawValue) var storedLineSpacing = 150 + @AppStorage(UserDefaultKey.preferredWebMaxWidthPercentage.rawValue) var storedMaxWidthPercentage = 100 + @AppStorage(UserDefaultKey.preferredWebFont.rawValue) var preferredFont = WebFont.inter.rawValue + @AppStorage(UserDefaultKey.prefersHighContrastWebFont.rawValue) var prefersHighContrastText = true - @AppStorage(UserDefaultKey.preferredWebLineSpacing.rawValue) var storedLineSpacing = 150 - @AppStorage(UserDefaultKey.preferredWebMaxWidthPercentage.rawValue) var storedMaxWidthPercentage = 100 - @AppStorage(UserDefaultKey.preferredWebFont.rawValue) var preferredFont = WebFont.inter.rawValue - @AppStorage(UserDefaultKey.prefersHighContrastWebFont.rawValue) var prefersHighContrastText = true - - public init( - updateFontFamilyAction: @escaping () -> Void, - updateFontAction: @escaping () -> Void, - updateTextContrastAction: @escaping () -> Void, - updateMaxWidthAction: @escaping () -> Void, - updateLineHeightAction: @escaping () -> Void, - dismissAction: @escaping () -> Void - ) { - self.updateFontFamilyAction = updateFontFamilyAction - self.updateFontAction = updateFontAction - self.updateTextContrastAction = updateTextContrastAction - self.updateMaxWidthAction = updateMaxWidthAction - self.updateLineHeightAction = updateLineHeightAction - self.dismissAction = dismissAction - } - - var fontList: some View { - List { - ForEach(WebFont.allCases, id: \.self) { font in - Button( - action: { - preferredFont = font.rawValue - updateFontFamilyAction() - }, - label: { - HStack { - Text(font.displayValue).foregroundColor(.appGrayTextContrast) - Spacer() - if font.rawValue == preferredFont { - Image(systemName: "checkmark").foregroundColor(.appGrayTextContrast) - } - } - } - ) - } + public init( + updateFontFamilyAction: @escaping () -> Void, + updateFontAction: @escaping () -> Void, + updateTextContrastAction: @escaping () -> Void, + updateMaxWidthAction: @escaping () -> Void, + updateLineHeightAction: @escaping () -> Void, + dismissAction: @escaping () -> Void + ) { + self.updateFontFamilyAction = updateFontFamilyAction + self.updateFontAction = updateFontAction + self.updateTextContrastAction = updateTextContrastAction + self.updateMaxWidthAction = updateMaxWidthAction + self.updateLineHeightAction = updateLineHeightAction + self.dismissAction = dismissAction } - .listStyle(.plain) - #if os(iOS) - .navigationBarTitleDisplayMode(.inline) - #endif - .navigationTitle("Reader Font") - } - public var body: some View { - NavigationView { - ScrollView(showsIndicators: false) { - VStack(alignment: .center) { - VStack { - LabelledStepper( - labelText: "Font Size:", - onIncrement: { - storedFontSize = min(storedFontSize + 2, 28) - updateFontAction() - }, - onDecrement: { - storedFontSize = max(storedFontSize - 2, 10) - updateFontAction() - } - ) - - LabelledStepper( - labelText: "Margin:", - onIncrement: { - storedMaxWidthPercentage = max(storedMaxWidthPercentage - 10, 40) - updateMaxWidthAction() - }, - onDecrement: { - storedMaxWidthPercentage = min(storedMaxWidthPercentage + 10, 100) - updateMaxWidthAction() - } - ) - - LabelledStepper( - labelText: "Line Spacing:", - onIncrement: { - storedLineSpacing = min(storedLineSpacing + 25, 300) - updateLineHeightAction() - }, - onDecrement: { - storedLineSpacing = max(storedLineSpacing - 25, 100) - updateLineHeightAction() - } - ) - - Toggle("High Contrast Text:", isOn: $prefersHighContrastText) - .frame(height: 40) - .padding(.trailing, 6) - .onChange(of: prefersHighContrastText) { _ in - updateTextContrastAction() - } - - HStack { - NavigationLink(destination: fontList) { - Text("Change Reader Font") - } - Image(systemName: "chevron.right") - Spacer() - } - .frame(height: 40) - - Spacer() - } - } - } - .padding() - .navigationTitle("Reader Preferences") - #if os(iOS) - .navigationBarTitleDisplayMode(.inline) - #endif - .toolbar { - ToolbarItem(placement: .barTrailing) { + var fontList: some View { + List { + ForEach(WebFont.allCases, id: \.self) { font in Button( - action: dismissAction, - label: { Text("Done").foregroundColor(.appGrayTextContrast).padding() } + action: { + preferredFont = font.rawValue + updateFontFamilyAction() + }, + label: { + HStack { + Text(font.displayValue).foregroundColor(.appGrayTextContrast) + Spacer() + if font.rawValue == preferredFont { + Image(systemName: "checkmark").foregroundColor(.appGrayTextContrast) + } + } + } ) } } + .listStyle(.plain) + .navigationBarTitleDisplayMode(.inline) + .navigationTitle("Reader Font") } - #if os(iOS) + + public var body: some View { + NavigationView { + ScrollView(showsIndicators: false) { + VStack(alignment: .center) { + VStack { + LabelledStepper( + labelText: "Font Size:", + onIncrement: { + storedFontSize = min(storedFontSize + 2, 28) + updateFontAction() + }, + onDecrement: { + storedFontSize = max(storedFontSize - 2, 10) + updateFontAction() + } + ) + + LabelledStepper( + labelText: "Margin:", + onIncrement: { + storedMaxWidthPercentage = max(storedMaxWidthPercentage - 10, 40) + updateMaxWidthAction() + }, + onDecrement: { + storedMaxWidthPercentage = min(storedMaxWidthPercentage + 10, 100) + updateMaxWidthAction() + } + ) + + LabelledStepper( + labelText: "Line Spacing:", + onIncrement: { + storedLineSpacing = min(storedLineSpacing + 25, 300) + updateLineHeightAction() + }, + onDecrement: { + storedLineSpacing = max(storedLineSpacing - 25, 100) + updateLineHeightAction() + } + ) + + Toggle("High Contrast Text:", isOn: $prefersHighContrastText) + .frame(height: 40) + .padding(.trailing, 6) + .onChange(of: prefersHighContrastText) { _ in + updateTextContrastAction() + } + + HStack { + NavigationLink(destination: fontList) { + Text("Change Reader Font") + } + Image(systemName: "chevron.right") + Spacer() + } + .frame(height: 40) + + Spacer() + } + } + } + .padding() + .navigationTitle("Reader Preferences") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .barTrailing) { + Button( + action: dismissAction, + label: { Text("Done").foregroundColor(.appGrayTextContrast).padding() } + ) + } + } + } .navigationViewStyle(.stack) - #endif - .accentColor(.appGrayTextContrast) + .accentColor(.appGrayTextContrast) + } } -} -struct LabelledStepper: View { - let labelText: String - let onIncrement: () -> Void - let onDecrement: () -> Void + struct LabelledStepper: View { + let labelText: String + let onIncrement: () -> Void + let onDecrement: () -> Void - var body: some View { - HStack(alignment: .center, spacing: 0) { - Text(labelText) - Spacer() - HStack(spacing: 0) { + var body: some View { + HStack(alignment: .center, spacing: 0) { + Text(labelText) + Spacer() + HStack(spacing: 0) { + Button( + action: onDecrement, + label: { + Image(systemName: "minus") + .foregroundColor(.systemLabel) + .padding() + } + ) + .frame(width: 55, height: 40, alignment: .center) + Divider() + .frame(height: 30) + .background(Color.systemLabel) + Button( + action: onIncrement, + label: { + Image(systemName: "plus") + .foregroundColor(.systemLabel) + .padding() + } + ) + .frame(width: 55, height: 40, alignment: .center) + } + .background(Color.appButtonBackground) + .cornerRadius(8) + } + } + } + + public struct FontSizeAdjustmentPopoverView: View { + let increaseFontAction: () -> Void + let decreaseFontAction: () -> Void + + public init( + increaseFontAction: @escaping () -> Void, + decreaseFontAction: @escaping () -> Void + ) { + self.increaseFontAction = increaseFontAction + self.decreaseFontAction = decreaseFontAction + } + + @AppStorage(UserDefaultKey.preferredWebFontSize.rawValue) var storedFontSize: Int = + UITraitCollection.current.preferredWebFontSize + + public var body: some View { + HStack(alignment: .center, spacing: 0) { Button( - action: onDecrement, + action: { + storedFontSize = max(storedFontSize - 2, 10) + decreaseFontAction() + }, label: { Image(systemName: "minus") - #if os(iOS) .foregroundColor(.systemLabel) .padding() - #endif } ) .frame(width: 55, height: 40, alignment: .center) @@ -194,75 +230,18 @@ struct LabelledStepper: View { .frame(height: 30) .background(Color.systemLabel) Button( - action: onIncrement, + action: { + storedFontSize = min(storedFontSize + 2, 28) + increaseFontAction() + }, label: { Image(systemName: "plus") - #if os(iOS) .foregroundColor(.systemLabel) .padding() - #endif } ) .frame(width: 55, height: 40, alignment: .center) } - .background(Color.appButtonBackground) - .cornerRadius(8) } } -} - -public struct FontSizeAdjustmentPopoverView: View { - let increaseFontAction: () -> Void - let decreaseFontAction: () -> Void - - public init( - increaseFontAction: @escaping () -> Void, - decreaseFontAction: @escaping () -> Void - ) { - self.increaseFontAction = increaseFontAction - self.decreaseFontAction = decreaseFontAction - } - - static let preferredWebFontSizeKey = UserDefaultKey.preferredWebFontSize.rawValue - #if os(macOS) - @AppStorage(preferredWebFontSizeKey) var storedFontSize = Int(NSFont.userFont(ofSize: 16)?.pointSize ?? 16) - #else - @AppStorage(preferredWebFontSizeKey) var storedFontSize: Int = UITraitCollection.current.preferredWebFontSize - #endif - - public var body: some View { - HStack(alignment: .center, spacing: 0) { - Button( - action: { - storedFontSize = max(storedFontSize - 2, 10) - decreaseFontAction() - }, - label: { - Image(systemName: "minus") - #if os(iOS) - .foregroundColor(.systemLabel) - .padding() - #endif - } - ) - .frame(width: 55, height: 40, alignment: .center) - Divider() - .frame(height: 30) - .background(Color.systemLabel) - Button( - action: { - storedFontSize = min(storedFontSize + 2, 28) - increaseFontAction() - }, - label: { - Image(systemName: "plus") - #if os(iOS) - .foregroundColor(.systemLabel) - .padding() - #endif - } - ) - .frame(width: 55, height: 40, alignment: .center) - } - } -} +#endif