- Add 10 new fonts (Literata, Merriweather, Source Serif, Lato, Montserrat, Source Sans) - Support Apple system fonts and Google Fonts (OFL 1.1 licensed) - Extend FontFamily enum with new fonts and categories - Update FontSettingsViewModel and WebView with font support - Force WebView reload when font settings change - Refactor OfflineSyncManager with protocol and improved error handling - Add test mocks and OfflineSyncManagerTests with 9 test cases - Add OpenSourceLicensesView and FontDebugView - Bump build number - Update localization strings
84 lines
2.5 KiB
Swift
84 lines
2.5 KiB
Swift
//
|
|
// FontSettingsView.swift
|
|
// readeck
|
|
//
|
|
// Created by Ilyas Hallak on 29.06.25.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct FontSettingsView: View {
|
|
@State private var viewModel: FontSettingsViewModel
|
|
|
|
init(viewModel: FontSettingsViewModel = FontSettingsViewModel()) {
|
|
self.viewModel = viewModel
|
|
}
|
|
|
|
var body: some View {
|
|
Group {
|
|
Section {
|
|
Picker("Font family", selection: $viewModel.selectedFontFamily) {
|
|
ForEach(FontFamily.allCases, id: \.self) { family in
|
|
Text(family.displayName).tag(family)
|
|
}
|
|
}
|
|
.onChange(of: viewModel.selectedFontFamily) {
|
|
Task {
|
|
await viewModel.saveFontSettings()
|
|
}
|
|
}
|
|
|
|
Text("font.web.match.hint".localized)
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
|
|
Picker("Font size", selection: $viewModel.selectedFontSize) {
|
|
ForEach(FontSize.allCases, id: \.self) { size in
|
|
Text(size.displayName).tag(size)
|
|
}
|
|
}
|
|
.pickerStyle(.segmented)
|
|
.onChange(of: viewModel.selectedFontSize) {
|
|
Task {
|
|
await viewModel.saveFontSettings()
|
|
}
|
|
}
|
|
} header: {
|
|
Text("Font Settings")
|
|
}
|
|
|
|
Section {
|
|
VStack(alignment: .leading, spacing: 6) {
|
|
Text("readeck Bookmark Title")
|
|
.font(viewModel.previewTitleFont)
|
|
.fontWeight(.semibold)
|
|
.lineLimit(1)
|
|
|
|
Text("This is how your bookmark descriptions and article text will appear in the app. The quick brown fox jumps over the lazy dog.")
|
|
.font(viewModel.previewBodyFont)
|
|
.lineLimit(3)
|
|
|
|
Text("12 min • Today • example.com")
|
|
.font(viewModel.previewCaptionFont)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
.padding(.vertical, 4)
|
|
} header: {
|
|
Text("Preview")
|
|
}
|
|
}
|
|
.task {
|
|
await viewModel.loadFontSettings()
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
List {
|
|
FontSettingsView(viewModel: .init(
|
|
factory: MockUseCaseFactory())
|
|
)
|
|
}
|
|
.listStyle(.insetGrouped)
|
|
}
|