Summary
Add an Accessibility section to the Settings window with 1–2 large-text options that scale the app chrome — the SwiftUI UI (sidebar worktree list, tab bar, toolbar labels, Settings panes) — independently of the terminal surface.
This is chrome-only. The Ghostty terminal surface already has its own font-size zoom, so this request explicitly does not touch terminal rendering.
Motivation
The app chrome is currently sized by the system default only. Users on high-resolution displays, or with low vision, have no in-app way to enlarge the sidebar/tab/toolbar text without changing the OS-wide display scale (which affects everything, including the terminal). AGENTS.md already mandates "Use Dynamic Type, avoid hardcoded font sizes", so the chrome is well-positioned to respond to a Dynamic Type override.
Proposed options (1–2, keep it minimal)
- Chrome Text Size — a segmented / stepper control with a small set of discrete choices, e.g.
Default, Large, Extra Large, mapped to DynamicTypeSize values (.large → .xLarge → .xxLarge) applied to the chrome view hierarchy.
- (optional second) Bold Chrome Text — a toggle that applies
.fontWeight(.semibold)/legibility weight to chrome labels for users who need higher contrast/weight rather than raw size.
Both persist as global settings and take effect live.
Implementation sketch
- Add an
Accessibility case to the Settings section list and a matching AccessibilitySettingsView (mirror the existing AppearanceSettingsView pattern under SupacodeSettingsFeature/Views/).
- Add fields to
GlobalSettings (SupacodeSettingsShared/Models/GlobalSettings.swift) — e.g. chromeTextSize: ChromeTextSize (new enum in SupacodeSettingsShared/Models) and optional boldChromeText: Bool — with decodeIfPresent defaults so existing settings files migrate cleanly.
- Surface the corresponding state in
SettingsFeature.State and bind it in the new view.
- Apply the setting to the chrome root by injecting
.dynamicTypeSize(...) (and, if adopted, a legibility/weight modifier) on the main window's chrome hierarchy — scoped so it does not propagate into the Ghostty surface view.
Acceptance criteria
Non-goals
- Changing the terminal surface font size (already handled by Ghostty zoom).
- A free-form numeric point-size field — keep it to a small set of discrete, system-mapped options.
Summary
Add an Accessibility section to the Settings window with 1–2 large-text options that scale the app chrome — the SwiftUI UI (sidebar worktree list, tab bar, toolbar labels, Settings panes) — independently of the terminal surface.
This is chrome-only. The Ghostty terminal surface already has its own font-size zoom, so this request explicitly does not touch terminal rendering.
Motivation
The app chrome is currently sized by the system default only. Users on high-resolution displays, or with low vision, have no in-app way to enlarge the sidebar/tab/toolbar text without changing the OS-wide display scale (which affects everything, including the terminal). AGENTS.md already mandates "Use Dynamic Type, avoid hardcoded font sizes", so the chrome is well-positioned to respond to a Dynamic Type override.
Proposed options (1–2, keep it minimal)
Default,Large,Extra Large, mapped toDynamicTypeSizevalues (.large→.xLarge→.xxLarge) applied to the chrome view hierarchy..fontWeight(.semibold)/legibility weight to chrome labels for users who need higher contrast/weight rather than raw size.Both persist as global settings and take effect live.
Implementation sketch
Accessibilitycase to the Settings section list and a matchingAccessibilitySettingsView(mirror the existingAppearanceSettingsViewpattern underSupacodeSettingsFeature/Views/).GlobalSettings(SupacodeSettingsShared/Models/GlobalSettings.swift) — e.g.chromeTextSize: ChromeTextSize(new enum inSupacodeSettingsShared/Models) and optionalboldChromeText: Bool— withdecodeIfPresentdefaults so existing settings files migrate cleanly.SettingsFeature.Stateand bind it in the new view..dynamicTypeSize(...)(and, if adopted, a legibility/weight modifier) on the main window's chrome hierarchy — scoped so it does not propagate into the Ghostty surface view.Acceptance criteria
Non-goals