Skip to content

Accessibility: large-text options for the app chrome #662

Description

@byronferguson

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)

  1. 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.
  2. (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

  • A new Accessibility section appears in Settings.
  • Changing Chrome Text Size live-resizes sidebar, tab bar, toolbar, and Settings text — but leaves the terminal surface font unchanged.
  • The choice persists across app restarts and older settings files decode without error.
  • No hardcoded font sizes introduced; changes flow through Dynamic Type (per AGENTS.md).

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestreadyApproved for a pull request. Added by a maintainer once an issue is triaged.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions