From b5f23e20c2ce090f6e3307866e7eb6a322a56cd2 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 21 Oct 2026 10:15:26 -0700 Subject: [PATCH] Separate code font size --- AGENTS.md | 2 +- mac/Sources/Byre/Fonts.swift | 19 ++++++++++++------- mac/Sources/Byre/Persistence.swift | 4 +++- mac/Sources/Byre/Settings.swift | 28 +++++++++++++++++++--------- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3251364..1e0e224 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,6 +50,6 @@ When the owner tells the lead "deploy byre", or anything that means the same, th ## UI look -- Two fonts, bundled from `mac/fonts/`: Atkinson Hyperlegible Next for everything, and Atkinson Hyperlegible Mono only for text whose columns matter: code (blocks and inline), diffs, file contents, the terminal, raw tool input and output, and shell commands. Both follow the one font size setting. +- Two fonts, bundled from `mac/fonts/`: Atkinson Hyperlegible Next for everything, and Atkinson Hyperlegible Mono only for text whose columns matter: code (blocks and inline), diffs, file contents, the terminal, raw tool input and output, and shell commands. Next follows the text size setting and Mono the code size setting. - High contrast means readable text, not harshness. Body text is at least 7:1 against its background and secondary text at least 4.5:1, on soft backgrounds (off-white, dark slate; never pure black or white). Keep the frame quiet: 1px borders in a subtle tone, no dashed or heavy borders, no inverted blocks for selection, colour used sparingly for state and accent. The palette lives in `mac/Sources/Byre/Palette.swift`; change it there. - Never show agent cost, turn duration, or turn counts anywhere in the UI. They stay in the event log for the API, not on screen. diff --git a/mac/Sources/Byre/Fonts.swift b/mac/Sources/Byre/Fonts.swift index fde4aea..6f859e5 100644 --- a/mac/Sources/Byre/Fonts.swift +++ b/mac/Sources/Byre/Fonts.swift @@ -11,24 +11,29 @@ final class FontSize { static let range = 9...20 private(set) var body = PrefsRecord.defaultFontSize + private(set) var code = PrefsRecord.defaultFontSize private init() { load() } func load() { - body = record()?.fontSize ?? PrefsRecord.defaultFontSize + let r = record() + body = r?.fontSize ?? PrefsRecord.defaultFontSize + code = r?.codeFontSize ?? PrefsRecord.defaultFontSize } - func set(_ size: Int) { + func set(body: Int, code: Int) { if let r = record() { - r.fontSize = size + r.fontSize = body + r.codeFontSize = code r.saved = Date() } else { - persistence.insert(PrefsRecord(fontSize: size)) + persistence.insert(PrefsRecord(fontSize: body, codeFontSize: code)) } saveRecords() - body = size + self.body = body + self.code = code } private func record() -> PrefsRecord? { @@ -52,10 +57,10 @@ enum Fonts { private static let fonts = Mutex<[String: CTFont]>([:]) - // Call sites give sizes relative to a 13pt body; the user's font size shifts them all. + // Call sites give sizes relative to a 13pt body; the user's text or code size shifts them. @MainActor private static func cached(_ size: CGFloat, _ weight: CGFloat, _ italic: Bool, _ mono: Bool) -> CTFont { - let size = size + CGFloat(FontSize.shared.body - 13) + let size = size + CGFloat((mono ? FontSize.shared.code : FontSize.shared.body) - 13) let key = "\(size) \(weight) \(italic) \(mono)" return fonts.withLock { fonts in if let f = fonts[key] { diff --git a/mac/Sources/Byre/Persistence.swift b/mac/Sources/Byre/Persistence.swift index dd6f0d4..a5ba882 100644 --- a/mac/Sources/Byre/Persistence.swift +++ b/mac/Sources/Byre/Persistence.swift @@ -43,10 +43,12 @@ final class PrefsRecord { static let defaultFontSize = 12 var fontSize = PrefsRecord.defaultFontSize + var codeFontSize = PrefsRecord.defaultFontSize var saved = Date.distantPast - init(fontSize: Int) { + init(fontSize: Int, codeFontSize: Int) { self.fontSize = fontSize + self.codeFontSize = codeFontSize saved = Date() } } diff --git a/mac/Sources/Byre/Settings.swift b/mac/Sources/Byre/Settings.swift index 3a3a5c9..b36a2ac 100644 --- a/mac/Sources/Byre/Settings.swift +++ b/mac/Sources/Byre/Settings.swift @@ -28,10 +28,15 @@ struct SettingsView: View { .fixedSize(horizontal: false, vertical: true) ServerColorPicker() heading("Font size") - Text("The size of body text, on every Mac you use. Other text grows and shrinks with it.") + Text("The size of body text and of code, on every Mac you use. Other text grows and shrinks with them.") .foregroundStyle(Palette.muted) .fixedSize(horizontal: false, vertical: true) - FontSizeStepper() + FontSizeStepper(label: "Text", size: FontSize.shared.body) { n in + FontSize.shared.set(body: n, code: FontSize.shared.code) + } + FontSizeStepper(label: "Code", size: FontSize.shared.code) { n in + FontSize.shared.set(body: FontSize.shared.body, code: n) + } heading("Notifications") DeviceNotifications() PrefsBox() @@ -98,21 +103,26 @@ private struct ServerColorPicker: View { } private struct FontSizeStepper: View { + let label: String + let size: Int + let set: (Int) -> Void + var body: some View { - let fonts = FontSize.shared HStack(spacing: 8) { + Text(label) + .frame(width: 48, alignment: .leading) Button("−") { - fonts.set(fonts.body - 1) + set(size - 1) } .buttonStyle(WebButtonStyle()) - .disabled(fonts.body <= FontSize.range.lowerBound) - Text("\(fonts.body) pt") + .disabled(size <= FontSize.range.lowerBound) + Text("\(size) pt") .monospacedDigit() Button("+") { - fonts.set(fonts.body + 1) + set(size + 1) } .buttonStyle(WebButtonStyle()) - .disabled(fonts.body >= FontSize.range.upperBound) + .disabled(size >= FontSize.range.upperBound) } .padding(.top, 8) } @@ -123,7 +133,7 @@ private struct SyncState: View { TimelineView(.periodic(from: .now, by: 30)) { _ in if let sync = Servers.shared.sync { if sync.ok { - Text("This Mac shares its servers, window colors, font size, drafts and task visits through iCloud. Last synced \(ago(sync.at)).") + Text("This Mac shares its servers, window colors, font sizes, drafts and task visits through iCloud. Last synced \(ago(sync.at)).") .fixedSize(horizontal: false, vertical: true) } else { Text("iCloud sync is failing on this Mac, so changes made here aren't reaching your other Macs. Failed \(ago(sync.at)): \(sync.error ?? "")")