uttrflow / uttrflow/uttrflow-swift
The palette ignores Increase Contrast: hairlines stay at 1.2–1.3:1 and nothing resolves a high-contrast appearance
- Dominant language
- Swift
- Stars
- 4
- Forks
- 17
- Avg merge
- 3h 32m
- Merged PRs (30d)
- 277
Description
## What happens
When a user turns on **Increase Contrast** (System Settings, Accessibility, Display), every colour Uttrflow draws stays the same. The palette resolves a colour by appearance, and only as light or dark:
- `NSColor.orbit(dark:light:)` (`Sources/Uttrflow/Main/OrbitPalette.swift:40-44`) picks between two hex values with `appearance.isDark`.
- `isDark` (`OrbitPalette.swift:88-90`) is `bestMatch(from: [.aqua, .darkAqua]) == .darkAqua`. It correctly maps the high-contrast appearances onto light or dark (pinned by `Tests/UttrflowTests/OrbitPaletteTests.swift:78-84`), but nothing asks for `.accessibilityHighContrastAqua` / `.accessibilityHighContrastDarkAqua` to get stronger values.
- Nothing in `Sources/` reads `accessibilityDisplayShouldIncreaseContrast` or SwiftUI's `colorSchemeContrast` (a grep for either returns nothing).
The colours that would need a stronger variant are the ones that are weakest now:
- hairlines `Line.separator` at 1.31:1 (light, on the card) and 1.18:1 (dark), which are the only edges of cards, keycaps and the Settings switches' off track (`SettingsControlStyles.swift:22`);
- the `Text.dim` tone at 2.2 to 2.9:1;
- the 5 to 10% white or black washes that mark a hovered or selected row (`OrbitPalette.swift:15`, `:19`).
Standard AppKit controls thicken borders and darken separators under this setting. Uttrflow's custom-drawn controls don't.
## Why it matters
People turn on Increase Contrast because they can't see low-contrast edges and greys. Uttrflow's cards, switches and selection states are drawn almost entirely with those.
## How to reproduce
Turn on System Settings, Accessibility, Display, Increase Contrast, then open the main window and Settings. The cards, row separators, switch tracks and sidebar selection look the same as with it off.
## Acceptance criteria
- `BrandTone` (or the `orbit` helpers) can carry a high-contrast value, resolved with `bestMatch(from: [.aqua, .darkAqua, .accessibilityHighContrastAqua, .accessibilityHighContrastDarkAqua])`, falling back to the ordinary value when none is given.
- At minimum the separator, the dim and muted text tones, the control fill and the selection wash get high-contrast values. Separators and control edges should reach 3:1 against their surface.
- A test in `OrbitPaletteTests.swift` resolves those colours under the two high-contrast appearances and checks they differ from, and are stronger than, the ordinary ones.
Contributor guide
Research direction
Start in Sources/Uttrflow/Main/OrbitPalette.swift, especially the BrandTone or orbit helpers and the separator, text, control-fill, and selection-wash definitions. Read Tests/UttrflowTests/OrbitPaletteTests.swift and run the existing palette tests before adding coverage for the two high-contrast appearances. Done means the specified colours resolve to stronger high-contrast values, with separators and control edges reaching 3:1 against their surfaces.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- accessibility, desktop
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 76/100